os:进程与线程上
理解进程
进程的地址空间
进程的抽象:进程控制块
进程的用户态和内核态
五状态进程模型
五状态进程模型转化
带挂起的进程状态模型
进程调度与切换
进程调度
进程切换
进程创建、结束
父进程与子进程
线程
线程与进程的关系
几种线程类型
多线程模型
理解进程
举个栗子
程序刚开始执行时,PC的值是m,指向代码段的第一条指令。
问题:如果想要重现一个进程,那么需要保存那些东西?
答案:内存中的信息和CPU中寄存器的信息。
对进程的解释
还有文件等,如果文件被打开,那么还要保存被打开的文件的状态。
问题:用什么东西保存?答案:PCB!
进程的地址空间
分配给进程1的物理单元,进程2就不能在使用了。
逻辑地址映射为物理地址后,真正的内存分布长什么样子:
使用了逻辑地址以后,进程空间就可以大胆的从0开始了
因此想要恢复进程,还要在PCB中保存映射关系,即:页表。
进程1切换道进程2的时候并没有将进程1从内存中移出去,因此只需将页表保存下来即可。
问题1:进程结束PCB回立即销毁么? 回答:
进程的抽象:进程控制块
PCB中包含的信息
PID:进程的编号
注意:进程的地址空间就是虚拟地址空间。
进程控制块的组织
注意: 之前对于链表有个误区,其实只要在内核的PCB列表内每行后面加上地址就行,并不用在内存中新开辟一块区域。
进程的特征
进程的用户态和内核态
进程P2有一个访问外设的指令,那么执行后进程P2进入阻塞态,CPU进行进程调度至P1执行,此时外部中断信号产生,P1在用户态下响应中断,只是CPU的特权级发生变化而并没有发生地址空间的变化。因此。响应中断后占用CPU的进程依然是P1,只不过P1获取的内核空间的访问权限,此时我们称为P1处于内核态。响应中断后P1回跳转道位于内核空间中的中断服务程序出执行。
所以:就是P1完成了P2的中断请求!
注意: 并不是内核进程接管了CPU,没有内核进程一说,因为内核空间本身就会在装入是映射到进程的地址空间。
问题:所以进程1本来就被分配了一部分到内核空间的映射,只是用户态下不能使用,只是cpu切换特权级后能够访问了?
答案:完全正确,就是这个意思。
五状态进程模型
创建态
进程已经分配好了PCB,但是正在等待除了CPU意外的其他资源:例如内存等。
区分进程什么时候是创建态: 首先进程会在创建态,那就肯定说明已经有了PID以及PCB了,因为PCB是进程的唯一标识。
推出态
正常退出:进程执行完了以后的正常退出;
主动退出:进程需要外设后进入阻塞态以后的退出。
就绪态
运行态
正在占据CPU。
阻塞态
除了未占据CPU意外还需要其他的资源,例如:没有内存或者确实I/O外设。
408范围内阻塞常见情况:
五状态进程模型转化
进程创建
在os内,除了最初的初始进程,其余全部进程都是由别的进程创建的。
进程执行
进程调度:就是选择一个进程使其运行。
进程阻塞
进程抢占
进程唤醒
进程只能被别的进程或者操作系统唤醒。
其他进程间接唤醒:进程间通信。
操作系统唤醒:例如中断返回时由操作系统唤醒进程,将其设置为就绪态。
其实本质都是被os唤醒的。
问题:内核空间是共享的。
总体转化图
问:共享库也属于内核空间么?
不是,共享库是用户程序用的东西。
带挂起的进程状态模型
挂起分为:就绪挂起+阻塞挂起
五状态进程模型的前提是内存完全够用,当内存空间不足时,就会将暂时不执行的进程放入外存中。
阻塞挂起
suspend:暂停、终止
就绪挂起
从阻塞挂起到就绪挂起
进程调度与切换
进程调度
进程调度含义
进程切换
进程上下文具体解释
CPU内的各种寄存器的值、CPU状态、地址空间(页表)、
进程切换过程
进程切换时的CPU状态变化
问题1:进程切换前CPU是处于内核态还是用户态?进程切换后CPU的是处于内核态还是用户态?
内核态与内核态
问题2:进程调度发生时 CPU是内核态还是用户态? 内核态。
以“时间片调度”为例:
关键: 发生中断时并不发生进程的阻塞,除非进程自己要等待外设输入等,但是并不是说只要发生中断就会使进程阻塞。
为什么P1在进程切换后依旧是内核态?
因为要恢复P1的CPU上下文呀,而且CPU在此时已经处于内核态了。
问题:P0如果正常执行结束,也需要陷入内核态自我销毁
问题:运行时的PCB与就绪态、阻塞态的PCB有哪些区别?
区别就在于PCB里会有一个专门的进程状态值记录下此时的状态,且PCB所在的链表也不同。
自己的问题:
所以中断处理程序包括了“执行调度程序”+”进程切换程序“的流程么?
并不是,这两个是单独的流程,如果时间片并没有用完,那么就是普通的中断处理;而恰好时间片用完了,因此转入进程调度+进程切换进行处理。这两个并不是前者包含后者。
并且: 戳啦,是中断处理的时候不会发生进程调度+切换。
就是王道上说切换的时候发生了两次的上下文切换,一次是原进程调度程序,一次是调度程序新进程。但是内核空间不是已经被映射到每个进程的地址空间了么,所以调度程序也能看成是原进程的一部分吧,所以到底是发生了两次上下文切换(从原进程到新进程),还是按照王道书上的呀
答案: 首先内核空间被映射到用户进程的逻辑地址中,并不代表内核程序就是用户进程的一部分,而且内核栈与用户栈不一样,分派程序也并不知道地址具体在哪儿,因此还是会有两对程序的上下文切换。
进程调度+进程切换都是用软件执行的么? 答案:对。
执行调度程序之前需要关中断。
因此可以理解为:进程调度也是一种原语。
重点的重点: 中断处理时保存P0用户态的上下文至内核栈;执行调度程序时保存P0的内核态上下文至PCB0中;切换进程P1时,从PCB1中恢复P1的内核态上下文;中断返回时从内核栈恢复P1的用户态上下文。
中断响应与进程切换的上下文切换区别?
中断处理可能会发生特权级的切换,但是进程调度一直都在内核态下。
关键 :进程调度前一定会有中断或异常是这样吧。 答案:是的。
进程创建、结束
进程创建
所有的进程(除了首进程)全都是父进程创建子进程得来的。
因为已经有pid和PCB了,因此该进程已经存在,处于创建态。如果没有足够的资源,会将父进程阻塞掉。
因此:处于创建态的子进程的父进程处于阻塞态。
进程终止
问题: 一个进程正常运行结束了,会自己调用一个结束的系统调用么?
回答:一般用户库里会调用exit系统调用,指令的最后一条可以认为会是一个exit系统调用。
进程阻塞
进程只能通过由运行态变成阻塞态。
进程唤醒
可以是OS唤醒,又可以是其他进程间接唤醒(进程间通信)。
父进程与子进程
文件: 主要是指已经打开的文件。
管道: 父进程创建的管道。
辨析
父进程与子进程的映射关系并不一样,子进程也不能继承父进程的映射关系。
解释“复制”: 就是虚拟地址的长度与父进程一样,但是映射关系并不相同。
问题:进程最核心的特点是什么?
有自己的地址空间。
线程
举个例子
单进程的实现方法
单进程肯定没有办法实现并发,因为并发也是进程P和进程Q之间进行并发。
多进程的实现办法
多线程的解决思路
线程概念
解释“实体之间共享相同的地址空间” :线程之间拿出一个相同的虚拟地址,一定会映射到同一个物理地址。
线程概念具体解释
进程有独立的代码段、数据段等,但是线程之间是共享代码段与数据段的,且共享整个地址空间。
线程是指令执行流的最小单元,每个线程执行进程代码段中的不同代码,线程有自己独立的堆栈以及TCB(保存有不同的寄存器值),因为执行了不同指令所以要保存不同的指令执行结果,因此需要有自己单独的堆栈。
线程与进程的关系
单线程与多线程的区别
在多线程进程中,共享代码、数据、打开文件的同时,每个线程都有自己的寄存器+堆栈。
进程与线程的比较
线程的切换并不需要切换地址空间,所以切换线程与切换进程耗费的时间更多。
几种线程类型
用户级线程
内核并不知道用户级线程的存在,只知道进程的存在。
用户级线程特征:
不管线程到底是用户级线程还是内核级线程,都会有自己的TCB,只是在不在内核态下保存而已。
用户级线程的不足:
内核级线程
内核级线程特征:
混合线程
多线程模型
多对一模型:多个用户线程对应于一个内核线程
注意: 这个模型并不是多个用户线程对应于一个内核进程,而是多个用户线程对应于一个内核线程。
问题: 内核级线程模型中的内核还会有进程存在么?答案:肯定会有呀,线程只是作为一个调度的单位,但是进程是一个资源分配的单位。
一对一模型:一个用户线程对应于一个内核线程
多对多模型:多个用户级线程到多个内核级线程
多对多模型:内核级线程数量肯定 ≤ 用户级线程数量
问题:
子进程可以修改父进程传下来的资源吗? 不同的系统有不同的设计。
问题:
中断响应的时候,是关中断之前就已经是内核态了么,CPU的特权级也是有个硬件标志位标识的吧
回答:在关中断之前就已经是内核态了,有的。
暂无评论内容