进程
进程的状态
基础的五种状态
- 创建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 结束状态
如果大量进程处于阻塞状态,就会导致高内存占用
当内存紧张时,操作系统通常会把处于阻塞状态中进程占用的物理内存换出到硬盘,等到需要再次运行时,再从硬盘换入内存
于是就多了一个状态 —— 挂起,指没有占用物理内存的进程状态
挂起 分为 阻塞挂起(换入内存后等待某个事件出现) 和 就绪挂起(换入内存后立即开始运行),最终全部的七种状态如下:

进程控制结构 —— PCB
操作系统中,使用进程控制块(PCB,Process Control Block)描述一个进程 PCB 的结构
- 进程标识符
- 用户标识符
- 进程状态
- 进程优先级
- 虚拟地址/内存地址信息、打开的文件列表、使用的 I/O 设备的信息
- CPU 中各个寄存器的值
PCB 的组织方式
- 链表:将相同状态的进程用链表串起来组成一个队列,比如就绪队列、阻塞队列等
- 索引(数组):对于相同状态的进程,用索引表保存其引用,不同状态有不同的索引表 一般会选择链表,性能更好,更灵活
进程的控制
-
创建
- 申请一个空白的 PCB,填入控制和管理进程的信息
- 为进程分配资源(比如内存资源等)
- 将 PCB 插入就绪队列
-
终止 进程有三种终止方式:正常结束、异常结束、外界干预(kill 等命令)
- 查找终止目标进程的 PCB
- 如果处于运行状态,则立即终止该进程的执行,并将其占用的 CPU 资源分配给其他进程
- 如果目标进程有子进程,将子进程交给「一号进程」监管
- 将目标进程拥有的所有资源归还给操作系统
- 将目标进程的 PCB 从所在队列删除
-
阻塞 进程可以调用阻塞语句,让自己阻塞等待一个事件
- 找到目标进程的 PCB
- 如处于运行状态,则保存其上下文,并将状态改为阻塞,停止进程运行
- 将 PCB 插入阻塞队列
-
唤醒 当等待的事件完成后,可能由操作系统内核负责唤醒进程(中断处理程序/内核线程/定时器),也可能是其他进程监听到事件完成后唤醒源进程
- 在阻塞队列中找到目标进程的 PCB,并从阻塞队列中取出
- 将 PCB 状态改为就绪,将其插入到就绪队列
进程的上下文切换
- 进程上下文的子集是 CPU 上下文,CPU 切换执行不同任务时就会发生 CPU 上下文切换
- CPU 上下文包含 CPU 寄存器 + 程序计数器,「任务」主要包含进程、线程和中断
- 根据任务的不同将 CPU 上下文具体分为 进程上下文、线程上下文、中断上下文
进程上下文除了 CPU 上下文,还包含进程地址空间 + 内核数据结构 + 资源信息
线程
以视频播放器为例,如果单线程开发,就类似下面这样:
如果采取读取、解压、播放都用一个线程来执行,多个线程可以并发运行,线程之间共享数据,性能会有很大的提升