1. CPU 的管理
CPU的工作原理:
从内存中取出程序的指令, 执行程序中的指令;
1.1 多道程序
假设A 程序运行时, 遇到 IO
处理时, 为了能够执行A 程序的后续指令, 正常情况下 cpu 需要等待着IO
处理完成, 而这个等待的期间 CPU 是闲置着,
为了提高cpu 的利用率,
同时运行程序A 和程序B,
当程序A 需要处理 IO
时, 此时,跳出程序A, 去执行程序B, 这样CPU 就不需要等待着, 从而可以继续执行 指令;
1.2 进程的概念
当一个程序运行起来时, 其中包含了多个信息,比方运行到某个时间节点时, 该程序中多个寄存器的数值。
为了区别 运行中的程序和 静态程序,
将运行中的程序 定义为 进程
, 即进行中的程序。
1.3 进程五种基本状态
-
创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
-
就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
-
执行状态:进程处于就绪状态被调度后,进程进入执行状态
-
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
-
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。
如果进程运行时间片使用完也会进入就绪状态。
另外为用户观察需要,进程还有挂起和激活两种操作。挂起后进程处于静止状态进程不再被系统调用,对于操作是激活操作。
1.4 PCB 的作用
然而多道程序并发, 这样引出另外一个问题,
当cpu 从程序B 返回到 程序A 继续执行时, 应该从 程序A 的何处地方开始执行?
这就需要,当CPU从 程序A 切换出去时, 需要保存当时程序A运行的现场信息,
比如CPU 跳出时, 运行到程序A 哪个地址了, 此时程序A 中所对应的各个寄存器存放的数值为多少;
为了将 一个运行中的程序所包含的上述信息保存起来,引入了PCB的概念, 即将上述信息存放在 PCB
的数据结构中。
1.5 小结
当CPU 只执行一个 程序时, 遇到IO
处理的任务时, 此时,CPU会闲置等待着,
所以, 为了提高 CPU的利用率, CPU 同时执行 多个 程序,
从而引入 进程, PCB 数据结构 这两个重要的概念;
2. os 管理多个进程
多个进程所对应的PCB 放在不同的地方, 操作系统都知道。
2.1. 多个进程如何组织:
根据进程的 PCB, 状态, 形成不同的队列,放在不同的位置。
使用进程控制模块 PCB
, process control block, 来表示多个进程, 然后将PCB 放在不同的队列中,用状态来推进这多个进程。
2.2 多个进程之间如何切换
调度,选择下一个进程。
假设这样的场景:
某一个进程A 启动 磁盘读写了, 此时,CPU就会等待,
-
将此时进程A 的状态设置为 阻塞态;
-
将进程A 对应的PCB 放到一个 磁盘等待阻塞队列中。
调用 schedule()
函数, 在就绪队列中进行切换,则CPU 就会切换到其他进程B;
切换过程中, 需要将进程A的现场信息 保存到PCB中, 从进程B的PCB 中恢复现场出来, 具体实现;
保存进程A的现场: 便是将进程A ,此时CPU中对应的寄存器中的数值, 存放到进程A对应的PCB中。
恢复进程B的现场: 将进程B中,原始保存在PCB中的寄存器的数值 存入到 现在的CPU 寄存器中。
由于上述的操作,涉及到对CPU 中的寄存器进行操作, 所以需要使用汇编语言进行精细的控制
那么切换到另外一个进程B时, 而就绪队列中,有多个进程, 应该选取哪个进程做为下一个进程呢?
这是 涉及到调度算法。
2.3 多进程在内存中共存
为了让进程之间的 在内存中的 物理地址 互不影响,所以需要使用内存管理中的与进程相关的映射表。
由于不同的进程都是存放在内存中, 会遇到这样的问题,进程A 中 操作的内存地址, 同时也是进程B 中操作的内存地址, 则此时进程A 的操作 会影响到进程B;
为了将多进程的各自对应的地址空间 进行隔离,互不干扰。
内存管理 提供这一功能,
使得不同的进程 有对应各自不同的映射表;
即进程1的 地址100, 通过映射表, 映射到物理内存时是780;
进程2的地址100, 通过映射表2, 映射到物理内存时, 是1260;
3. 多进程之间何时切换
3.1 生产进程与消费进程
此时,
打印任务便是 生产进程;
打印进程 便是 消费进程;
由于生产者 和消费者的关系,
生产者进程会往共享空间中 写数据,
与此同时,消费者进程会往共享空间中 取数据。
3.2 进程之间的共享数据
由于多个进程之间会存在共享数据,
而进程又是在来回切换的,
在进程之间 切换执行的过程中, 为了保持 共享数据存储正确的数值;
3.3 进程的上锁
在进程A 执行到关键指令时, 这些指令会涉及共享数据;
在这段时间中, 应该给进程A 上锁
。
-
上锁后的进程A , 此时CPU 会继续执行进程A, 即此时CPU 被进程A继续占用着。
-
与此同时,其他进程不能够使用CPU, CPU 也不能够切换到其他进程。
-
直到进程A 被解锁。