os:进程与线程上

os:进程与线程上

理解进程

进程的地址空间
进程的抽象:进程控制块
进程的用户态和内核态

五状态进程模型

五状态进程模型转化
带挂起的进程状态模型

进程调度与切换

进程调度
进程切换

进程创建、结束
父进程与子进程

线程
线程与进程的关系
几种线程类型
多线程模型

理解进程

图片[1] - os:进程与线程上 - 宋马
举个栗子

程序刚开始执行时,PC的值是m,指向代码段的第一条指令。

问题:如果想要重现一个进程,那么需要保存那些东西?
图片[2] - os:进程与线程上 - 宋马
答案:内存中的信息和CPU中寄存器的信息。

对进程的解释
图片[3] - os:进程与线程上 - 宋马
还有文件等,如果文件被打开,那么还要保存被打开的文件的状态。

问题:用什么东西保存?答案:PCB!

进程的地址空间

图片[4] - os:进程与线程上 - 宋马
分配给进程1的物理单元,进程2就不能在使用了。

逻辑地址映射为物理地址后,真正的内存分布长什么样子:
图片[5] - os:进程与线程上 - 宋马
使用了逻辑地址以后,进程空间就可以大胆的从0开始了
图片[6] - os:进程与线程上 - 宋马
因此想要恢复进程,还要在PCB中保存映射关系,即:页表。
进程1切换道进程2的时候并没有将进程1从内存中移出去,因此只需将页表保存下来即可。

问题1:进程结束PCB回立即销毁么? 回答:

进程的抽象:进程控制块

PCB中包含的信息
图片[7] - os:进程与线程上 - 宋马
PID:进程的编号
注意:进程的地址空间就是虚拟地址空间。

进程控制块的组织
图片[8] - os:进程与线程上 - 宋马
注意: 之前对于链表有个误区,其实只要在内核的PCB列表内每行后面加上地址就行,并不用在内存中新开辟一块区域。

进程的特征

进程的用户态和内核态

图片[9] - os:进程与线程上 - 宋马
图片[10] - os:进程与线程上 - 宋马
进程P2有一个访问外设的指令,那么执行后进程P2进入阻塞态,CPU进行进程调度至P1执行,此时外部中断信号产生,P1在用户态下响应中断,只是CPU的特权级发生变化而并没有发生地址空间的变化。因此。响应中断后占用CPU的进程依然是P1,只不过P1获取的内核空间的访问权限,此时我们称为P1处于内核态。响应中断后P1回跳转道位于内核空间中的中断服务程序出执行。

所以:就是P1完成了P2的中断请求!

注意: 并不是内核进程接管了CPU,没有内核进程一说,因为内核空间本身就会在装入是映射到进程的地址空间。

问题:所以进程1本来就被分配了一部分到内核空间的映射,只是用户态下不能使用,只是cpu切换特权级后能够访问了?
答案:完全正确,就是这个意思。

五状态进程模型

创建态
图片[11] - os:进程与线程上 - 宋马
进程已经分配好了PCB,但是正在等待除了CPU意外的其他资源:例如内存等。

区分进程什么时候是创建态: 首先进程会在创建态,那就肯定说明已经有了PID以及PCB了,因为PCB是进程的唯一标识。

推出态
图片[12] - os:进程与线程上 - 宋马
图片[13] - os:进程与线程上 - 宋马
正常退出:进程执行完了以后的正常退出;
主动退出:进程需要外设后进入阻塞态以后的退出。

就绪态

运行态
正在占据CPU。

阻塞态
除了未占据CPU意外还需要其他的资源,例如:没有内存或者确实I/O外设。

408范围内阻塞常见情况:

五状态进程模型转化

进程创建
图片[14] - os:进程与线程上 - 宋马
在os内,除了最初的初始进程,其余全部进程都是由别的进程创建的。

进程执行
图片[15] - os:进程与线程上 - 宋马
进程调度:就是选择一个进程使其运行。

进程阻塞

进程抢占

进程唤醒
图片[16] - os:进程与线程上 - 宋马
进程只能被别的进程或者操作系统唤醒。

其他进程间接唤醒:进程间通信。

操作系统唤醒:例如中断返回时由操作系统唤醒进程,将其设置为就绪态。
其实本质都是被os唤醒的。

问题:内核空间是共享的。

总体转化图
图片[17] - os:进程与线程上 - 宋马
问:共享库也属于内核空间么?
不是,共享库是用户程序用的东西。

带挂起的进程状态模型

图片[18] - os:进程与线程上 - 宋马
挂起分为:就绪挂起+阻塞挂起

五状态进程模型的前提是内存完全够用,当内存空间不足时,就会将暂时不执行的进程放入外存中。

阻塞挂起
图片[19] - os:进程与线程上 - 宋马
suspend:暂停、终止

就绪挂起

从阻塞挂起到就绪挂起

进程调度与切换

进程调度

进程调度含义

进程切换

进程上下文具体解释
CPU内的各种寄存器的值、CPU状态、地址空间(页表)、

进程切换过程

进程切换时的CPU状态变化
问题1:进程切换前CPU是处于内核态还是用户态?进程切换后CPU的是处于内核态还是用户态?
内核态与内核态
问题2:进程调度发生时 CPU是内核态还是用户态? 内核态。

以“时间片调度”为例:

关键: 发生中断时并不发生进程的阻塞,除非进程自己要等待外设输入等,但是并不是说只要发生中断就会使进程阻塞。

图片[20] - os:进程与线程上 - 宋马
为什么P1在进程切换后依旧是内核态?
因为要恢复P1的CPU上下文呀,而且CPU在此时已经处于内核态了。

问题:P0如果正常执行结束,也需要陷入内核态自我销毁

问题:运行时的PCB与就绪态、阻塞态的PCB有哪些区别?
区别就在于PCB里会有一个专门的进程状态值记录下此时的状态,且PCB所在的链表也不同。

自己的问题:

所以中断处理程序包括了“执行调度程序”+”进程切换程序“的流程么?
并不是,这两个是单独的流程,如果时间片并没有用完,那么就是普通的中断处理;而恰好时间片用完了,因此转入进程调度+进程切换进行处理。这两个并不是前者包含后者。

并且: 戳啦,是中断处理的时候不会发生进程调度+切换。

就是王道上说切换的时候发生了两次的上下文切换,一次是原进程调度程序,一次是调度程序新进程。但是内核空间不是已经被映射到每个进程的地址空间了么,所以调度程序也能看成是原进程的一部分吧,所以到底是发生了两次上下文切换(从原进程到新进程),还是按照王道书上的呀
答案: 首先内核空间被映射到用户进程的逻辑地址中,并不代表内核程序就是用户进程的一部分,而且内核栈与用户栈不一样,分派程序也并不知道地址具体在哪儿,因此还是会有两对程序的上下文切换。

进程调度+进程切换都是用软件执行的么? 答案:对。

执行调度程序之前需要关中断。
因此可以理解为:进程调度也是一种原语。

重点的重点: 中断处理时保存P0用户态的上下文至内核栈;执行调度程序时保存P0的内核态上下文至PCB0中;切换进程P1时,从PCB1中恢复P1的内核态上下文;中断返回时从内核栈恢复P1的用户态上下文。

中断响应与进程切换的上下文切换区别?
图片[21] - os:进程与线程上 - 宋马
中断处理可能会发生特权级的切换,但是进程调度一直都在内核态下。

关键 :进程调度前一定会有中断或异常是这样吧。 答案:是的。

进程创建、结束

进程创建
所有的进程(除了首进程)全都是父进程创建子进程得来的。
图片[22] - os:进程与线程上 - 宋马
图片[23] - os:进程与线程上 - 宋马
因为已经有pid和PCB了,因此该进程已经存在,处于创建态。如果没有足够的资源,会将父进程阻塞掉。
因此:处于创建态的子进程的父进程处于阻塞态。

进程终止
图片[24] - os:进程与线程上 - 宋马
问题: 一个进程正常运行结束了,会自己调用一个结束的系统调用么?
回答:一般用户库里会调用exit系统调用,指令的最后一条可以认为会是一个exit系统调用。

进程阻塞
图片[25] - os:进程与线程上 - 宋马
进程只能通过由运行态变成阻塞态。

进程唤醒
图片[26] - os:进程与线程上 - 宋马
可以是OS唤醒,又可以是其他进程间接唤醒(进程间通信)。

父进程与子进程

图片[27] - os:进程与线程上 - 宋马
文件: 主要是指已经打开的文件。
管道: 父进程创建的管道。

辨析
图片[28] - os:进程与线程上 - 宋马
父进程与子进程的映射关系并不一样,子进程也不能继承父进程的映射关系。
解释“复制”: 就是虚拟地址的长度与父进程一样,但是映射关系并不相同。

问题:进程最核心的特点是什么?
有自己的地址空间。

线程

举个例子

单进程的实现方法
图片[29] - os:进程与线程上 - 宋马
单进程肯定没有办法实现并发,因为并发也是进程P和进程Q之间进行并发。

多进程的实现办法

多线程的解决思路

线程概念
图片[30] - os:进程与线程上 - 宋马
解释“实体之间共享相同的地址空间” :线程之间拿出一个相同的虚拟地址,一定会映射到同一个物理地址。

线程概念具体解释
图片[31] - os:进程与线程上 - 宋马
进程有独立的代码段、数据段等,但是线程之间是共享代码段与数据段的,且共享整个地址空间。
线程是指令执行流的最小单元,每个线程执行进程代码段中的不同代码,线程有自己独立的堆栈以及TCB(保存有不同的寄存器值),因为执行了不同指令所以要保存不同的指令执行结果,因此需要有自己单独的堆栈。

线程与进程的关系

单线程与多线程的区别
图片[32] - os:进程与线程上 - 宋马
在多线程进程中,共享代码、数据、打开文件的同时,每个线程都有自己的寄存器+堆栈。

进程与线程的比较
图片[33] - os:进程与线程上 - 宋马
线程的切换并不需要切换地址空间,所以切换线程与切换进程耗费的时间更多。

几种线程类型

用户级线程
图片[34] - os:进程与线程上 - 宋马
内核并不知道用户级线程的存在,只知道进程的存在。

用户级线程特征:
图片[35] - os:进程与线程上 - 宋马
图片[36] - os:进程与线程上 - 宋马
不管线程到底是用户级线程还是内核级线程,都会有自己的TCB,只是在不在内核态下保存而已。

用户级线程的不足:

内核级线程

内核级线程特征:

混合线程

多线程模型

多对一模型:多个用户线程对应于一个内核线程
图片[37] - os:进程与线程上 - 宋马
注意: 这个模型并不是多个用户线程对应于一个内核进程,而是多个用户线程对应于一个内核线程。
问题: 内核级线程模型中的内核还会有进程存在么?答案:肯定会有呀,线程只是作为一个调度的单位,但是进程是一个资源分配的单位。

一对一模型:一个用户线程对应于一个内核线程

多对多模型:多个用户级线程到多个内核级线程
图片[38] - os:进程与线程上 - 宋马
多对多模型:内核级线程数量肯定 ≤ 用户级线程数量

问题:
子进程可以修改父进程传下来的资源吗? 不同的系统有不同的设计。

问题:
中断响应的时候,是关中断之前就已经是内核态了么,CPU的特权级也是有个硬件标志位标识的吧
回答:在关中断之前就已经是内核态了,有的。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容