CPU Management

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

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

1. 处理器

1.1. 处理器与寄存器

1. 处理器

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

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

2. 寄存器

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

用户程序可见寄存器

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

  • 数据(通用)寄存器: AXBXCXDX等
  • 地址寄存器: 索引(SIDI)栈指针(SPBP)段地址(CSDSSSES)页表寄存器等

控制和状态寄存器

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

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

**程序状态字 (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 的简图如下:

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

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也可以监控所有进程的状态以确保系统各个方面都正常运行但是相比于initsystemd提供了更加全面和强大的服务管理功能包括自动化启动停止和重启服务资源限制日志记录进程监控等等

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