class="markdown_views prism-github-gist">
进程的活动是通过在CPU上执行一系列程序和对数据进行相应操作的完成来体现的,因此
程序和数据是组成进程的实体,为了反映进程的动态特征,需要一个数据结构来描述进程本身的特性状态,调度信息以及对资源的占有等等。这个数据结构我们称之为
进程控制块(PCB)
PCB的内容
PCB主要包含下面几部分的内容:
- 进程的描述信息,比如进程的名称,标识符,
- 处理机的状态信息,当程序中断是保留此时的信息,以便CPU返回时能从断点执行
- 进程调度信息,比如阻塞原因,状态,优先级等等
- 进程控制和资源占用,同步通信机制,链接指针(指向队列中下一个进程的PCB地址)
PCB的作用:
- PCB是进程实体的一部分,是操作系统中最重要的数据结构
- 由于它的存在,使得多道程序环境下,不能独立运行的程序成为一个能独立运行的基本单位,使得程序可以并发执行
- 系统通过PCB来感知进程的存在。(换句话说,PCB是进程存在的唯一标识)
- PCB应该常驻内存
进程的组成可以用下图来表示:
而进程之间可以通过PCB中的链接指针找到下一个进程,他们彼此之间组成一个链队列:
进程控制
进程控制主要表现在对一个进程进行创建,撤销以及进程状态之间进行转换控制。
这些操作都是通过前面的原语操作执行的
进程的创建与撤销
进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还,此外,撤销父进程,则必须撤销所有的子进程。(
撤销的过程实际上就是对这棵家族树进行后序遍历的过程)
在应用中创建一个子进程的过程如下:
- 申请空白的PCB
- 初始化进程描述信息
- 为进程分配资源以及地址空间
- 将其插入就绪队列中
当进程完成后,系统会回收占用的资源,撤销进程,而引发进程撤销的情况有:进程正常结束或者异常结束,外界的干预(比如我们在任务管理器中强制停止某个进程的运行)。
- 查找需要撤销的进程的PCB
- 如果进程处于运行状态,终止进程并进行调度
- 终止子孙进程
- 归还资源
- 将它从所在的队列中移除
进程的阻塞和唤醒
. 前面我们说过,进程的阻塞是进程的一种主动的行为,但是没有解释为什么,现在我们解释一下,进程执行过程中常常会因为等待I/O或者某个事件的出现而进入阻塞状态。当处于阻塞状态的进程所等待的操作完成或者事件出现时,进程就会从阻塞状态唤醒而进入就绪状态。因此进程的阻塞是进程自身的一种主动行为,是进程自己通过阻塞原语自己阻塞。
阻塞原语如下:
- 停止进程执行
- 进程插入阻塞队列
- 重新调度
唤醒原语如下:
- 将进程从阻塞队列卸下
- 插入就绪队列
- 修改进程在PCB中的状态
注意,进程的阻塞和唤醒原语是一对功能相反的原语,若某个进程调用了阻塞原语,则必有一个与之对应的唤醒原语。