os:进程与线程上
理解进程
进程的地址空间
进程的抽象:进程控制块
进程的用户态和内核态
五状态进程模型
五状态进程模型转化
带挂起的进程状态模型
进程调度与切换
进程调度
进程切换
进程创建、结束
父进程与子进程
线程
线程与进程的关系
几种线程类型
多线程模型
理解进程
![图片[1] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/03b82e8fa95040adbe1cabd0f0f62754.png)
举个栗子

程序刚开始执行时,PC的值是m,指向代码段的第一条指令。
问题:如果想要重现一个进程,那么需要保存那些东西?
![图片[2] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/f6c3f765a4954f50b7d756dcb00ffd85.png)
答案:内存中的信息和CPU中寄存器的信息。
对进程的解释
![图片[3] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/5a42ed3dceba4348a3098e1f49a29a7d.png)
还有文件等,如果文件被打开,那么还要保存被打开的文件的状态。
问题:用什么东西保存?答案:PCB!
进程的地址空间
![图片[4] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/7735956e8f9e47b99b9a4cc957c3a621.png)
分配给进程1的物理单元,进程2就不能在使用了。
逻辑地址映射为物理地址后,真正的内存分布长什么样子:
![图片[5] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/40ff090bbe8a49e7a224d17f7ae59006.png)
使用了逻辑地址以后,进程空间就可以大胆的从0开始了
![图片[6] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/90314d98e7224a7c9ed376c90636bb86.png)
因此想要恢复进程,还要在PCB中保存映射关系,即:页表。
进程1切换道进程2的时候并没有将进程1从内存中移出去,因此只需将页表保存下来即可。
问题1:进程结束PCB回立即销毁么? 回答:
进程的抽象:进程控制块

PCB中包含的信息
![图片[7] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/f2d1351b28f24d048629e749bf948dc8.png)
PID:进程的编号
注意:进程的地址空间就是虚拟地址空间。
进程控制块的组织
![图片[8] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/73e5b3b34e5a4f1b820c350a6b0dbc7f.png)
注意: 之前对于链表有个误区,其实只要在内核的PCB列表内每行后面加上地址就行,并不用在内存中新开辟一块区域。
进程的特征

进程的用户态和内核态
![图片[9] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/581e38ffbd104466ba8fc58d1090ca08.png)
![图片[10] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/45b16830ae2246619e94b3d239d7fbee.png)
进程P2有一个访问外设的指令,那么执行后进程P2进入阻塞态,CPU进行进程调度至P1执行,此时外部中断信号产生,P1在用户态下响应中断,只是CPU的特权级发生变化而并没有发生地址空间的变化。因此。响应中断后占用CPU的进程依然是P1,只不过P1获取的内核空间的访问权限,此时我们称为P1处于内核态。响应中断后P1回跳转道位于内核空间中的中断服务程序出执行。
所以:就是P1完成了P2的中断请求!
注意: 并不是内核进程接管了CPU,没有内核进程一说,因为内核空间本身就会在装入是映射到进程的地址空间。
问题:所以进程1本来就被分配了一部分到内核空间的映射,只是用户态下不能使用,只是cpu切换特权级后能够访问了?
答案:完全正确,就是这个意思。
五状态进程模型

创建态
![图片[11] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/ef3bbc83c108484ebdfa52818b2ce2a9.png)
进程已经分配好了PCB,但是正在等待除了CPU意外的其他资源:例如内存等。
区分进程什么时候是创建态: 首先进程会在创建态,那就肯定说明已经有了PID以及PCB了,因为PCB是进程的唯一标识。
推出态
![图片[12] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/05e492752add4b77b80c1276295a8e94.png)
![图片[13] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/21b94b86fa574113995def6606019481.png)
正常退出:进程执行完了以后的正常退出;
主动退出:进程需要外设后进入阻塞态以后的退出。
就绪态

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

408范围内阻塞常见情况:

五状态进程模型转化
进程创建
![图片[14] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/dec1f07bb87143f4a062e0ec9e5cc756.png)
在os内,除了最初的初始进程,其余全部进程都是由别的进程创建的。
进程执行
![图片[15] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/c388cff888fb462b99b9959d78ea43cc.jpeg)
进程调度:就是选择一个进程使其运行。
进程阻塞

进程抢占

进程唤醒
![图片[16] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/e7e8a1fabb4248899aa1ff8d2b741b59.png)
进程只能被别的进程或者操作系统唤醒。
其他进程间接唤醒:进程间通信。
操作系统唤醒:例如中断返回时由操作系统唤醒进程,将其设置为就绪态。
其实本质都是被os唤醒的。
问题:内核空间是共享的。
总体转化图
![图片[17] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/b986e75ce44541ceb40bd5f59f6a4b54.png)
问:共享库也属于内核空间么?
不是,共享库是用户程序用的东西。

带挂起的进程状态模型
![图片[18] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/7b8cdc76cd9e406da139f9a15547d846.png)
挂起分为:就绪挂起+阻塞挂起
五状态进程模型的前提是内存完全够用,当内存空间不足时,就会将暂时不执行的进程放入外存中。
阻塞挂起
![图片[19] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/77acdfe2dc7643b691dec46ad15b4879.png)
suspend:暂停、终止
就绪挂起

从阻塞挂起到就绪挂起

进程调度与切换
进程调度
进程调度含义


进程切换

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

进程切换时的CPU状态变化
问题1:进程切换前CPU是处于内核态还是用户态?进程切换后CPU的是处于内核态还是用户态?
内核态与内核态
问题2:进程调度发生时 CPU是内核态还是用户态? 内核态。
以“时间片调度”为例:
关键: 发生中断时并不发生进程的阻塞,除非进程自己要等待外设输入等,但是并不是说只要发生中断就会使进程阻塞。
![图片[20] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/6b2b0392e5084522b3abc37cb6140298.png)
为什么P1在进程切换后依旧是内核态?
因为要恢复P1的CPU上下文呀,而且CPU在此时已经处于内核态了。
问题:P0如果正常执行结束,也需要陷入内核态自我销毁
问题:运行时的PCB与就绪态、阻塞态的PCB有哪些区别?
区别就在于PCB里会有一个专门的进程状态值记录下此时的状态,且PCB所在的链表也不同。
自己的问题:
所以中断处理程序包括了“执行调度程序”+”进程切换程序“的流程么?
并不是,这两个是单独的流程,如果时间片并没有用完,那么就是普通的中断处理;而恰好时间片用完了,因此转入进程调度+进程切换进行处理。这两个并不是前者包含后者。
并且: 戳啦,是中断处理的时候不会发生进程调度+切换。
就是王道上说切换的时候发生了两次的上下文切换,一次是原进程调度程序,一次是调度程序新进程。但是内核空间不是已经被映射到每个进程的地址空间了么,所以调度程序也能看成是原进程的一部分吧,所以到底是发生了两次上下文切换(从原进程到新进程),还是按照王道书上的呀
答案: 首先内核空间被映射到用户进程的逻辑地址中,并不代表内核程序就是用户进程的一部分,而且内核栈与用户栈不一样,分派程序也并不知道地址具体在哪儿,因此还是会有两对程序的上下文切换。
进程调度+进程切换都是用软件执行的么? 答案:对。
执行调度程序之前需要关中断。
因此可以理解为:进程调度也是一种原语。
重点的重点: 中断处理时保存P0用户态的上下文至内核栈;执行调度程序时保存P0的内核态上下文至PCB0中;切换进程P1时,从PCB1中恢复P1的内核态上下文;中断返回时从内核栈恢复P1的用户态上下文。
中断响应与进程切换的上下文切换区别?
![图片[21] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/5fb26f48e9224ad6b4d9dee1160d2a51.png)
中断处理可能会发生特权级的切换,但是进程调度一直都在内核态下。
关键 :进程调度前一定会有中断或异常是这样吧。 答案:是的。
进程创建、结束
进程创建
所有的进程(除了首进程)全都是父进程创建子进程得来的。
![图片[22] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/07fec366eeff49b18847226f10bc177a.png)
![图片[23] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/8fdab30db6fa40128961f87bce15204d.png)
因为已经有pid和PCB了,因此该进程已经存在,处于创建态。如果没有足够的资源,会将父进程阻塞掉。
因此:处于创建态的子进程的父进程处于阻塞态。
进程终止
![图片[24] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/5cc2b215df2e493685a95da94dbcdc4e.png)
问题: 一个进程正常运行结束了,会自己调用一个结束的系统调用么?
回答:一般用户库里会调用exit系统调用,指令的最后一条可以认为会是一个exit系统调用。
进程阻塞
![图片[25] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/671433b3d2f5417f97c641fde8e7de89.png)
进程只能通过由运行态变成阻塞态。
进程唤醒
![图片[26] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/cd24115bbd11428597e3b2f89314f81f.png)
可以是OS唤醒,又可以是其他进程间接唤醒(进程间通信)。
父进程与子进程
![图片[27] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/b5c423a336d04a9684da205d0e6ca799.png)
文件: 主要是指已经打开的文件。
管道: 父进程创建的管道。
辨析
![图片[28] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/445ef242ec394d3e9e86108c4d952de5.png)
父进程与子进程的映射关系并不一样,子进程也不能继承父进程的映射关系。
解释“复制”: 就是虚拟地址的长度与父进程一样,但是映射关系并不相同。
问题:进程最核心的特点是什么?
有自己的地址空间。
线程
举个例子

单进程的实现方法
![图片[29] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/a4ad87eedfe2422aae8328cf0a08d3fe.png)
单进程肯定没有办法实现并发,因为并发也是进程P和进程Q之间进行并发。
多进程的实现办法

多线程的解决思路
线程概念
![图片[30] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/a475c2c8e0d0486d86fc39cb794925eb.png)
解释“实体之间共享相同的地址空间” :线程之间拿出一个相同的虚拟地址,一定会映射到同一个物理地址。
线程概念具体解释
![图片[31] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/481672c501574e1d87bbb72b540ecb1f.png)
进程有独立的代码段、数据段等,但是线程之间是共享代码段与数据段的,且共享整个地址空间。
线程是指令执行流的最小单元,每个线程执行进程代码段中的不同代码,线程有自己独立的堆栈以及TCB(保存有不同的寄存器值),因为执行了不同指令所以要保存不同的指令执行结果,因此需要有自己单独的堆栈。
线程与进程的关系
单线程与多线程的区别
![图片[32] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/f2c47cd917db4950bc8c786a46af4ebb.png)
在多线程进程中,共享代码、数据、打开文件的同时,每个线程都有自己的寄存器+堆栈。
进程与线程的比较
![图片[33] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/b4f0064a76d84d25ae2c8ba10b1121be.png)
线程的切换并不需要切换地址空间,所以切换线程与切换进程耗费的时间更多。
几种线程类型
用户级线程
![图片[34] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/c127442b6a904872aa3f5f3660bc5c27.png)
内核并不知道用户级线程的存在,只知道进程的存在。
用户级线程特征:
![图片[35] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/dd3936a2c66d4c339bd5ff51f8f34c86.png)
![图片[36] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/0027af24d6284ab28bf063a1eb93b92f.png)
不管线程到底是用户级线程还是内核级线程,都会有自己的TCB,只是在不在内核态下保存而已。
用户级线程的不足:

内核级线程

内核级线程特征:

混合线程

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

多对多模型:多个用户级线程到多个内核级线程
![图片[38] - os:进程与线程上 - 宋马](https://pic.songma.com/blogimg/20250526/136556070aa34b73a27ab4e537a1592c.png)
多对多模型:内核级线程数量肯定 ≤ 用户级线程数量
问题:
子进程可以修改父进程传下来的资源吗? 不同的系统有不同的设计。
问题:
中断响应的时候,是关中断之前就已经是内核态了么,CPU的特权级也是有个硬件标志位标识的吧
回答:在关中断之前就已经是内核态了,有的。



















暂无评论内容