进程
进程的起源
分时共享的诞生,使得多个程序可以同时运行,“进程”开始登上了历史舞台。
进程的概念与表示
进程的概念
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程
进程刻画了一个程序运行所需要的资源和运行状态

进程资源
进程CPU资源
- 寄存器
- PC
- 栈指针(SP寄存器)
- 其他标志信息(SSTATUS寄存器)
进程内存资源
- 抽象:进程地址空间
进程I/O资源
- 抽象:文件(文件描述符)
进程在内核中的表示
每个进程的创建和销毁都由内核来负责,内核需要对每个进程登记信息。
内核用进程控制块(PCB)来保存进程的信息,同样内核也利用PCB来索引进程。
PCB块中包含的信息
- 进程标识信息:进程ID、进程名称
- 与各种资源相关的信息
- CPU、内存、文件、通信等
- CPU相关的进程管理信息
- 状态:就绪态、运行态、阻塞态等
- 寄存器,SSTATUS等其他CPU状态
- 优先级
- 内存管理信息
- 栈(用户栈和内核栈),代码段和数据段
- 页表、统计信息等
- I/O和文件管理
- 通信端口、目录和文件描述符等
进程 VS 程序
关联
- 程序是进程的一部分(代码段)
- 进程是程序的动态执行
区别
- 一个程序可以创建多个进程
- 进程还包含运行时状态和所使用的资源信息
进程的状态
进程的创建
什么时候会创建进程
- 系统初始化的时候
- 用户操作(在终端中调用命令)
- 正在运行的进程通过
syscall创建新的进程
怎么样创建进程
- 创建并初始化
PCB - 创建地址空间、调用栈和堆
- 将数据和代码加载至内存
- 初始化进程的状态,将进程标志为就绪态
进程的运行
内核选择一个就绪的进程,为它分配一个处理器的时间片,并开始执行。
如何选择就绪的进程?
- 进程调度算法
- 进程优先级
进程抢占
进程时间片用完
- 非抢占式内核
- 进程始终保持运行,直到其主动退出并让出CPU资源
- 抢占式内核
- 在时间片用完后,调度高优先级进程
进程等待
进程进入等待(阻塞)的情况
- 需要的数据没有到达/需要的资源没有获得(等待用户输入/等待锁)
- 进程主动进入等待(sleep)
- 请求并等待系统服务,无法立刻完成(内存页分配、硬盘读写)
进程唤醒
唤醒进程的情况
- 被阻塞进程需要的资源被满足
- 被阻塞进程等待的事件到达
进程只能被别的进程或操作系统唤醒
进程结束
进程结束的情况
- 正常运行结束,退出
- 发生错误,退出
- 被其他进程所杀
进程状态转换图

进程上下文切换
- 保存上下文
- 保存所有的寄存器(通用寄存器以及浮点寄存器)以及部分特殊寄存器状态(标志位状态)
- 保存所有协处理器的状态
- 恢复上下文
- 做保存上下文相反的操作
- 实现
- 硬件自动保存和恢复(X86 Task Register寄存器,通过修改其值触发硬件保存所有的寄存器值)
- 软件保存和恢复:通过汇编指令保存相关的寄存器
进程生命周期
- 抢占式内核
- 进程创建
- 进程执行
- 进程抢占
- 进程等待
- 进程唤醒
- 进程结束
- 非抢占式内核
- 进程创建
- 进程执行
- 进程等待
- 进程结束
进程的操作原语(API)
创建和终止
Fork,Exec,Wait,Kill
Fork
- 克隆出一个进程
- 共享当前代码段,复制数据段、堆栈、页表等
- 采用写时复制机制
Exec
- 替换掉当前进程等代码段、数据段、堆栈等
Wait
- 等待子进程结束
Kill
- 向进程发送信号,结束进程并释放资源
操作
Block,Yield
信号
Cond,Signal
同步
Lock,Semaphore,Barrier
进程、并发和并行
进程的顺序执行

进程和并发性
并发性
- 一个系统中有多个进程“同时”运行(逻辑上)
- CPU、DRAM和I/O设备是共享的
- 每一个进程都希望能拥有自己的计算机资源
虚拟化(分时复用)
- 每个进程都运行一段时间(时间片)
- 使得一个CPU变成“多个”,每一个进程就好像拥有了自己的CPU

CPU并行性
多个CPU(如SMP)
使得进程在物理上能够同时运行,进而加速程序

I/O并行性
- CPU计算与I/O操作交叠
- 减少总共所需的完成时间

并发和并行
并发
一个系统能同时处理多个任务的能力,但在同一时刻可能只有一个任务在运行
并行
一个系统在同一时刻支持多个任务同时运行
并行性收益
- 将一个复杂的问题分解成多个子问题
- 每个子问题由一个进程处理
- 多个进程同时处理,减少处理时间