
进程概念进程Process是操作系统中资源分配和调度的基本单位它由程序块、进程控制块(PCB)、数据块三部分组成是程序在计算机中的一次动态执行过程程序块可执行文件的机器指令数据块程序运行时的全局变量、静态变量等PCBPCB是进程存在的唯一标志存储进程状态、优先级、资源占用等元数据内容包含进程标识符、状态、位置信控制信息、队列指针(链接同一状态的进程)、优先级、现场保护区等堆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/TerminatedState):进程已完成任务或因错误等原因被迫终止终止后的进程不再被调度执行最终从系统中移除。结束之前需要进行善后处理如回收资源并将PCB清零并归还系统⭐进程调度进程的同步与互斥进程同步简单来说就是一个进程的执行依赖于另一个进程的消息当一个进程没有得到来自另一个进程的消息时则需等待直到消息到达才被唤醒继续执行多个进程为了完成一个共同的任务在执行次序上需要进行协调彼此之间需要交换信息以保证各个进程都能正确地执行进程互斥多个进程需要访问同一临界资源时同时刻只允许一个进程访问该资源其他需要访问该资源的进程必须等待直到占用资源的进程释放该资源**临界资源**是指一次仅允许一个进程使用的共享资源进程中访问临界资源的那段代码称为临界区PV操作PV操作是一种用于实现进程同步与互斥的原语信号量(S)是一个整型变量(全局变量)用于表示系统中某种资源的数量。信号量可以分为两类一类是用于实现同步的同步信号量初始值根据具体情况设定另一类是用于实现互斥的互斥信号量初始值通常为 1P操作(加锁)也称为 “等待” 操作执行该操作时会尝试获取资源。若资源可用信号量值大于 0则占用资源并将信号量的值减 1若资源不可用信号量值为 0则进程会被阻塞进入与该信号量相关的等待队列假设S 是临界资源 P操作是 申请需要消耗使用资源假设s00-1-1 S 0 说明资源不足够无法继续执行任务则需要进入阻塞队列等待无法正常执行下面操作假设s100 100 -1 之后判断S 不小于 0 说明资源足够继续执行任务假设s11-1 S 不小于 0 说明资源足够继续执行任务V操作(解锁)也称为 “释放” 操作执行该操作时会释放资源。将信号量的值加 1如果此时有进程在等待该资源信号量值小于等于 0则唤醒等待队列中的一个进程假设S 是临界资源 P操作是 申请需要消耗使用资源假设s100 100 1 之后判断S 不小于等于 0 说明资源足够且没有阻塞的任务假设s-1-110 S 等于 0 说明资源-1此时存在阻塞任务则发起通知此时释放了一个资源信号量 与 PV操作信号量是一个整数值主要用于描述共享资源的状态正值:表示当前可用的资源数量负值:其绝对值表示正在等待获取该资源的进程数目二进制信号量Binary Semaphore也可以被称为互斥锁Mutex Locks计数器信号量Counting SemaphorePV单资源互斥模型PV互斥模型PV操作用于确保同一时刻只有一个进程能够进入临界区从而避免数据竞争和其他不一致的问题通过信号量、PV操作 P[测试并递减] 和 V [增]可以有效控制多个进程对共享资源的安全访问假设有一个共享资源如打印机我们需要确保在同一时间只有一个进程能够使用该资源// 我们可以使用一个初始值为1的二进制信号量semaphore printer_mutex1;voidprint_document(intdocument_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则-10 并允许进程继续执行如果信号量的值为0-10 则该进程会被阻塞挂起进入等待队列直到其他进程 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又向资源申请资源就会无法获得运行资源就会进入等待态** 阻塞状态**