8.4 进程控制
进程控制
进程的控制结构
要对进程进行控制,首先就要对进程进行识别,进程本身也应该有其自身的结构。
其实,操作系统本身就是一个程序,有一句经典的话:程序 = 算法 + 数据结构,所以对于单个进程来说,可以用一种数据结构来表示它,这种数据结构称之为进程控制块PCB。
PCB是进程存在的唯一标识。
++那么这些PCB之间是如何组织的?++
通常我们使用的是链表的方式进行组织的,就是把相同状态的进程链在一起,组成各种队列。
如就绪队列和阻塞队列。
除此之外,还有索引方式,将相同状态的索引放在一个索引表里。
不过一般用的都是链表,更灵活。
进程的切换
也叫做上下文切换,一个正在运行的进程被中断,另一个就绪状态的进程进入运行状态。
一般情况下会有以下步骤:
- 首先,要保存处理器的上下文环境,将CPU程序计数器和寄存器的值保存到进程的私有堆栈中;
- 更新当前进程的PCB(包括状态变更);
- 将当前的进程移到就绪或者阻塞队列中;
- 根据调度算法,选择就绪队列中一个合适的新进程,将其更改为运行态;
- 更新内存管理的数据结构;
- 新进程内,把新进程内保存的上下文信息载入到CPU的寄存器和程序寄存器,占有CPU
++上下文切换都发生在那些场景里呢?++
- 为了保证所有的进程都可以得到公平的调度,CPU时间会被划分成一段段的时间片,这些时间片被轮流分给各个进程,当某个进程的时间片被耗尽了,就会被系统挂起,切换到其他正在等待的进程;
- 进程的系统资源不足时(比如内存),也会被挂起,等待资源满足后再运行;
- 进程被睡眠函数sleep主动挂起时;
- 有优先级更高的的进程运行时,原进程也会被挂起;
- 有硬件中断时,CPU上的进程被中断挂起,转而执行内核中的中断服务程序。