操作系统中进程调度策略
我是一个进程调度器
我的职责是调度计算机内所有的进程
为他们分配cpu资源
-
FCFS
先来先服务(first come first serve),每个进程按照进入内存的时间顺序排成一队。每当cpu上的进程完成或遇到阻塞了,就会选择队伍前面的进程,带他去往cpu执行。
当然,这个调度策略的不足也很明显,虽然很公平看似,先来的人先服务,但是后来的人排队时间太长了,浪费很多时间,有可能前面的人要运行10000秒,而我只需要运行1秒钟,我为了运行一秒钟而等待很长很长的时间,太不值得了。 -
SJF
最短任务优先调度
每次选择时间最短的进程进行处理,因此在排队的时候把短进程排在前面。
这一次虽然进程的平均响应时间大大减小,但是有人又不干了。
一些长进程一直抱怨:那些短进程天天插队,我拍了几天的队,还轮不上我,这就导致了一些长进程长时间得不到cpu 的响应,造成了“饥饿”的现象。
这可是个大问题啊,我想,虽然FCFS算法响应时间可能很长,但是很公平呀,保证了每个人都能享受到服务,SJF就不一样了,有可能永远都享受不到服务呢,这太可怕了。
那么有什么方法能既帮助到短进程,又帮助到长进程呢? -
HRRN
经过综合考察和考虑,决定了考量进程的两个属性:等待时间和需要服务的时间。
为了量化,我们制定了一个公式:响应=(等待时间+服务时间)/服务时间。响应比高的进程会被优先响应。我们称之为高相应比优先(High Response Ratio Next)。
虽然这个算法的要求工作时间增加了,因为要计算响应比嘛,但是保证了 长进程和短进程都会被服务到,既保证了公平性,又保证了长短进程都可以被服务到,所以这个策略还是蛮不错的。
但是随着计算机的普及用户数量不断上升,并发,这个问题又出现了,一个运行多个程序的需求出现了,但是处理器只有一个,那怎么办呢?
“伪并行”
什么是伪并行呢,就是看起来是并行的,可实际上是串行的。每个进程短时间内交替使用我的资源,在我们看来,就像是在并行一样,这就是伪并行。。 -
RR
时间片轮转算法(Round Robin)
这个算法中,每个进程轮流的使用cpu资源,只不过他们开始运行的时候,我会打开一个定时器,然后定时器到时间了,会强迫他们切换到下一个时间片。
那么时间片的时间这么分配呢?
直观的看,时间片越短,相同时间内能有更多的进程被服务到,,可是cpu说频繁的切换进程会影响资源。时间片过长的话,短交互指令会变慢,使用具体怎么取,还得看交互时间。
这一算法,cpu 的工作量大大提高了,以前十几秒可能都不需要切换一次进程,这次倒好,一秒钟切换好几次。 -
VRR
时间片算法看似又很公平啊,每个人的分配相同的时间,但是事实是这样吗?
有些io密集设备不这样认为的,他们说:
调度器大哥,时间片轮转没有照顾到我们这样的进程啊,我们经常在cpu没带到一半的时候,就遇到了阻塞操作,被赶了下去,而且我们在阻塞队列要等待很长的时间啊,等阻塞队列结束,还要进入就绪队列,在就绪队列排好长的队伍。
考虑到这些需求,我决定创建一个新的辅助队列。阻塞接触的进程,进入这个辅助队列,进行进程调度的 时候,会优先考虑这些进程。
这就是虚拟轮转法(Virtual Round Robin) VRR -
优先级调度算法
优先级越高越先分配到CPU,相同优先级先到先服务,存在的主要问题是:低优先级进程无穷等待CPU,会导致无穷阻塞或饥饿;解决方案:我会将那些低优先级等待时间长的进程提高他们的优先级。
死锁
-
死锁的概念
在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。 -
死锁产生的必要条件
互斥
占有并等待
非抢占
循环等待 -
死锁的处理
解决死锁的方法一般有:死锁的预防,死锁的避免,死锁的检测,死锁的解除,鸵鸟策略等等 -
死锁的预防
1.打破互斥条件:
允许进程同时访问某些资源。但是有些资源本身就不能被共享访问,所以这种方法大多没有效果
2.打破占有并等待条件:
可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。
3.打破不可抢占
允许进程从某些占有者那里夺取资源
也就是说,当进程占有了某些资源的时候,在其申请其他资源而得不到满足的时候,它必须释放所占有的所有资源给其他进程使用。这种死锁预防方法实现很困难。
4.打破循环等待
实现资源的有序分配。