操作系统(上)

196 阅读6分钟

操作系统结构

内核

2.png 内核的功能:

  • 管理进程/线程
  • 管理内存
  • 管理硬件设备,为进程与硬件之间提供通信能力
  • 提供 系统调用 系统调用 :用户程序与操作系统间的接口

操作系统把内存分成两个区域:

  • 内核空间: 只有内核程序可访问;
  • 用户空间: 专门给应用程序使用;

1.png

内核架构

  • 宏内核: 整个内核是一个完整的程序
  • 微内核: 有一个最小版本的内核,一些模块和服务由用户态管理;
  • 混合内核: 在内核中抽象出微内核的概念,整个内核仍是一个完整程序;

内存管理

虚拟内存

1.png

进程持有的虚拟地址通过CPU芯片中的MMU(内存管理单元)的映射关系,转换成物理地址.

虚拟地址与物理地址之间的关系

内存分段

1.png

2.png

主要问题:

  • 内存碎片
  • 内存交换的效率低

内存分页

简单分页

3.png

主要问题:

32位环境,虚拟地址空间4GB,若1个页大小为4kB,则需要2^20个页;若每个页表项大小2^2B,则整个页表4MB;若有100个进程,则需要400MB的内存来存储页表.

多级分页

image.png

一级页表一定要覆盖全部虚拟地址空间;二级页表可以在需要时才创建;


多级页表虽然解决了空间的问题,但虚拟地址到物理地址的转换多了几道工序,增大了时间上的开销.

TLB(快表),根据局部性原理,把最常访问的几个页表项存储到访问速度更快的硬件Cache中. 有了TLB后,CPU寻址时会先查TLB;若没找到,再访问页表.

image.png

段页式

image.png

地址结构:短号、段内页号、页内位移;

image.png

linux内存管理

linux系统中的每个段都从0开始. 可以认为linux内存主要采用页式内存管理.

image.png

image.png


image.png

每个进程各自有独立的虚拟内存;但每个虚拟内存中的内核地址,其实关联的都是相同的物理内存;这样,进程切换到内核态后,可以很方便地访问内核空间内存.

进程与线程

进程

进程的状态

image.png

这种多个程序、交替执行的思想,就有CPU管理多个进程的初步想法。

一个完整的进程的状态变迁:

image.png

操作系统通常会把阻塞状态的进程的物理内存空间换出到硬盘;等需要再次运行时,再从硬盘换入到物理内存。

image.png

需要⼀个新的状态,来描述进程没有占⽤实际的物理内存空间的情况,这个状态就是挂起状态(进程在外存)。所以:

image.png

进程的控制结构

PCB(进程控制块) 是进程存在的唯一标识.

image.png

进程的上下文切换

进程的切换只能发生在内核态。进程的上下⽂切换不仅包含了虚拟内存、栈、全局变量等⽤户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。

image.png

线程

image.png

线程的上下文切换

  • 当两个线程不属于同⼀个进程,则切换的过程就跟进程上下⽂切换⼀样;
  • 当两个线程是属于同⼀个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;

线程的实现

  • 用户线程: 在⽤户空间实现的线程,不是由内核管理的线程,是由⽤户态的线程库来完成线程的管理;
  • 内核线程: 在内核中实现的线程,是由内核(操作系统)管理的线程;
  • 轻量级进程(LWP): 一个进程可有一个或多个LWP,每个LWP都由一个内核线程支持;每个LWP可对应一个或多个用户线程。

调度

调度原则

  • CPU利用率: 确保CPU始终是工作的状态;
  • 系统吞吐量: 单位时间内CPU完成进程的数量;
  • 周转时间: 进程运行和阻塞时间总和,越小越好;
  • 等待时间: 进程处于就绪队列的时间;
  • 响应时间: 用户提交请求到系统第一次产生响应的时间;

调度算法

先来先服务

最短作业优先

高响应比优先

image.png

时间片

最高优先级

进程的优先级可分为:

  • 静态优先级
  • 动态优先级:运行时间增加,降低优先级;就绪态的等待时间增加,升高优先级.

就绪队列出现高优先级进程:

  • 非抢占式:运行完当前进程,再选择;
  • 抢占式: 当前进程挂起,调度优先级高的进程.

多级反馈队列

image.png

  • 队列优先级越高,时间片越短.
  • 进程在当前队列规定的时间片没运行完成,会被放入下一级队列的末尾.
  • 当较高优先级队列为空,才会调度低优先级队列中的进程.如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高级的进程运行.

进程间通信

image.png

每个进程的用户空间都是独立的,不能互相访问;但它们共享内核空间,所以进程间的通信必须通过内核.

管道

匿名管道: 只存在于内存,通信单向,通信范围是存在父子关系的进程。

image.png

image.png

shell里,执行A|B时:

image.png

命名管道: 文件系统中,可以在不相关进程间相互通信.

消息队列

  • 消息队列是保存在内核中的消息链表.
  • 不适合较大数据的传输.
  • 通信过程中,存在用户态与内核态之间的数据拷贝开销:进程写入数据到内核中的消息队列;另一进程从内核中读取消息.

共享内存

共享内存的机制,就是拿出一块虚拟地址空间,映射到相同的物理内存中.

信号量

PV操作.

信号

异常情况下,需要用信号来通知进程. 主要来源有硬件来源(如Ctrl+C)和软件来源(如kill 命令). 进程间通信的唯一异步通信机制,可以在任何时候发送信号给某一进程.

Socket

跨网络与不同主机上的进程间通信.