linux内核进程调度系列之调度概述

来源:互联网 发布:sql server 权限管理 编辑:程序博客网 时间:2024/06/05 09:09
多任务操作系统分为非抢占式多任务和抢占式多任务。linux采用的是抢占式多任务的模式,这就意味着进程对CPU的占用时间是由操作系统决定的,跟具体的说,由操作系统的进程调度程序所决定的,这个章节就介绍关于进程的调度策略。
一、调度策略
1、其实进程的调度策略和进程的类型有关
第一种分配方法:CPU消耗型和I/O消耗型,前者需要大量的CPU时间用于熟知的计算,后者则需要花费大量的时间等待I/O操作完成;
第二种将进程分为三种:
① 交互式进程:这类进程需要大量的人机交互,因此会不断地休眠,等待鼠标、键盘输入操作将其唤醒。这类进程对系统响应时间要求比较高,否则用户体验会很差;
② 批处理进程:这类进程因为不需要与用户交互,因此经常在后台运行,相比交互式进程能够忍受响应的延迟,比如编译器;
③ 实时进程:这类进程对系统的响应时间有很高的要求,他们需要短的响应时间,并且这个时间的变化非常小。
我们称与实时进程相对应,交互式进程和批处理进程统称为普通进程。
2、进程依据自身的类型,采用不同的调度策略:
  ①SCHED_NORMAL:默认调度策略,针对普通进程,如果没有特殊指定,新创建的默认使用此调度策略;
  ②SCHED_FIFO:针对实时进程的先进先出调度。一旦占用CPU则一直运行,直到有更高优先级任务到达或自己放弃。适用于时间要求比较高,运行所需时间短的进程;
  ③SCHED_RR:针对实时进程的时间片轮转调度,与SCHED_FIFO相比,有时间片限定。进程的时间片用完后,会重新分配时间片,但会将其置于队列末尾。适用于每次运行时间比较长的进程;
  ④SCHED_BATCH:针对批处理进程。
  ⑤SCHED_IDLE:使用此策略的进程拥有最低的优先级,在CFS调度算法引入了此策略。
二、进程调度的目标
1、高效:意味着在同等条件下尽可能完成更多的任务;
2、加强交互性能:即使系统处于相当负载的情况下,也要能够保证系统的响应;
3、保证公平和避免饥饿:在河里设定的时间范围内,没有进程处于饥饿状态;
4、SMP调度:调度程序必须支持多处理系统;
5、软实时调度:这意味着系统能够有效地调度有严格时间要求的进程。
三、进程的nice值
1、nice值是每个进程都会具有的属性,是一个能够影响进程静态优先级的数字,进而也能影响动态优先级。
2、nice值为-20~19之间的整数,默认去中间值0。较高的nice值使进程运行在较低的优先级上,相反较低的nice值使进程运行在较高的优先级上。
3、一般来说,控制进程的优先级,主要是靠修改nice值。
四、优先级
普通进程有两种优先级:静态优先级和动态优先级;实时进程增加了一种实时优先级。
1、静态优先级:不会随时间而改变,内核不会主动去修改它,只能通过系统调用nice值去修改;
  计算静态优先级,通过一个公式:static_prio=MAX_RT_PRIO+nice+20,其中MAX_RT_PRIO宏值为100,nice取值范围为-20~19,则金泰优先级取值范围是100~139
2、动态优先级:调度程序通过增加或减少进程静态优先级的值来奖励I/O消耗型进程或惩罚CPU消耗型进程,调整后的优先级即称之动态优先级,也就是我们常说的进程优先级。
  普通进程的优先级是由一个关于静态优先级和进程交互性函数关系计算得来,随任务的实际运行情况调整。
3、实时优先级:
  实时进程的优先级只对于实时进程有意义,存储在rt_priority字段,取值0~MAX_RT_PRIO-1。其与动态优先级为线性关系。
     prio=MAX_RT_PRIO-1-rt_priority
五、时间片
1、在完全公平调度器CFS被正式并入内核之前,时间片是各种调度算法一个很重要的概念,它指定了进程在被抢占前所能持续执行的时间。那么调度器的一个重要的目标就是有效的分配时间片,以便提供良好的用户体验。
2、时间片过长导致交互式进程的响应不佳,过短则会明显增加进程间切换所带来的消耗,为解决这个矛盾:内核采取以下策略:
(1) 提高交互式进程的优先级,同时提供给它们较长的默认时间片;
(2) 不需要进程一次用完自己所有的时间片,他可以分为多次使用。