进程
进程的概念
进程的组成
- code
- PC
- registers
- data section: 全局变量(包括static)
- heap: 动态分配的内存(如new/malloc)
- stack: 局部变量

概念
- 进程不等于程序(program). 进程是一个动态的概念。进程是程序的一次执行。
- 进程包括code,data,stack,PCB
- 多个进程可以并发执行
进程的状态
- new: 进程还没被操作系统加载到内存
- ready(就绪): 可以被分配到CPU上运行
- running(运行): 在CPU上.
- waiting(阻塞): 等待I/O
- terminated(终止):
状态机

Example
1个处理器 OS只有运行/就绪/等待3种状态。假设10个进程并发执行,只考虑user mode,那么: 运行状态的程序 1个 就绪状态的程序 最少0(都在等待) 最多9个(有1个在运行) 等待状态的程序 最少0, 最多9
进程控制块
- 进程标识符(pid)

Linux PCB: task_struct
进程的操作
- 从job
进程启动
每个进程有进程号pid, 父进程编号ppid。
- init进程 pid=1,ppid=0
int pid=fork();
- 在父进程中,fork返回子进程的pid.
- 在子进程中,返回0
- 如果失败, 返回负值
进程终止
系统调用exit()使得进程终止。
系统调用wait() 使当前进程进入 waiting 状态,并在任一子进程终止,或被信号停止,或被信号恢复时进入 ready 状态,同时返回发生该事件的子进程的 pid。
- 当子进程已经终止,但父进程在忙,还没有调用
wait()这样的子进程为 僵尸进程 (zombie processes) - 当子进程没有结束,或者终止了但父进程没有调用
wait()的情况下,父进程就结束了,子进程就会成为 孤儿进程 (orphan processes) 孤儿进程会被init接管作为子进程
进程调度
调度的分类
- 作业队列(job queue): 所有提交给OS的作业(在外存)
- 就绪队列(ready queue): 就绪,等待CPU执行的进程
- device queue: 等待IO的进程
长程调度: 从作业队列选择作业进入就绪队列 短程调度(CPU调度): 从就绪队列选择作业执行 中程调度: 把内存中处于阻塞状态的进程换到外存上,减少内存占用
考虑 进程的状态 中的状态机

- 非抢占式(non-preemptive)调度(图中绿色) : 只在exit和wait的时候进行调度
- 抢占式调度(图中蓝色): 任何时候都可能进行调度。(如从job queue拿一个新进程到ready queue时,可能会把正在运行的进程中断,然后重新调度)
上下文切换(context-switch): 保存原来进程的state到PCB,从新进程的PCB加载state
评价指标
- 运行时间burst time
- 周转时间turnaround time=完成时间-到达时间
- 等待时间waiting time=周转时间-运行时间
FCFS
方法:
- 非抢占式
- 按照进程进入就绪队列的顺序进行调度: 正在运行的进程直到阻塞或执行结束,才让出CPU。阻塞结束的进程进入就绪队列时,并不立即执行,等当前正在运行的进程。
优点:实现简单
SJF/SRTF
分为抢占式和非抢占式2种。
非抢占式:有多个进程处于就绪态时,选择需要运行时间最短的进程先运行。 缺点: 无法估计需要运行的时间

抢占式(SRTF) :总是执行 剩余运行时间最短 的进程。执行一个进程的过程中,有新进程加入就绪队列,如果新进程剩余运行时间更短,则终止当前进程。 缺点:会有饥饿(starvation)问题。抢占式SJF会导致长的任务长时间得不到运行
时间片轮转(RR)
分为长度T的时间片。每个时间片开始时取队头的进程运行,该进程最多运行时间T, 然后就被放到队尾(运行->就绪)。
不会发生饥饿现象(前提是T不能特别大)
- T特别大,就相当于FCFS
- T特别小,响应时间提高,但是进程间切换有开销
优先级
给每个进程一个优先级。算法类似SJF。 缺点:饥饿问题(如果新来的进程优先级特别高) 解决方法:priority aging
HRRN: 高响应比优先调度算法(Highest Response Ratio Next)响应比=作业周转时间/作业处理时间=(作业处理时间+作业等待时间)/作业处理时间
WinXP优先级调度 Scheduling Priorities - Win32 apps | Microsoft Learn
进程通信

线程
线程的概念
Warning
进程是资源分配的基本单位,线程是处理器调度的基本单位 每个线程都有它自己的PC, 寄存器和栈。线程与同一进程的其他线程共享 code section, data section, heap, open files 以及 signals。进程控制块 进程的组成
- 对于支持线程的操作系统,实际调度的是内核级线程而非进程
- 一个进程中的多个线程可并发执行