CPU Management

主要是借着记笔记 预习 巩固一下记忆

  • 处理器
  • 中断管理
  • 进程管理
  • 多线程技术
  • 处理器调度

1. 处理器

1.1. 处理器与寄存器

1. 处理器

根据维基百科的定义, 处理器的主要功能是解释计算机指令以及处理计算机软件中的数据. 更加具体地说, 处理器负责管理、调度和分配计算机系统的重要资源,并控制程序执行.

​ 上图给出了一个 CPU 的简单示意图.

2. 寄存器

​ 总的来说, 处理器中的寄存器包括三大类

用户程序可见寄存器

​ 用户程序可见寄存器可以使程序员减少访问主存储器的次数,提高指令执行的效率. 这些寄存器在所有程序 (包括应用程序和系统程序) 中均可使用, 包括:

  • 数据(通用)寄存器: AX、BX、CX、DX等
  • 地址寄存器: 索引(SI、DI)、栈指针(SP、BP)、段地址(CS、DS、SS、ES)、页表寄存器等

控制和状态寄存器

​ 控制和状态寄存器用于控制处理器的操作,主要是被具有特权的操作系统程序使用,以控制程序的执行

  • 程序计数器PC:存储将取指令的地址
  • 指令寄存器IR:存储最近使用的指令
  • 条件码CC:CPU为指令操作结果设置的位,标志正/负/零/溢出等结果
  • 标志位:中断位、中断允许位、中断屏蔽位、 处理器模式位、内存保护位、…,等

**程序状态字 (PSW) **

​ 严格来说, Program State Word 可能并不是一个或一种寄存器. 实际上, 程序运行时,其状态不断动态地变化, 如当前处于用户态还是内核态, 下一条要执行的指令位置是什么, 等等. 操作系统将程序运行时的一组动态信息汇集在一起,称为程序状态字 (PSW), 并存放在处理器的一组特殊寄存器里, 以方便系统的控制和管理.

​ 但是实际上为了方便, 我们可以设置一组控制和状态寄存器来存储PSW, 也可以专门设置一个 PSW 寄存器.

1.2. 指令与处理器模式

2. 中断管理

2.1. 中断与中断源

1. 中断, 异常与系统异常

操作系统是 “中断驱动” 的, 即中断是激活操作系统的唯一方式.

广义上, 我们称中断是一种执行过程, 即指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行, 转去执行相应的事件处理程序, 待处理完成 后再返回原程序被中断处或调度其他程序执行.

狭义上, 我们认为中断是广义中断的一个子集, 也就是指来源于处理器之外的中断事件 (与当前运行指令无关的中断事件), 如I/O中断时钟中断外部信号中断等.

狭义的中断概念引出了异常的概念: 与中断相对应地, 异常指当前运行指令引起的中断事件,如地址异常、算术异常、处理器硬件故障等.

一种特殊的异常是系统异常: 指执行 trap 指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等

中断对于操作系统具有非常重要的作用. 甚至可以说, 操作系统就是中断驱动的.

2. 中断源

处理器硬件故障中断事件: 由处理器、内存储器、总线等硬件故障引起的中断事件. 也就是坏了

程序性中断事件: 由处理器执行机器指令引起的中断事件. 算术异常(除数为零、操作数溢出), 指令异常(非法指令、用户态使用特权指令、地址越界、非法存取等):终止进程, etc.

自愿性中断事件: 由处理器执行陷入指令请求OS服务引起的中断事件. 在操作系统中又被称作系统调用.

I/O中断事件: 由外围设备报告I/O状态引起的中断事件

外部中断事件: 由外围设备发出的信号引起的中断事件

2.2. 中断系统

中断系统是计算机系统中响应和处理中断的系统,包括硬件子系统软件子系统两部分

  • 中断响应硬件子系统完成
  • 中断处理软件子系统完成

1. 中断的响应

响应中断的设计是, 在指令执行周期最后增加一个微操作. 示意图如下:

具体来说, 中断响应的具体步骤如下:

  • 发现中断源,提出中断请求: 发现中断寄存器中记录的中断 $\to$ 决定这些中断是否应该屏蔽 $\to$ 当有多个要响应的中断源时,根据规定的优先级选择一个.

  • 中断当前程序的执行: 保存当前程序的 PSW/PC 到核心栈

  • 转向操作系统的中断处理程序

2. 中断的处理

Trivially, 处理中断的程序叫做中断处理程序.

具体来说, 处理中断的过程如下 (如上图):

  • 保护未被硬件保护的处理器状态
  • 识别中断源 (通过分析被中断进程的PSW中断码字段)
  • 分别处理发生的中断事件
  • 恢复正常操作: 对于某些中断, 在处理完毕后, 直接返回刚刚被中断的进程; 对于其他一些中断, 需要中断当前进程的运行, 调整进程队列, 启动进程调度, 选择下一个执行的进程并恢复其执行.

2.3. 多中断的响应与处理

有了中断的概念之后, 我们很自然地需要几个新的概念来组织中断的进行.

  • 中断优先级: 当计算机同时检测到多个中断时, 中断装置必须按照某个顺序响应中断. 表征这个顺序的单位就是中断优先级.
  • 中断屏蔽: 当计算机检测到中断时, 中断装置通过中断屏蔽位决定是否响应已发生的中断. 也就是说, 中断装置可以选择拒绝中断.
  • 中断的嵌套: 当计算机响应中断后, 在中断处理过程中, 可以再响应其他中断. 也就是说, 中断也可以有中断.

但是实际上, 操作系统的性能攸关程序系统,且中断响应处理有硬件要求, 综合考虑到系统效率和实现代价的问题, 中断的嵌套处理应限制在一定层数内, 如3层

中断的嵌套处理机制改变了中断处理次序, 先响应的有可能后处理.

总的来说, 决定中断处理次序的因素有如下几个:

  • 中断屏蔽可以使中断装置不响应某些中断
  • 中断优先级决定了中断装置响应中断的次序
  • 中断可以嵌套处理, 但嵌套的层数应有限制
  • 中断的嵌套处理改变了中断处理的次序
两种典型的多中断响应/处理方式

3. 进程管理

3.1. 进程及其状态

1. 进程 (process)

操作系统必须全方位地管理计算机系统中运行的程序, 因此, 操作系统为正在运行的程序抽象出了一个管理实体——进程. 也就是说, 进程是为了管理程序运行所抽象出来的概念.

进程是操作系统进行资源分配和调度的一个独立单位. (比方说在内存管理中, 每个进程拥有一个LDT)

Physically, 一个进程包括五个实体部分:

  • (OS管理运行程序的) 数据结构 $P$
  • (运行程序的) 内存代码 $C$
  • (运行程序的) 内存数据 $D$
  • (运行程序的) 通用寄存器信息 $R$
  • (OS控制程序执行的) 程序状态字信息 $PSW$

2. 进程的关系

无关进程: 不同代码在不同数据集上运行
交往进程: 不同代码在相同数据集上运行
无关进程: 相同代码在不同数据集上运行

3. 进程的状态

jyy: “程序是状态机.”

一般来说, 在操作系统中, 进程的状态模型通常包括以下几种状态:

  • 就绪 (Ready) 状态:表示进程已经准备好了运行,并在等待CPU资源分配。
  • 运行 (Running) 状态:表示正在执行的进程,其占用了CPU资源。
  • 阻塞 (Blocked) 状态:表示进程因为等待某些事件的发生而被暂停,此时它不会占用CPU资源。
  • 创建 (New) 状态:表示操作系统已经创建了一个新的进程,但尚未分配任何资源给它。
  • 终止 (Terminated) 状态:表示进程已经执行完毕或被终止,此时释放了所有的资源。

但是实际上, 不同的操作系统可能会对这些状态进行微调和补充, 以满足具体的需求. 例如Windows中还有一个挂起 (Suspended) 状态,表示进程被暂停, 并且其状态信息已经保存在硬盘上, 等待恢复; 而在Unix/Linux系统中, 则将就绪和运行两个状态合并为执行 (Running) 状态, 并引入了僵尸 (Zombie) 状态, 表示进程已经完成了执行, 但其父进程还没有回收其资源.

那么在愚蠢的NJUSE@OS课件上, 我们给出了如下常见的进程状态模型 (进程三态模型):

(1) 运行态 $\to$ 等待态: 等待资源、I/O、信号

(2) 等待态 $\to$ 就绪态: 资源满足、I/O结束、 信号完成

(3) 就绪态 $\to$ 运行态: 处理器空闲时选择更高优先权进程抢占

(4) 运行态 $\to$ 就绪态: 运行时间片到、 有更高优先权进程

Physically, OS无法预期进程的数目与资源需求,计算机系统在运行过程中可能出现资源不足的情况. 因此我们引入了挂起的概念. 运行资源不足表现为性能低和死锁两种情况, 因此我们必须要采取包括如下的措施来缓解这样的情况: 剥夺某些进程的内存及其他资源, 调入OS管理的对换区, 不参加进程调度, 待适当时候再调入内存、恢复资源、参与运行. 这就是进程挂起. 加入挂起的概念之后, 我们的进程状态模型如下图所示:

3.2. 进程的数据描述

1. 进程控制块

为了描述进程的相关信息, 我们需要引入一个概念叫做进程控制块 (Process Control Block, PCB). Trivially, PCB is what describes the state and the environment information of a process. PCB 的简图如下:

借助PCB,OS可 以全面管理进程的物理实体, 刻画进程的执行现状, 控制进程的执行

PCB 结构每个部分的相关内容与表示都可以在官网的Manual上看到, 其中在 Linux 下的 ps 指令就可以展示部分进程信息. pstree 可以展示出进程的父进程和子进程.

2. 进程映像

进程映像是某一时刻进程的内容及其执行状态集合. 随着进程数量的增多, 对进程的管理/进程间的通讯变得非常复杂, 我们需要一个叫做进程映像的中间层来解决这样的问题. 进程映像是操作系统管理进程和实现进程间通信的一个重要机制,其作用包括以下几个方面:

  • 进程的创建和复制:当操作系统需要创建一个新进程时,会先将其对应的可执行文件读取到内存中,然后根据其映像信息来初始化进程的各种资源和状态;而当进程需要复制自身时(如fork操作),则可以通过复制进程映像来创建新的进程。
  • 进程的调度和切换:当一个进程被挂起或者等待某些条件时,操作系统可以将其进程映像保存到交换空间(swap space)中,以释放内存资源;而当该进程再次被激活时,可以重新加载其进程映像,并恢复其原来的执行状态。
  • 进程间通信:进程映像可以作为一种进程间通信的手段,通过共享内存、消息队列、管道等方式来传递数据和信息。在这种情况下,不同进程可以访问同一份进程映像,并在其中写入或读取所需的数据,以实现有效的进程协作。
  • 进程的调试和分析:进程映像可以帮助我们理解、调试和分析进程的运行情况。通过读取进程映像中的代码、数据和堆栈信息等,我们可以了解进程的执行状态、调用关系、内存使用情况等,并通过相应的工具进行跟踪和分析。
进程1
进程2
... ...
进程n

3. 进程上下文

进程的执行需要环境支持,包括CPU现场和Cache中的执行信息. 我们将这样的环境与进程物理实体和称为进程上下文 (Process Context), 用来刻画进程的执行情况. 具体来说, 进程上下文包括如下的几种:

  • 用户级上下文:用户程序块/用户数据区/ 用户栈/用户共享内存
  • 寄存器上下文:PSW/栈指针/通用寄存器
  • 系统级上下文:PCB/内存区表/核心栈

3.3. 进程管理的实现

Trivially, 进程管理就是如何管理操作系统的进程, 包括操作系统对进程的创建、调度、同步、通信、终止等活动进行有效地管理和协调. 具体来说, 操作系统的进程管理包括以下几个主要部分:

进程创建

  • 操作系统初始启动时会创建承担系统资源分配和控制管理的一些系统进程,同时会创建一个所有用户进程的祖先,其他用户进程实在用户程序被提价与选中运行时被创建的.
  • 操作系统通常将创建关系通过父子进程的关系来表示。
  • 创建原语:进程表加一项、申请PCB(进程控制块)并初始化、生成唯一进程标识、建立进程映像、分配各种资源、移入就绪队列、通知操作系统某些模块

进程撤销

  • 完成特定工作或出现严重错误后需要撤销,分为正常撤销和非正常撤销。
  • 产生原因:运行结束、执行非法指令、用户态执行特权指令、时间配额到、等待时间超时、越界错误、共享内存区非法使用、程序性故障等。
  • 撤销原语:从队列中移除、归还资源、撤销标识、回收PCB、移除进程表项

进程阻塞

  • 使得进程让出处理器转而等待一个事件,比如等待资源等,阻塞是同步时间.
  • 阻塞原语:保存现场信息、修改PCB、移入等待队列、调度其他进程执行

进程唤醒

  • 等待时间完成时产生一个中断,激活操作系统,在系统的控制下将被阻塞进程唤醒
  • 唤醒原语:等待队列中移出、修改PCB、移入就绪队列(该进程优先级高于运行进程触发抢占)

进程挂起

  • 出现引起挂起的事件时,系统或进程会利用挂起原语把指定进程或处于等待态的进程挂起。
  • 挂起原语:修改状态并出入相关队列、收回内存等资源送至对换区。
  • 挂起原语可以由进程自己或其他进程调起。

进程激活

  • 当系统资源尤其是内存资源充裕或请求激活进程时,系统或相关进程会调用激活原语将指定进车行激活。
  • 激活原语:分配内存,修改状态并出入相关队列。
  • 激活原语只能由其他进程调用。

其他

  • 如修改进程特权,以上是一个进程控制的流程

4. 多线程技术

4.1. 多线程环境概述

4.2. 多线程的实现技术

5. 处理器调度

5.1. 处理器调度的层次

5.2. 处理器调度算法

这篇文章讲的很好

为什么在linux中 pstree 的根节点不是init

在现代Linux系统中,根节点通常是systemd(或者systemd的一个子进程),而不是传统的init进程。这是因为systemd是一种新的初始化系统,旨在取代传统的SysVinit和Upstart等系统。相比于传统的init系统,systemd具有更快的启动速度、更好的并行处理能力、更多的可管理性和更强的安全性等优点。在systemd初始化系统中,它会作为第一个进程启动,并负责启动所有其他系统服务和进程。因此,它成为了整个系统进程树的根节点。与传统的init进程类似,systemd也可以监控所有进程的状态,以确保系统各个方面都正常运行。但是,相比于init,systemd提供了更加全面和强大的服务管理功能,包括自动化启动、停止和重启服务、资源限制、日志记录、进程监控等等。

  1. 抢占式(剥夺式)调度:当前正在运行的进程可能被操作系统中断,并转移到就绪态。处理器剥夺原则:
    1. 高优先级进程/线程可剥夺低优先级进程/线程。
    2. 运行进程/线程时间片用完后被剥夺。
  2. 非抢占式(非剥夺式)调度:一个进程一旦处于运行态,它就不断执行直到终止,或者为等待I/O或请求某些操作系统服务而阻塞自己。
  3. 与非抢占式调度相比,抢占式调度可能会导致较大的开销,但是可能对所有进程提供更好的服务,可以避免任何一个进程独占处理器太长时间