进程调度

Linux与任何分时系统一样,通过一个进程到另一个进程的快速切换,达到表面上看来多个进程同时执行的神奇效果。进程切换本身已在第三章中讨论过,本章讨论进程调度,主要关心什么时候进程切换及选择哪一个进程来运行。


调度策略

传统Unix操作系统的调度算法必须实现几个互相冲突的目标:进程响应时间尽可能快,后台作业的吞吐量尽可能高,尽可能避免进程的饥饿现象,低优先级和高优先级进程的需要尽可能调和等等。决定什么时候以怎样的方式选择一个新进程运行的这组规则就是所谓的高度策略。

Linux的调度基于分时技术:多个进程以”时间多路复用”方式运行,因为CPU的时间被分成”片”,给每个可运行进程分配一片。当然,单处理器在任何给定的时刻只能运行一个进程。如果当前运行进程的时间片或时限到期时,该进程没有运行完毕,进程切换就可以发生。分时依赖于定时中断,因此对进程是透明的。不需要在程序中插入额外的代码来保证CPU分时。

调度策略也是根据进程的优先级对它们进行分类,有时用复杂的算法求出进程当前的优先级,但最后的结果是相同的;每个进程都与一个值相关联,这个值表示把进程如何适当地分配给CPU

linux中,进程的优先级是动态的。调度程序跟踪进程正在做什么,并周期性地调整它们的优先级。在这种方式下,在较长的时间间隔内没有使用CPU的进程,通过动态地增加它们的优先级来提升它们。相应地,对于已经在CPU上运行了较长时间的进程,通过减少它们的优先级来处罚它们。

在调度问题上,传统上把进程分类为”I/O受限”或”CPU受限”。前者频繁地使用I/O设备,并花费很多时间等待I/O操作的完成;而后者则需要大量CPU时间的数值计算应用程序。

另一种分类法把进程区分为三类:

交互式进程

这些进程经常与用户进行交互,因此,要花很多时间等待键盘和鼠标操作。当授受了输入后,进程必须被很快唤醒,否则用户将发现系统反应迟钝。典型的情况是,平均延迟必须在50-150ms之间。这样的延迟变化也必须进行媱,否则用户将发现系统不稳定定的。典型的交互式程序是命令shell、文本编辑程序及图形应用程序。

批处理进程

这些进程不必与用户交互,因此经常在后台运行,因为这样的进程不必被很快地响应,因此常受到调度程序的慢待。典型的批处理进程是程序设计语言的编译程序,数据库搜索引擎及科学计算。

实时进程

这些进程有很强的调度需要。这样的进程决不会被低优先级的进程阻塞,它们应该有一个短的响应时间,更重要的是,响应时间的变化应该很小。典型的实时程序有视频和音频应用程序,机器人控制程序及从物理传感器上收集数据的程序。

刚刚提到的两种分类法在一定程度上相互独立。例如,一个批处理进程是I/O受限型的,或是CPU受限型。在Linux中,调度算法可以明确地确认所有实时程序的身份,但没有办法区分交互式程序和批处理程序。Linux2.6调度程序实现了基于进程过去行为的启发式算法,以确定进程应该被当作交互式进程还是批处理进程。当然,与批处理进程相比,调度程序有偏爱交互式进程的倾向。

可以通过表7-1所列的系统调用改变调度优先级。更详细的内容将在”与调度相关的系统调用”一节中给出。


进程的抢占

如第一章所述,Linux的进程的进程是抢占式的。如果进程进入TASK_RUNNING状态,内核检查它的动态优先级是否大于当前正运行进程的优先级。如果是,current的执行被中断,并调用调度程序选择另一个进程运行。当然,进程在它的时间片到期时也可以被抢占。此时,当前进程用thread_info结构中的TIF_NEED_RESCHED标示设置,以便时钟中断程序终止时调度程序被调用。

例如,让我们考虑一种情况,在这种情况中,只有两个程序-------一个文本编辑程序和一个编译程序----正在执行。文本编程程序是一个交互式程序,因此它的动态优先级高于编译程序。不过,因为编辑程序交替于用户暂停思考与数据输入之间,因此它经常被挂起;此外,两次击键之间的平均延迟相对较长。然而,只要用户一按键,中断就发生,内核唤醒文本编辑进程。内核也确定编辑进程的动态优先级确实高于current的优先级,因此,编辑进程的TIF_NEED_RESCHED标志被设置,如此来强迫内核处理完中断激活调度程序。调度程序选择编辑进程并执行进程切换,文本编辑进程自己挂起等待下一次击键,编译进程恢复执行。

注意,被抢占的进程并没有被挂起,因为它还处于TASK_RUNNING状态,只不过不再使用CPU。此外,记住Linux2.6内核是抢占式的,这意味着进程无论是处于内核态还是用户态,都可能被抢占。


一个时间片必须持续多长?

时间长的长短对系统性能是很关键是:它既不能太长也不能太短。

如果平均时间片太短,由进程切换引起的系统额外开销就变得非常高。例如,假定进程切换需要5ms,如果时间片也设置为5ms,那么CPU至少把50%的时间花费在进程切换上。

如果平时时间处太长,进程看起来就不再是并发执行。例如,让我们假定把时间片设置为5s,那么,每个可运行进程运行大约5s,但是暂停的时间更长。

通常认为长的时间片会降低交互式应用程序的响应时间,但这往往是错误的。正如本章前面”进程的抢占”一节中所描述的那样,交互式进程相对有较高的优先级,因此,不管时间片是多长,它们都会很快地抢占批处理进程。

然而在一些情况下,一个太长的时间片会降低系统的响应能力。例如,假定两个用户在各自的shell提示符下并发输入两条命令,其中一条启动一个CPU受限型的进程,而另一个启动一个交互式应用。两个shell都创建一个新进程,并把用户命令的执行委托给新进程。此外,又假定这样的新进程最初有相同的优先级。现在,如果调度程序选择CPU受限型的进程执行,则另一个进程开始执行前就可能等待一个时间片。因此,如果这样的时间片较长,那么看起来系统就可能对用户的请求反应迟钝。

对时间片大小的选择是一种折衷。Linux采取单凭经验的方法,即选择尽可能长,同时能保持良好响应时间的一个时间片。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值