0%

进程调度

[toc]

4.1 调度的概念#

从就绪队列中选一个进程分配给处理机
处理机调度是操作系统进行多道程序运行的核心

4.1.1 三级调度#

操作系统中有三种调度:

  • 作业调度(外存到内存)
    属于一种高级调度
    从外存队列中选一批作业进入内存进行执行。
    可以理解为有人一次性执行了10000个脚本,这时候的脚本作业是有调度机制的,没法一次性全部加载到内存中执行。
  • 内存调度(外存->内存)
    就是决定将哪个挂起状态的进程从外存重新调回内存。 但是此时还没开始跑任务,只是从外存切换到内存就绪队列
  • 进程调度(内存->CPU)
    从内存就绪队列中选择进程, 进行执行。

分别是从高级到低级, 频率从低到高

4.1.2 常见调度方式#

剥夺式调度: 按优先级、短时间、时间片进行抢占式调度,会强制暂停某些进程
非剥夺调度: 当某个进程完成,或者出现阻塞,才会重新分配CPU。 不可用于分时和实时系统。

linux属于剥夺还是费伯多?

4.1.3 调度系统设计的评价准则#

CPU利用率: CPU运行时间/ 空闲时间加运行时间
系统吞吐量: 单位时间内完成的作业数量
周转时间: 从提交到作业完成的时间, 包括了等待\IO等
等待时间: 在就绪队列中等待的时间之和
响应时间: 从提交请求到系统首次擦还是你哼响应的时间。

4.2 进程调度算法#

4.2.1 FCFS先来先服务#

  • 不可抢占式
  • 用于作业调度和进程调度
  • 有利于CPU繁忙作业,即基本都在高强度计算,不会有IO操作等。这时候一般不允许抢占。

4.2.2 短作业优先#

  • 从优先就绪队列中选择 预估运行时间最短的作业
  • 可能导致长作业的饥饿
  • 但是能让 平均等待时间最短, 但一般不考虑这个

4.2.3 优先级调度算法#

  • 选择优先级最高的作业运行
  • 有2种优先级判断方式:
    1. 静态优先:进程创建时已经决定了优先级
    2. 动态优先: 根据CPU占有时间、等待时间,判断他是否属于IO繁忙,并调整优先级

4.2.4 高相应比优先#

  • 相应比= (等待时间+ 估计运行时间) / 估计运行时间
    这样等待的越久,就越有可能出队,避免4.2.2中的长作业饥饿

4.2.5 时间片轮转#

  • 时间片用完,立刻切换到下一个进程
  • 时间片的长短,取决于系统的处理能力、队列中的进程数量、系统响应时间

4.2.6 多级反馈队列调度算法#

  • 设置多个不同优先级的队列。
  • 队列优先级越高, 运行的时间片就越小
  • 每当有一个作业跑完1次时间片,就放到下一级队列(相当于降低优先级)
  • 当新进程进入,默认放入高优先级队列。对于短作业而言可以立刻响应,而他如果是长作业,则会逐步降低优先级。
  • 相当于结合了短作业优先、 优先级调度、 时间片3个算法的优势

4.2.7 linux和windows中的调度算法#

linux的调度算法

Linux 标准内核实现两个调度类:采用 CFS 调度算法的默认调度类和实时调度类.

CFS 调度程序并不采用严格规则来为一个优先级分配某个长度的时间片,而是为每个任务分配一定比例的 CPU 处理时间。每个任务分配的具体比例是根据友好值来计算的。友好值的范围从 -20 到 +19,数值较低的友好值表示较高的相对优先级。具有较低友好值的任务,与具有较高友好值的任务相比,会得到更高比例的处理器处理时间。默认友好值为 0。
57c9082810a435e9ddcdc689b8698b6b0bb3b3a3