进程的概念:进程调度算法
进程概念:
进程(Process)是操作系统中资源分配和调度的基本单位,
它由程序块
、进程控制块(PCB)
、数据块
三部分组成:
是程序在计算机中的一次 动态执行过程;
- 程序块:可执行文件的机器指令
- 数据块:程序运行时的全局变量、静态变量等
- PCB:PCB是进程存在的唯一标志,存储进程状态、优先级、资源占用等元数据
内容包含:进程标识符、状态、位置信控制信息、队列指针(链接同一状态的进程)、优先级、现场保护区等 - 堆(Heap):动态分配的内存区域(如malloc/new申请的空间
- 栈(Stack):函数调用、局部变量、返回地址等临时数据
进程与程序区别:
进程是程序的一次执行过程,没有程序就没有进程。
程序:静态代码集合:程序是存储在磁盘上的可执行文件(如.exe、.py),由二进制指令和数据组成。
- 无状态:
程序本身不具备运行状态,无法主动执行。
- 示例:一个保存在硬盘中的word.exe文件
进程:动态执行实例:进程是程序在内存中的一次运行过程,具有生命周期(创建→运行→终止) - 有状态:进程包含运行时状态(如 CPU 上下文、内存分配、文件句柄等
- 示例:双击word.exe后,内存中启动的 Word 应用程序实例
存在形式:
- 程序:存储位置:磁盘、需被加载到内存才能运行,表现形式:二进制文件(静态)
- 进程:存储位置:内存(RAM)+ 磁盘缓存,表现形式:内存中的动态实体(含 PCB)
生命周期:
- 程序:可复用性:同一程序可被多次启动为不同进程
长期存在:除非被删除或修改,否则程序文件始终存在 - 进程:短暂存在:从创建到终止的时间可能极短(如毫秒级)
唯一性:每个进程有唯一 PID(进程 ID),同一程序启动多次会生成多个独立进程
资源占用:
- 程序:无直接资源占用:仅占用磁盘存储空间
共享性:多个进程可共享同一个程序文件如:多个 Word 进程共享word.exe - 进程:独占资源:每个进程拥有独立的内存空间、文件描述符、CPU 时间片等
资源竞争:进程间可能因资源分配产生冲突(如内存不足、文件锁竞争)
进程与线程区别:
进程 (Process):
- 是一个正在运行的程序的实例。
- 包含程序计数器、寄存器和程序变量的当前值。
- 拥有独立的:地址空间,包括代码段、数据段和堆栈段
线程 (Thread):
- 是进程中的一个执行路径或子任务。
- 同一个进程中的所有线程共享该进程的资源(如内存空间)。
- 每个线程有自己的程序计数器、寄存器和局部变量,但共享全局变量和其他进程级别的资源
资源开销:
- 进程 创建、销毁和切换成本较高,因为每个进程都有独立的地址空间
- 线程 创建、销毁和切换成本较低,因为线程共享进程的地址空间
地址空间:
- 进程 每个进程拥有独立的地址空间,相互隔离
- 线程 所有线程共享同一个进程的地址空间,便于线程间的通信和协作
冲突处理:
- 进程 如果一个进程崩溃,不会直接影响其他进程,因为它们是完全隔离的
- 线程 如果一个线程崩溃,可能会导致整个进程终止,因为线程共享相同的状态和资源
并发性和性能:
- 进程 支持真正的并发执行,但由于较高的创建和切换代价,适用于长时间运行的任务
- 线程 提供高效的并发执行能力,由于低开销,适用于短时间和频繁切换的小任务
进程的状态:
进程在其生命周期内会经历多种状态,这些状态反映了进程在不同阶段的执行情况和资源占用情况
三态模型
运行:当一个进程在CPU上运行时,单处理机处于运行态的进程只有一个
就绪:一个进程获得了除CPU外的一切所需资源,一旦得到处理机即可运行,将要运行的状态
阻塞:阻塞也称:等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O等待I/0完成等)而暂时停止运行
- 此时即使把CPU分配给进程也无法运行,故称进程处于阻塞状态
五态模型
五态模型——也有的称为七态模型:因为:创建、就绪、运行、阻塞、挂起就绪、挂起阻塞、终止
新建状态 (New State):
- 进程刚被创建但尚未进入就绪队列的状态。新建过程中需要分配所需的资源并建立必要的管理信息
就绪状态 (Ready State): 进程准备好随时获取CPU执行,存在于内存中,可以直接被调度执行
运行状态 (Running State): 进程正在处理机上执行,同一时刻最多只有一个进程处于运行状态
阻塞状态 (Blocked/Waiting/Sleeping State): 进程因等待某些事件而暂停执行,存在于内存中,直到所需事件发生才返回就绪状态
挂起就绪状态 (Ready Suspend): 进程具备运行条件,但目前在外存中。只有当它被对换到内存中才能被调度执行。
- 主要用于减少内存负担,保留那些短期内可能需要使用的进程。
挂起阻塞状态 (Blocked Suspend): 表明进程正在等待某一个事件发生且在外存中
- 等待的事件完成后,相应的挂起阻塞进程将转换为挂起就绪状态。
- 减少了内存占用的同时,避免了不必要的唤醒操作
终止状态 (Exited/Terminated State):
- 进程已完成任务或因错误等原因被迫终止
- 终止后的进程不再被调度执行,最终从系统中移除。
- 结束之前需要进行善后处理,如回收资源并将PCB清零并归还系统
⭐进程调度:
进程的同步与互斥:
进程同步:
-
简单来说,就是一个进程的执行依赖于另一个进程的消息,
当一个进程没有得到来自另一个进程的消息时则需等待,直到消息到达才被唤醒继续执行
-
多个进程为了完成一个共同的任务,在执行次序上需要进行协调,彼此之间需要交换信息,以保证各个进程都能正确地执行;
进程互斥:
-
多个进程需要访问同一临界资源时,同时刻只允许一个进程访问该资源,
-
其他需要访问该资源的进程必须等待,直到占用资源的进程释放该资源
-
**临界资源:**是指一次仅允许一个进程使用的共享资源
进程中访问临界资源的那段代码,称为:临界区
PV操作:
PV 操作是一种用于实现进程同步与互斥的原语
信号量(S):是一个整型变量(全局变量),用于表示系统中某种资源的数量。信号量可以分为两类
- 一类是用于实现同步的同步信号量,初始值:根据具体情况设定
- 另一类是用于实现互斥的互斥信号量,初始值:通常为 1
P操作(加锁)
也称为 “等待” 操作,执行该操作时会尝试获取资源。
若资源可用(信号量值大于 0),则占用资源并将信号量的值减 1;
若资源不可用(信号量值为 0),则进程会被阻塞,进入与该信号量相关的等待队列;
假设S 是临界资源 P操作是 申请需要消耗使用资源;
- 假设:s=0,0-1=-1 ,S < 0 说明资源不足够,无法继续执行任务,则需要进入阻塞队列等待,无法正常执行下面操作;
- 假设:s=100 100 -1 之后判断,S 不小于 0 说明资源足够,继续执行任务
- 假设:s=1,1-1 ,S 不小于 0 说明资源足够,继续执行任务
V操作(解锁)
也称为 “释放” 操作,执行该操作时会释放资源。将信号量的值加 1
如果此时有进程在等待该资源(信号量值小于等于 0),则唤醒等待队列中的一个进程;
假设S 是临界资源 P操作是 申请需要消耗使用资源;
- 假设:s=100 100 + 1 之后判断,S 不小于等于 0 说明资源足够,且没有阻塞的任务
- 假设:s=-1,-1+1=0 ,S 等于 0 说明资源-1,此时存在阻塞任务,则,发起通知,此时释放了一个资源;
信号量 与 PV操作:
信号量 是一个整数值,主要用于描述共享资源的状态
正值: 表示当前可用的资源数量; 负值: 其绝对值表示,正在等待获取该资源的进程数目;
- 二进制信号量
Binary Semaphore
也可以被称为互斥锁Mutex Locks
- 计数器信号量
Counting Semaphore
PV单资源互斥模型
PV互斥模型:PV操作用于确保同一时刻只有一个进程能够进入临界区,从而避免数据竞争和其他不一致的问题;
通过:信号量、PV操作 P[测试并递减] 和 V [增],可以有效控制多个进程对共享资源的安全访问;
假设有一个共享资源(如打印机),我们需要确保在同一时间只有一个进程能够使用该资源
// 我们可以使用一个初始值为1的二进制信号量
semaphore printer_mutex = 1;
void print_document(int document_id) {P(printer_mutex); // 请求打印设备使用权printf("Printing Document %d\n", document_id);sleep(rand() % 5); // 模拟打印耗时V(printer_mutex); // 打印结束后释放设备
}//P操作
//当进程调用 print_document 时,首先执行 P(printer_mutex) 来尝试获取打印设备的使用权
//如果 printer_mutex 大于等于0,则进程可以获得使用权并将 printer_mutex 设定为0,
//这意味着现在没有任何其他的进程可以再进入临界区//V操作
//在进程完成文档打印后,它调用 V(printer_mutex) 来释放打印设备,
//并使 printer_mutex 回复为1,这表明其他进程现在可以再次尝试进入临界区。
PV操作在 同一个进程中,成对出现!避免同时其他,进程来抢占资源;
PV同步模型
PV同步模型是操作系统中用于解决进程间同步问题的经典方法之一,
PV同步模型基于信号量,它通过:P操作[Wait等待]、V操作[Signal 释放] 来协调多个进程对共享资源的访问
P操作: 当一个进程执行P操作时,它试图获取一个 信号量的许可
- 如果信号量的值大于0,则-1>=0 并允许进程继续执行;
- 如果信号量的值为0,-1<0 则该进程会被阻塞(挂起)
- 进入等待队列,直到其他进程 V操作释放信号量
V操作:当一个进程执行V操作时,它会增加 信号量的值
- 如果在执行V操作前有进程因为执行P操作而被阻塞,
- 那么V操作会唤醒队列中的一个或多个进程,使它们能够继续执行
应用实例:生产者-消费者问题:
假设有一个缓冲区,生产者向缓冲区添加产品,消费者从缓冲区取出产品。
为了同步它们的行为,我们可以设置两个信号量:empty: 表示缓冲区的空位数、full: 表示缓冲区中已填充的产品数
- 生产者流程:
-
执行P1操作在empty上,表示尝试放入产品。如果empty为0(即缓冲区满),生产者等待
-
放置产品后,执行V2操作在full上,表示缓冲区中多了一个产品;
-
- 消费者流程:
-
执行P2操作在full上,表示尝试消费产品。如果full为0(即缓冲区空),消费者等待
-
消费产品后,执行V1操作在empty上,表示缓冲区中多了一个空位
-
PV同步模型:PV操作在不同线程之间**,同步出现,并且**不分先后,控制多个线程之间执行顺序协调;
前趋图与PV操作:
这个不方便文字描述,需要结合题目还有图形进行介绍;所以需要个人悟性、看视频;
- 前趋图是一种图形化的工具,用于描述一组进程之间的依赖关系,
- 在并发环境中哪些进程必须在其他进程完成之后才能启动;
节点: 表示具体的进程或任务:A节点 ——> B节点
边 (箭头): 表示前后序关系,即一个进程必须在其前趋进程完成后才能开始执行;
- 箭头左端表示 P操作,——> V操作,实际题目:会出现很多节点,需要判断,某个位置是P\V操作 或信号量!
死锁问题:
所谓死锁,是指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
死锁 四大条件:
- 互斥条件: 至少有一种资源是不可共享的,同一时刻只能被一个进程使用
- 持有并等待条件: 进程持有一些资源并且还在等待其他的资源;
- 非剥夺条件: 已经分配给进程的资源不能强制收回,只能由该进程自行释放
- 循环等待: 存在一个进程等待另一个进程所持有的资源,从而形成了一个闭环
解决死锁 的方法:打破四大条件
-
预防死锁 :断坏死锁的四个必要条件中的任意一个
- 方法包括:静态地规定资源分配顺序、禁止进程同时请求多个资源等
-
避免死锁:动态地检查资源分配的安全性,确保不会引入不安全的状态
银行家算法 可以避免死锁 它可以判断是否可以安全地授予一个新的资源请求而不引起死锁
-
死锁检测与回收: 定期检测是否存在死锁,并采取措施终止某些进程以解除死锁
-
忽略死锁 (鸵鸟策略):认识到死锁不可避免,仅在发现死锁时采取行动。
- 这种方法简单直接,但可能导致系统不稳定;
死锁最小资源数: n × (m−1)+1
或 (w-1)m + 1 <= n
- 计算死锁最小资源数需要考虑进程对资源的需求以及系统中进程的数量等因素
- 假设系统中有n个进程,每个进程需要m个资源才能完成任务
计算资源数:
- 先给每个进程分配(m - 1)个资源。此时系统中资源总数为
n * (m - 1)
- 这种情况下,每个进程都还差1个资源就能完成任务,系统处于一种临界状态,即只要再有1个资源
- 就可以保证至少有一个进程能获取到足够的资源来运行完成,并释放其占用的资源,从而避免死锁
得出结论: 所以,避免死锁的最小资源数R为: n×(m−1)+1
例如,系统中有3个进程,每个进程需要5个资源,那么避免死锁的最小资源数为 3 x(5 -1)+1= 13
如果资源数小于13,就有可能发生死锁,这只是一种理论上的计算方法,实际系统中死锁的情况可能更加复杂;
进程资源图:
圆圈:一个圆圈表示一个进程
矩形:一个矩形表示一个资源,矩形中圆圈的数量表示这类资源的个数
1、表示进程向资源申请一个资源
2、表示资源分配一个资源给进程
3、表示资源向进程分配一个资源,进程向资源申请一个资源。
- 注意一定是先分配后申请,资源先给进程分配资源,进程才向资源又申请资源。
4、资源共有三个资源,分别给三个进程分配资源后没有剩余资源了,此时进程1又向资源申请资源,
- 就会无法获得运行资源,就会进入等待态**( 阻塞状态)**