3、进程与线程
进程
进程是程序运行在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。由程序块、进程控制块(PCB)和数据块三部分组成。 (比如 QQ、微信,一个程序有多个进程)
PCB 是进程存在的唯一标志。内容包含进程标识符、状态、位置信息、控制信息、队列指针、优先级、现场保护区等。
状态(三态模型)

- 运行态:当一个进程在 CPU 上运行时(单处理机处于运行态的进程只有一个,多线程在 CPU 上交替运行)
- 就绪:一个进程获得了除 CPU 外的一切所需资源,一旦得到处理机即可运行
- 阻塞(等待):一个进程正在等待某一事件发生(例如请求 IO、等待 IO 完成等)而暂时停止运行,此时即使把 CPU 分配给进程也无法运行,故称进程处于阻塞状态
调度算法
- 时间片轮转:执行一段时间换下一个进程
- 先来先服务:每次从就绪队列中选择一个最先进入该队列的进程为其分配处理机
- 短作业优先:作业事件短的优先
- 高响应比优先:考虑响应比,综合先来先服务和短作业优先
- 优先级调度
- 抢占式/非抢占式
同步与互斥
互斥(间接制约关系):千军万马过独木桥
临界资源:各进程间需要互斥方式对其进行共享的资源 临界区:代码中访问临界资源的代码
同步(直接制约关系 ):不同进程之间速度有差异,在一定情况停下等待
PV 操作【操作系统原语】
- 信号量:是一种特殊的变量(全局变量)
- 信号量可以表示资源数量
- 信号量为负数时还可以表示排队进程数

P 操作
- 先对信号量自减 1(S = S - 1)申请/锁定资源)
- 判断资源是否足够(S < 0)
- 如果 S < 0 进入阻塞队列排队(先进先出)
V 操作
- 先对信号量自增 1(S = S + 1)释放/解锁资源
- 检查是否有进程排队(S <= 0)
模拟
2 台打印机,3 个进程要互斥使用打印机,模拟 PV 过程。
信号量 S 的初值是打印机的数量 2, PV 的取值范围是[-1,2]
前趋图

- 1 个箭头表示 1 个前趋关系
- A 有箭头指向 D,记录为(A,D)
- 没有前趋进程的节点是起始进程(前趋可能有多个),没有后继进程的节点是终结进程
前趋图和 PV

- 并发图中某活动有后继就有 V 操作释放资源并通知后继活动,有前趋就有 P 操作检查资源是否足够
- 实现并发的信号量初始值一般为 0,有几个箭头就有几个信号量
死锁
进程管理是操作系统的核心,但如果设计不当,就会出现死锁问题。如果一个进程在等待一件不可能发生的事,则进程就死锁了。而如果一个或多个进程产生死锁,则系统处于死锁状态。
四大条件
- 互斥:至少有一个资源必须处于非共享模式。这意味着一次只有一个进程可以使用该资源。如果其他进程请求该资源,它们必须等待,直到占用该资源的进程释放它为止
- 保持和等待:一个进程至少持有一个资源,并且正在请求获取其他进程持有的资源,但尚未被分配到这些资源。( 进程在持有自己需要的资源的同时,又去请求其他进程正在使用的资源,并且在未获得这些资源之前不会释放自己已经持有的资源)
- 不剥夺:已经分配给一个进程的资源不能被强制性地从该进程夺走,只能由持有该资源的进程主动释放。(如果操作系统可以强制剥夺一个进程持有的资源,并将其分配给其他需要该资源的进程,那么死锁就可以被打破。例如,在某些内存管理策略中,操作系统可以暂时将某些进程的内存换出到磁盘,从而释放内存资源。)
- 环路等待:存在一个由两个或多个进程组成的等待链,链中的每个进程都在等待下一个进程所持有的资源。例如,进程 A 等待进程 B 持有的资源,进程 B 等待进程 C 持有的资源,而进程 C 又在等待进程 A 持有的资源,形成一个环路。(循环等待是死锁发生的最终必要条件。如果没有这样的等待环路,即使满足了前三个条件,也不会发生一组进程永远阻塞的情况。 )
资源数计算
例:系统有 3 个进程 ABC。这三个进程都需要 5 个系统资源。如果系统至少有多少个资源,则不可能发生死锁。
假设进程数量为 n,每个进程需要的系统资源分别为 k1...kn,则公式为(k1+k2+...+kn)- n + 1
则例题答案为(5+5+5)-3+1 = 13
银行家算法:分配资源的原则
- 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程
- 进程可以分期请求资源,但请求总数不能超过最大需求量
- 当系统现有资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能使进程在有限时间里得到资源
线程
一个进程可以有多个线程
两者的关系
程序 - 进程 - 线程
进程的两个基本属性:可拥有资源的独立单位;可独立调度和分配资源的基本单位【内核线程、用户线程】

同进程中,文件可以被共享,栈指针不能被共享