现代操作系统——调度

进程行为

几乎所有的进程都是I/O请求和计算都是交替突发(burst)的。
比如,CPU不停的运行一段时间,然后发出一个系统调用来读写文件,系统调用完成后又开始计算,直到需要更多的I/O操作为止。
在这里插入图片描述
a)称为计算密集型(compute-bound)又称为CPU密集型。计算密集型具有较长时间的CPU集中使用和较小频度的I/O等待。
b)称为I/O密集型(I/O-bound)。I/O密集型具有较短的CPU集中使用时间和频繁的I/O等待;频繁的I/O等待是指在I/O请求间较少进行计算,而不是指I/O请求特别长。

随着CPU越来越快,更多的进程倾向于I/O密集型。I/O密集型进程的调度就更加重要,调度的基本思想是,对I/O密集型进程,要让他尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。

调度目标

在这里插入图片描述
◉公平(Fairness):每个进程获得的时间片大小一样,相似的进程应该得到相似的服务。
◉平衡(balance):保持系统各类资源平衡,所有部分都尽可能忙碌(I/O,CPU,磁盘内存)。
◉周转时间:从一个批处理作业从提交时刻开始到该作业完成时刻为止的平均时间。也可以用等待时间+执行时间来计算。
◉带权周转时间 = 周 转 时 间 执 行 时 间 \frac {周转时间}{执行时间}
◉响应比 = 1 + 等 待 时 间 执 行 时 间 \frac {等待时间}{执行时间}
◉CPU利用率(CPU utilization):常用来对批处理系统的度量,作为评价是调度算法的指标。

调度算法的分类

根据如何处理时钟中断,可以把调度算法分为两类:
◉非抢占式调度算法:挑选一个进程运行直到进程被阻塞或直到该进程自动释放CPU。在时钟中断发生时,不会进行调度,处理完时钟中断后,如果没有更高优先级的进程等到,被中断的进程继续执行。
◉抢占式调度算法:挑选一个进程运行到某个固定时段的最大值,如果时间结束进程没执行完,该进程被挂起 ,另一个进程运行。进行抢占式调度处理,需要在时间段末尾发生时钟中断,把CPU的控制还给调度程序

根据不同的环境,调度算法有不同的分类:
◉批处理(Batch)
◉交互式(Interactive)
◉实时(Real-time)

批处理系统中的调度

先来先服务(first-come first-served)

先来先服务是批处理系统中应用最多的调度算法,也是最简单的非抢占式算法。
对于所有的就绪进程,有一个单一队列,进程按照他们请求CPU的顺序使用CPU。
但是,使用该算法,进程不会因为运行时间太长而发生中断,因此对于一个长作业后的短作业来说是非常不友好的。

最短作业优先(shortest job first)

最短作业优先是一种适用于运行时间可预知的非抢占式算法。
理解起来也很简单,就是在进行调度的时候优先把CPU分配给运行时间最短的进程。
但是,使用该算法,由于短任务流的出现可能会导致长任务迟迟无法使用CPU的情况,也就是饥饿(starvation)

最短剩余时间优先(shortest remaining time next)

最短剩余作业优先是最短作业优先的抢占式版本。调度程序总是选择当前剩余运行时间最短的进程运行。

最高响应比优先(high response-ratio first)

最高响应比优先算法,调度程序选择当前响应比最高的进程投入运行。

交互系统中的调度

轮转调度(round robin)

轮转调度是最简单,最公平且使用最广的算法。
每个进程被分配一个时间片(quantum),允许进程在该时间片内运行。如果时间片结束前进程没结束,CPU被剥夺给下一个进程使用;如果时间片结束前进程执行完(或阻塞)则CPU立即进行切换。

在这里讲一下进程切换
进程切换(process switch)也叫上下文切换(context switch)。进程切换是需要时间对管理数据进行处理的,比如保存当前寄存器的值,装入内存映像,更新各种表格,清除和重新调入内存高速缓存等。

但进程切换的时间不包含在时间片内。
针对时间片长短的设置:
如果时间片设置的比较短,那么对频繁的交互请求响应比较快,用户可以获得更好的体验;但是响应的会导致CPU的效率下降,比如时间片大小设置为4ms,但是进程切换的时间开销为1ms,这样CPU就有20%的时间浪费在管理上。
如果时间片设置的过长,就不会经常发生抢占(因为在时间片结束之前进程已经执行完或是进入阻断),所有的进程切换都是在逻辑上确实有必要的时候,因此改善了性能;但是对于短的交互请求,响应时间可能会变得很长,让人难以接受。

优先级调度(priority)

在这里插入图片描述
在轮转调度基础上(就是有时间片分配),给每个可执行(runable的进程都赋予一个优先级,高优先级的进程先执行,低优先级的后执行。
为了防止高优先级进程无休止的运行,可以对优先级进行动态的调整。可以在高优先级进程运行一段时间后降低高优先级进程的优先级,也可以提高低优先级进程的优先级,从而达到对优先级进行调配正的目的。
如果不对优先级进行调整,可能会导致低优先级进程产生饥饿现象。

线程调度

事实上,有关线程调度的内容在线程模型那里都有提及
◉用户级线程,内核并不知晓线程的存在,和进程调度没有区别。运行时系统的调度程序只决定了那个程序运行,由于缺少时钟中断,线程可以随意运行多久(即使把进程的时间片用完)。但是这种不合群的行为不会影响到其他进程里的线程;而通常同一进程的线程属于合作关系,所以一般也不会有太大问题。
◉内核级线程,时间片直接赋予给线程。

两种层次的线程调度主要差别在于性能上:
◉用户级进程的进程切换只需要少量的指令,而内核级线程需要完整的上下文切换(与进程调度的进程切换类似),修改内存映像,清楚和刷新高速缓存内存,这就导致了若干数量级的延迟。
◉另外,内核级线程不会出现用户级线程那样因为一个线程的阻塞导致同一进程的所有线程都不能运行的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值