进程管理
程序与进程
-
定义
进程由程序、数据、进程控制块(PCB)组成,进程是资源分配和独立运动的基本单位。 -
特征
动态性、并发性、共享性、独立性、结构性、制约性 -
进程与程序的区别
- 进程是动态的,程序是静态的。进程是程序在数据集上的一次执行
- 进程具有并发性,程序没有
- 进程是资源分配的基本单位,程序不是
- 进程与程序不是一一对应,一个进程通常对应一个程序,而一个程序可以对应零个或多个进程
状态及转换
-
三态模型:运行态、就绪态、阻塞态
flowchart TB a((运行态)) b((就绪态)) c((阻塞态)) a-- 时间片到 -->b b-- 被调度 -->a a-- 等待事件 -->c c-- 等待事件发生 -->b -
五态模型:运行态、就绪态、阻塞态、新建态和终止态
flowchart LR a((新建态)) b((就绪态)) c((阻塞态)) d((运行态)) e((终止态)) a --> b b-- 被调度 -->d d-- 时间片到 -->b d-- 等待事件 -->c c-- 等待事件发生 -->b d --> e
进程的控制
- 进程控制是由操作系统内核(Kernel)中的
原语
实现的 - 原语(Primitive)是指由若干条机器指令组成,用于完成特定功能的程序段。原语的特点是在执行时不能被分割
进程间通信
多个并发进程存在资源共享和相互合作,因此进程之间需要进行通信
-
同步和互斥
- 同步式合作进程间的直接制约问题
- 互斥是申请临界资源进程间的间接制约问题
- 进程的同步:系统中需要相互合作、协同工作的进程之间的通信
- 进程的互斥:系统中多个进程因争夺临界资源而互斥执行,每次只能给一个进程使用的资源称为临界资源
-
信号量机制
信号量机制是一种有效的进程同步和互斥的工具- 公用信号量:互斥信号量,对临界资源采用互斥访问,初始值为1或资源的个数
- 私有信号量:同步信号量,对共享资源访问控制,初始值为0或某个正整数
信号量 S 的物理意义:若 S >= 0,表示可用的资源数,若 S <= 0,其绝对值表示阻塞队列中等待该资源的进程数
- PV 操作:均为原子操作,是实现同步和互斥的常用方法
- P 操作:表示申请一个资源,即 S=S-1,若 S>=0, 则执行 P 操作的进程继续执行,若 S <= 0, 则执行 P 操作的进程进入阻塞状态
- V 操作:表示释放一个资源,即 S=S+1,若 S>=0, 则执行 V 操作的进程继续执行, 若 S<=0, 则唤醒一个进程,并将其插入就绪队列,然后执行 V 操作的进程继续执行
- PV操作实现进程互斥
令信号量 S 初始值为1,当进入临界区时执行 P 操作,对出临界区时执行 V 操作。 - PV操作实现进程同步
设置3个信号量 S(互斥信号量,初始值为1)、S1(是否将产品放入缓冲区,初始值为n,缓冲区的容量)、S2(缓存区是否有产品,初始值为0)
进程的调度
进程调度方式:当有更高优先级的进程到来时,如何分配 CPU
-
可剥夺:强行将正在运行进程的CPU分配给高优先级的进程
-
不可剥夺:必须等待正在运行的进程释放占用的CPU,然后将CPU分配给高优先级的进程
-
三级调度:一个作业从提交到完成经历高、中、低三级调度
- 高级调度:作业调度,决定哪个后备作业可以调入主系统做好运行的准备
- 中级调度:对换调度,决定交换区中的哪个就绪进程可以调入内存
- 低级调度:进程调度,决定内存中的哪个就绪进程可以占用CPU,低级调度是操作系统中最活跃、最重要的调度程序
-
调度算法
- 先来先服务(FCFS):按先后次序分配CPU,有利于长作业,不利于短作业,有利于CPU繁忙型作业,不利于I/O繁忙型作业
- 时间片轮转:分配给每个进程时间片,轮流占用CPU,通过时间片轮转提高进程并发性和响应时间特性,从而提高资源利用率
- 优先级调度:系统选择优先级大的进程占用CPU
- 多级反馈调度:时间片轮转和优先级调度结合
进程的死锁
两个以上的进程因相互争夺对方占用的资源而陷入无限等待的现象
-
死锁产生的4个必要条件
- 互斥(资源互斥)
- 请求保持(进程占有资源并等待其他资源)
- 不可剥夺(系统不能剥夺进程资源)
- 环路(进程资源图是一个环路)
-
死锁的处理策略
- 死锁预防:采用某种策略限制并发进程对资源的请求,破坏死锁产生的4个必要条件,使系统在任何时刻都不满足产生死锁的必要条件
- 死锁避免:提前计算出一条不会产生死锁的资源分配方法,著名的死锁避免算法有银行家算法
- 死锁检测:允许死锁产生,但系统定时运行一个死锁检测程序,判断系统是否发生死锁,若检测到死锁,则设法加以解除
- 死锁解除:死锁发生后的解除方法,如资源剥夺法,撤销进程法等
-
死锁资源计算:系统内有n个进程,每个进程都需要R个资源,那么发生死锁的最大资源数为 n*(R-1) ,不发生死锁的最小资源数为 n*(R-1)+1
线程
- 线程是进程中的一个实体,是可拥有资源的独立单位,可独立分配和调度的基本单位。
- 线程是调度的最小单位,进程是拥有资源的最小单位
- 线程可以共享进程独有的公共数据、全局变量、代码及一些进程级资源(如打开文件和信号等),但不能共享线程独有的资源,如线程的栈指针等标识数据
- 一个进程内的线程在其他进程不可见