7 进程调度

  • Linux与任何分时系统一样,
  • 一个进程到另一个进程的快速切换,
  • 多个进程同时执行的神奇效果。
  • 进程切换本身已在第三章中讨论过,
  • 本章进程调度(schednling),
  • 什么时候进行进程切换及选择哪一个进程来运行。

  • 三部分组成。
  • “调度策略”理论上介绍 Linux进行进程调度所做的选择。
  • “调度算法”实现调度所采用的数据结构和相应的算法。
  • “与调度相关的系统调用”描述影响进程调度的系统调用

  • 为简单,
  • 仍以80x86为例;
  • 假定系统采用统一内存访问( Uniform Memory Access),
  • 且系统时钟设定为1ms。

调度策略

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

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

在这里插入图片描述

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

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

  • 谈及调度时,
  • 把进程分类为“I/O受限”或“CPU受限”。
  • 频繁用IO设备,花多时间等待IO操作完成;
  • 需大量CPU时间的数值计算应用程序。

  • 另一种分类法把进程区分三类
  • 交互式进程
  • 花很多时间等待键盘和鼠标
  • 当接受输入后,进程须被很快唤醒,
    • 否则用户将发现系统反应迟钝。
    • 平均延迟50~150ms
  • 延迟变化也必须进行限制,否则系统是不稳定
  • 命令shell、文本编辑程序及图形应用程序。

  • 批处理进程( batch process)
  • 不必与用户交互,经常后台运行。
  • 这样的进程不必被很快响应,
    • 常受到调度程序的慢待。
  • 程序设计语言的编译程序
  • 数据库搜索引擎及科学计算

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

  • 一个批处理进程可能是I/O受限型的(如数据库服务器),或CPU受限型的(如图像绘制程序)。
  • Linux中,调度算法可明确地确认所有实时程序的身份,但没有办法区分交互式程序和批处理程序。
  • 2.6调度程序实现了基于进程过去行为的启发式算法,以确定进程应该被当作交互式进程还是批处理进程。
  • 与批处理进程相比,调度程序有偏爱交互式进程的倾向。
  • 通过表7-1所列的系统调用改变调度优先级。
  • 更详细在“与调度相关的系统调用”一节中给出。

在这里插入图片描述

进程的抢占

  • Linux的进程是抢占式
  • 如果进程进入TASK_ RUNNING,内核检査它的动态优先级是否>当前正运行进程的优先级
  • 是, current的执行被中断,并调用调度程序选择另一个进程运行(通常刚变为可运行的进程)。
  • 进程在它的时间片到期时也可被抢占
  • 此时,当前进程 thread info结构中的TIF_NEED_ RESCHED标志被设置,以便时钟中断处理程序终止时调度程序被调用

  • 文本编辑程序和编译程序一一正在执行。
  • 文本编辑程序是交互式程序,
    • 动态优先级高于编译程序。
  • 编辑程序交替于用户暂停思考与数据输入之间,
    • 经常被挂起;
    • 两次击键之间的平均延迟较长。
    • 只要用户一按键,中断就发生,内核唤醒文本编辑进程。
    • 内核也确定编辑进程的动态优先级确实高于current的优先级(当前正运行的进程,编译进程),
    • 编辑进程的 TIE NEED RESCHIED标志被设,如此来强迫内核处理完中断时激活调度程序。
    • 调度程序选择编辑进程并进程切换;
    • 编辑进程很快恢复执行,并把用户键入的字符回显在屏幕上。
    • 处理完字符时,文本编辑进程自己挂起等待下一次击键,编译进程恢复执行

  • 被抢占的进程并没被挂起,还处于TASK_ RUNNING
  • 不过不再使用CPU。
  • Linux2.6内核是抢占式的,
    • 进程无论是处于内核态还是用户态,
    • 都可能被抢占,
    • 第五章的“内核抢占”一节深入讨论过这个特征

调度算法

  • 早期Linux
  • 在每次进程切换时,内核扫描可运行进程的链表,
  • 计算进程优先级,
  • 选“最佳”进程来运行。
  • 缺点是
    • 选择“最佳”进程所要消耗的时间与可运行的进程数量相关,
    • 运行数千个进程的高端系统中要消耗太多的时间

  • 2.6调度算法复杂多。
  • 该算法较好地解决了与可运行进程数量的比例关系,
  • 它在固定的时间内(与可运行的进程数量无关)选中要运行的进程。
  • 也很好地处理了与处理器数量的比例关系,
    • 因为每个CPU都拥有自己的可运行进程队列。
  • 新算法较解决区分交互式进程和批处理进程。
  • 在高负载系统中,
    • Linux2.6中交互应用的响应速度比早期的 Linux版本要快。

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

  • 长短对系统性能很关键
  • 太短,由进程切换引起的系统额外开销就高。
    • 进程切换需要5ms
    • 时间片也设置为5ms,
    • 50%的时间花费在进程切换上(注2)。

在这里插入图片描述

  • 太长,进程看起来就不是并发执行。
  • 设为5s,每个可运行进程运行大约5s,但是暂停的时间更长(一般是5s乘以可运行进程的个数)。

  • 长的时间片会降低交互式应用程序的响应时间,但这往往是错误
  • 如前面“进程的抢占”描述,
  • 交互式进程有较高的优先级,
  • 不管时间片是多长,它们都会很快地抢占批处理进程。

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

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

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/107752943