进程状态
PS:挂起是指进程没有占用实际的物理内存空间的情况。
导致进程挂起的原因:
- 进程使用的内存空间不在物理内存
- 通过 sleep 让进程间歇性挂起
- 用户希望挂起一个程序的执行,比如 Linux 中使用
Ctrl+Z
挂起进程
进程的控制结构 PCB
PCB 是进程存在的唯一标识。
PCB 包含的信息
1)进程描述信息
- 进程标识符
- 用户标识符
2)进程控制和管理信息
- 进程当前状态
- 进程优先级
3)资源分配列表
- 内存地址空间或虚拟地址空间的信息
- 文件打开列表
- 使用的 I/O 设备信息
4)CPU 相关上下文信息
- CPU 中各个寄存器的值,在进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,当进程重新被调度时,能从断点处继续执行
PCB 的组织形式
通常是通过链表的方式进行组织,把具有相同状态的进程链在一起,组成各种队列。
- 将所有处于就绪状态的进程链接在一起,组成就绪队列;
- 把所有因等待事件而处于等待状态的进程链在一起就组成各种阻塞队列;
- 对于运行队列在单核 CPU 系统中则只有一个运行指针。
除了链接的组织方式,还有索引方式,它的工作原理:将同时状态的进程组织在一个索引表中,索引表指向相应的 PCB,不同状态对应不同的索引表。
通常会选择链表,因为可能面临进程创建、销毁等调度导致进程状态发生变化,所以链表能够更加灵活的插入和删除。
进程的控制
进程的创建、终止、阻塞、唤醒的过程,这些过程也就是进程的控制。
创建进程
操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源。
创建过程:
- 申请一个空白的 PCB,在 PCB 中设置控制和管理进程的信息,如进程的唯一标识等;
- 为该进程分配运行时所必需的资源,比如内存资源;
- 将 PCB 插入到就绪队列,等待被调度运行;
终止进程
进程有 3 种终止方式:
- 正常结束
- 异常结束
- 外界干预(信号
kill
掉)
终止过程:
- 查找需要终止的进程的 PCB;
- 如果处于执行状态,则立即终止该进程的执行,然后将 CPU 资源分配给其他进程;
- 如果其还有子进程,则应将该进程的子进程交给 init 进程接管;
- 将该进程所拥有的全部资源都归还给操作系统;
- 将其从 PCB 所在队列中删除;
处理不当会有孤儿进程和僵尸进程的问题。
阻塞进程
当进程需要等待某一事件完成时,它可以调用阻塞语句把自己阻塞等待。一旦进程被阻塞等待,它只能由另一个进程唤醒。
阻塞过程:
- 找到将要被阻塞进程标识号对应的 PCB;
- 如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行;
- 将该 PCB 插入到阻塞队列中去;
唤醒进程
进程由「运行 -> 阻塞」是由于进程必须等待某一事件的完成,所以处于阻塞状态的进程需要其他进程唤醒。
唤醒过程:
- 在该事件的阻塞队列中找到相应进程的 PCB;
- 将其从阻塞队列中移出,并置其状态为就绪状态;
- 把该 PCB 插入到就绪队列中,等待调度程序调度;
进程的阻塞和唤醒是一对功能相反的语句,如果某个进程调用了阻塞语句,则必有一个与之对应的唤醒语句。