进程的调度
目录
1. 进程的概念
2.进程是如何被调度的
2.1描述
2.2 组织
2.3 PCB中描述的进程特征
2.4 进程调度的相关属性(接2.3)
3. 内存管理
1. 进程的概念
一个跑起来的程序就称之为进程(没跑起来就不是进程)
进程是操作系统分配资源的基本单位。
2.进程是如何被调度的
进程是一个重要的软件资源
它是由操作系统内核进行管理的
而管理主要分为两个步骤:描述和组织
2.1描述
使用一个结构体来描述进程属性,这个结构体有一个特殊的名字,叫做PCB(进程控制块)
2.2 组织
组织本质上是用一个数据结构将多个PCB给连接起来
在操作系统中是通过双向链表来对进程进行连接的
创建一个进程,本质上就是在双向链表中插入一个PCB节点;
销毁一个进程,本质上就是在双向链表中删除一个PCB节点。
我们在任务管理器中看到的进程,本质上就是遍历一次双向链表
2.3 PCB中描述的进程特征
(1)pid
pid就是进程的ID,相当于进程的身份标识符。
(2)内存指针
内存指针指向的是系统划分给自己的内存空间。
(3)文件描述符表
文件描述符表,描述了进程占有的硬盘上的文件等资源。
内存指针和文件描述符表本质上就是描述了进程持有了哪些硬件资源。
PCB除了上面三条之外,还描述了进程描述的相关属性--2.4。(下面会说)
上面描述了PCB的其中3个属性,其中有描述了进程持有的资源,资源是由操作系统来进行分配的。
其中,硬件资源、内存、网卡这类的资源相对好分配,难分配的是CPU资源
通常情况下,进程的数量时要远远大于CPU的数量的,比如我的电脑里面的CPU是12核的
而进程却有上百个,这些进程我们希望是要同时进行,那么CPU上是如何分配的呢?
是用分时复用的方法进行分配的。
其主要分为并行和并发。
并行:微观上,同一时刻,两个核心上的进程是同时进行的
并发:微观上,同一时刻,一个核心上只能运行一个进程,但是他能对进程进行快速的切换。
比如:在CPU这个核心上,先运行一个浏览器,在运行一下QQ,再运行一下画图板...... 只要切换的速度足够快(我的电脑是3.3GHz,没秒运行33亿条指令),宏观上,人是感知不到的。
小知识:程序的并行还是并发是内核进行处理的,人们感知不到,因此往往将并行和并发统称为并发。(显示声明除外)
那么CPU是如何去进行这样的操作呢?
操作系统里面有一个重要的模块调度器,就负责让有限的CPU来调度执行这么多的进程
2.4 进程调度的相关属性(接2.3)
(1) 进程的状态
下面描述一些主要的状态:
就绪状态: 随叫随到,进程随时可以在CPU上运行。
运行状态:正在运行的进程(程序),和就绪状态相似。
堵塞状态:当前这个进程短时间内无法在CPU上运行。比如:进程在进行密集的I/O操作。
对于就绪状态和运行状态,很多操作系统并不会去明确区分。
(2)优先级
进程也是有优先级的,操作系统在进行调度的时候并不是一碗水端平
(3)上下文
操作系统在进行进程间的来回切换时,需要把进程执行的“中间状态”记录好,下次这个进程到CPU上运行的时候,可以恢复到上次的状态,方便继续执行。
上面的这段操作就类似于游戏中的“存档”、“读档”
而上下文的本质就是你“存档”的内容
进程的上下文是CPU中各个寄存器的值。
寄存器:CPU内置的存储数据的模块,保存的是程序运行过程中的中间结果。
保存上下文,就是把这些CPU寄存器的值,记录保存到内存中;
恢复上下文,就是把内存中的这些寄存器的值恢复回去。
(4)记账信息
操作系统,统计每个进程在CPU上占用的时间和执行的指令数目,根据这个来决定下一阶段如何调度。
3. 内存管理
在现在的操作系统中,进程中分配的内存都是虚拟的内存
为什么要使用虚拟内存空间呢?
因为在进程中,是可能出现bug的,而这些bug可能会导致,当前这个进程访问到另一个进程的内存空间中去,此时的影响就会很严重。
如下:
如果进程1 出现了bug,将指针指向了0x7000,
那可能会由于进程1的bug吧进程2给搞毁了,为了避免这种情况的发生,针对进程所使用的的内存空间,进行“隔离”,也就是虚拟内存空间。
代码里面使用的地址,不再是真实的物理地址,而是虚拟地址,再由操作系统和专门的硬件设备去进行虚拟地址到真实地址的转换,如果出现访问越界的情况,就会及时停止进程。
如下:
当进程1 去访问0x3000的时候,MMU就会直接想进程反馈一个错误(让进程崩溃)。
这样一来进程出现了bug也不会去影响其他进程的运行。
虽然进程之间隔离了,但是有的时候还需要进程之间的相互配合。也就是进程间通信。
它的核心思路就是,开辟一块“公共空间”,让进程都可以去访问,然后在基于这块空间上去进行交互数据即可。