调度算法 用于进程调度
1、先来先服务算法FCFS:
非抢占式。公平,实现简单。对长时间作业有利,短时间作业体验差
对CPU繁忙型系统有利,对IO繁忙型系统不利
2、短作业优先算法:分为非抢占式的SJF和抢占式的SRTN。可能有进程饥饿
(1)短进程优先调度算法SJF(非抢占式)
(2)最短剩余时间优先算法SRTN(抢占式)
以上三个效率一个比一个高
3、高响应比优先算法HRRN(非抢占式):兼顾作业时间和等待时间
当正在运行的进程主动放弃CPU时,计算响应比
4、时间片轮转算法RR(注重响应时间)
每个进程实行一个时间片(时间片的长短可能不一样)。若一个进程在一个时间片内没有执行完,则剥夺CPU使用权(所以RR是抢占式),回到对位重新排队。
时间片大小选择很重要:如果时间片很大,进程的响应时间无法保证;如果时间片很小,则进程需要经过多次上下文切换和进程调度,增加了CPU在进程切换和进程调度上的开销,影响系统的吞吐量和CPU利用率等方面的性能
5、优先级调度算法:
优先级有静态优先级和动态优先级 动态优先级:低优先级随等待时间增加,优先级增加
(1)抢占式
(2)非抢占式
6、多级反馈队列调度算法(抢占式)
缺点:可能饿死
综合上述所有算法的优点
具体流程P17
进程同步与互斥
进程有异步性的特征,也就是说并发执行的进程的进度不可预知(两个并发的进程有争夺的资源,谁饥饿不可预知)
同步也叫直接制约关系,指对为完成某一任务建立的多个进程的工作次序进行制约
互斥:我们把一个时间段内只允许一个进程使用的资源称为临界资源(如内存缓冲区,摄像头、打印机)。对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
同步与互斥的区别:同步的进程占用统一资源是为了协调完成同一任务(如进程1写,进程2读);互斥仅仅是占用了统一资源,没有特定需要的先后顺序,两个进程完成的也不是同一个任务
互斥访问流程:
进入区:检查是否能进入临界区,能则上锁;临界区:访问临界资源;
退出区:解锁;
剩余区:其他处理
互斥访问遵循原则:空闲则进,忙则等待,有限等待(保证进程在有限的时间内能进入临界区),让权等待(等待时释放CPU)
进程互斥的软件实现方法
1、单标志法:
一个进程在访问完临界区后会把权限给另一个临界区(每个进程进入临界区的权限有其他进程赋予)
缺点:必须顺序访问,若当前turn=0,只有P0能访问,但P0不需要访问,那么即使P1需要访问,也只能等待。违背空闲则进原则
2、双标志先检查法:
缺点:进程是并行执行的,如果1526顺序,则两个进程同时访问临界区。违反忙则等待原则。 如果12步骤、56步骤是不可分割的原子操作,那就没问题了
3、双标志后检查法:
4、Peterson算法:
进程主动谦让。进程在判断能否进入临界区之前做了两件事:表明自己的进入意愿,表明自己的谦让意愿。像是孔融让梨,谁最后一次让,谁就后进入。
缺点:比前面三种好,但也没有遵循让权等待原则,即进程无法访问是在一直占用CPU执行while
考试可能会考别的算法,搞清算法在进入区做了哪些事(上面绿色的就是进入区内容)。考虑进入区做的事是否会产生问题(尤其是在进程并行运行的时候)。
进程互斥的硬件实现方法
1、中断屏蔽方法
不适用多处理机,因为关中断只对一个CPU核有效
2、TSL指令
类似于软件的双标志检查法,但因为是硬件实现的,所以检查和上锁两步像是原子操作,一气呵成。
优点:实现简单,适用于多核,不像软件那样有并行逻辑漏洞(硬件实现像是原子操作,但这不叫原子操作) 缺点:不满足让权等待,持续执行while
3、Swap/XCHG指令
与TSL指令的硬件实现不同,但逻辑效果一样
信号量机制
记住一对原语wait(s)和signal(s)简写为P(S)、V(S)。用于实现进入和退出操作
整型信号量(跟上面的TSL有啥区别??)
记录型信号量:将待进入进程放入“等待队列”,不用一直while,符合了让权等待原则
s.value--意为给进程预支分配一个资源,--后小于0说明已经没有空余资源,进程进入等待队列;有进程退出时s.value++,意为空余资源+1,++后s.value<=0说明等待队列里有进程(不为空),这个队列里的进程已经拿走了刚刚余出的资源,所以wakeup一个进程。
信号量实现进程互斥:
临界资源是一种特殊的资源,同一时刻只能有一个进程访问,所以将其信号量设为1,称为互斥信号量
注意对于多个不同的临界资源,要设置多个不同的互斥信号量
信号量实现进程同步:
同步含义复习: 即必须保证两个进程中的代码的执行顺序
实现方式:
对于代码4,2执行完前s=0所以无法执行。只有2执行完,V使得s++,P才能执行,进而4执行
信号量实现进程的前驱关系: 其实前驱关系就是复杂点的嵌套进程同步
经典进程同步互斥问题
生产者消费者问题:
分析题目,共需要三个信号量:一个互斥信号量表示临界资源,实现,两个同步信号量分别表示缓冲区空余量和缓冲区填装量(产品量)实现
实现:从实现代码中也可以看出:实现互斥是在一个进程中进行一对PV;实现同步是在两个进程中一个P操作一个V操作
程序中先进行同步PV在进行互斥PV。能不能改变顺序,先锁死,在对同步信号量进行加减? 不能,如图
假设运行生产者程序,锁死后发现空余量为零,不能P操作,则等待消费者执行空余量的V操作。但消费者执行时发现临界资源被锁死,只能等待生产者释放。形成死锁
因此互斥的P操作必须在同步P之后。V操作不会导致进程阻塞,两个V的顺序可以交换
能否消费者的使用产品放到互斥PV之间? 可以但这会增加临界资源占用时间,降低效率
多生产者多消费者问题:
分析:分析同步问题时,不能从单个进程的角度分析,而是从事件的角度分析:
所以对于本题目:
但这道题中如果去掉互斥PV
仍然能正常运行
如果盘子能发那个两个水果,那去掉PV肯定不行。也就是说若缓冲区大小为1,不需要互斥信号量。 考试保险起见,最好设置
读者写者问题:
多个读者可以同时访问文件,多个写者不能同时访问文件,读者写者不能同时访问,写者访问文件时要保证没有其他读者写者正在访问
核心问题:读进程对写进程互斥,对读进程不互斥
读进程:读进程运行时,判断自己是不是第一个读进程,如果是则上锁(锁住写进程)。如果不是第一个,则跳过P(rw)绕开P判断,不会被拦住。每个读进程都count++记录正在访问的读者数量。一个读进程结束后count--,并判断自己是不是最后一个读者,如果是则解锁(不是的话,锁一直在),之后写进程就可以访问了。
存在问题:count=0时,两个并行的读进程可能在一个count++前,另一个就完成了if判断导致上了两个锁(后面的if同理)。因此需要保证 连续执行。加互斥锁:
现有问题:如果一直有读者进入,那么写者就一直等待---饥饿
加一个写优先的锁
(对于被同一个锁挡住的进程,会先来后到)
当写进程执行p(w)后,又会被p(rw)挡住。之后的读进程和写进程会被P(w)挡住直到这个写进程执行完。待所有已经进入的读进程执行完(执行全部V(rw)使rw=1),该写进程开始执行。
哲学家进餐问题:
五个人,五支筷子,吃饭。左手边的筷子、右手边的筷子,两个临界资源。这种情况可能发生死锁(一人拿了一根筷子)。解决方法:加互斥锁:一个人拿左手和右手筷子两个动作连续执行
管程
死锁饥饿死循环的区别
死锁:每个进程都在占有资源的同时等待其他进程手里的资源。导致所有进程阻塞,无法向前推进。对不可剥夺资源的不合理分配可能会导致死锁
死锁产生的必要条件:
互斥条件:争抢的资源是互斥的,不能同时被多进程使用
不剥夺条件:资源只能被进程主动释放,不会被抢夺
请求保持条件:进程在占有至少一个资源的同时又在请求别的资源
循环等待条件:存在循环等待链(A等B,B等C,C等A)
静态策略---预防死锁:破坏产生死锁的四个条件中的一个或几个
破坏互斥条件:spooling技术
破坏不剥夺条件:
方案一:“我不干了,资源不要了” 方案二:“我必须干,资源都给我”
缺点:实现复杂,只适用于易保存易恢复的资源,反复申请释放降低效率,需要很多种资源的进程可能导致饥饿
破坏请求保持条件
采用静态分配方法,即进程在运行前一次申请(注意:申请不是占有)完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。
实现简单。缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费。该策略也有可能导致进程饥饿: A需要资源1,B需要资源2。C需要这两种资源。若有多个A和B,一个A结束后,C和新的A都申请到了资源1,C还要申请资源2,而A需要的资源齐了,又开始运行,C又失去的资源1。只有AB同时完成,C才有可能凑齐资源开始运行。
破坏循环等待条件
缺点:1.不方便增加新的资源,因为可能需要重新分配所有的编号;2.进程实际使用资源的顺序可能和编号递增顺序不一致,导致资源浪费(如进程先用资源3再用资源1,但资源1一直被进程占有,处于空闲状态);3.编程麻烦。
动态策略---避免死锁
安全序列:
安全性算法:
用矩阵{a,b,c}表示某三种资源的量
银行家算法:
补充说明:实际进程运行中并非是一次性要求分配最大需求资源的,而是一点点的索要。系统有可能给进程1一点资源,又给了进程2一点资源……。安全型算法是银行家算法的一个步骤(第四步),用于评估第三步如果切实实施是否安全。
死锁的检测与解除
死锁的检测
资源分配图
P1P2是进程,R1R2是两类资源,点的数量是资源的总量,绿色的边是已分配,蓝色的边是进程需求(待分配)。图中P2还需要一个R1,但3个R1都已经分配出去了,所以P2暂时等待执行。P1还需要一个R2,正好剩余一个R2,所以P1可执行。
因此可以撤销P1的所有边。一个进程结束会将资源归还系统,使某些正在等待的进程开始进行,如图中P2就被激活
死锁的解除
资源剥夺:挂起(暂时放到外存)某些进程,抢占其资源
撤销进程:强制撤销部分死锁进程,释放资源
进程回退:将一个或多个死锁进程回退到足以避免死锁的地步
对谁动手?优先级低的,执行时间短的,快完成的,占用资源多的,批处理的