目录
1 处理器调度的基本概念、层次
1.1 基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要某种规则来决定处理这些任务的顺序,这就是 “调度” 研究的问题。
处理器调度考虑如何从多个作业中选择一些作业加载到内存中为其创建进程(称为作业调度或高级调度、长程调度)和如何从多个进程中选择一个进程占用处理器运行(称为进程/线程调度、低级调度或短程调度)的问题。
处理器调度策略与作业类型密切相关。用户作业包括批处理作业和终端交互型作业。 批处理作业进入系统后在磁盘后备队列中等候作业调度,终端交互型作业一旦被接纳,直接创建进程,接受进程调度。
从系统接收到运行结束退出系统为止,作业可能要经历如下图所示的三级调度过程:高级调度、中级调度和低级调度。
高级调度发生在新进程的创建中,它决定一个进程能否被创建,或者创建后能否被置成就绪态;中级调度反映到进程状态上就是挂起和解除挂起,它根据系统的当前负荷情况决定停留在主存中的进程数;低级调度决定哪一个就绪进程占用CPU 。
调度层级与调度队列的关系如下图。
1.2 三个层次
1.2.1 高级调度(作业调度)
由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。
高级调度指按照一定原则从外存上处于后备作业队列的作业中挑选若干作业进入内存,为其分配内存等必要资源,并建立相应的进程(建立PCB),以使它们获得竞争处理机的权利。
高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的实际需要操作系统来确定,但调出的实机必然是作业运行结束才调出。
1.2.2 中级调度(内存调度)
中级调度(平衡调度、中程调度)是进程对换的一部分。中级调度决定哪些进程参与竞争处理器资源,途径是把一些进程换出主存,使之进入“挂起”状态,不参与进程调度; 或者将进程对换到内存中,解除挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中。中级调度根据主存资源决定主存中所能容纳的进程数目,并根据进程的当前状态来决定外存和主存中进程的对换。中级调度起到平滑和调整系统负荷的作用,提高主存利用率和系统吐吞率。
1.2.3 低级调度(进程调度)
低级调度(进程调度、线程调度、短程调度)的主要功能是按照某种原则决定就绪队列中的哪个进程或内核级线程获得处理器,并将处理器出让给它进行工作。低级调度执行分配CPU的程序称为分派程序。
低级调度程序是操作系统最为核心的部分,执行十分频繁。低级调度策略的优劣直接影响到整个系统的性能。
低级调度是各类操作系统必须具有的功能;在纯粹的分时或实时操作系统中,通常不需要配备高级调度,而仅配置低级调度;一般的操作系统配置了高级调度和低级调度;引进中级调度有利于提高主存利用率和作业吞吐量。
低级调度执行的时机是当前进程阻塞或可能抢占当前运行进程的事件发生时,这类事件有时钟中断、操作系统调用、中断和信号(如信号量)。
1.3 三种调度的联系和对比
2 进程调度的时机、切换与过程
2.1 时机
进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。
需要进行进程调度与切换的情况
当前运行的进程主动放弃处理机
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞(如 等待I/O)
当前运行的进程被动放弃处理机
- 分给进程的时间片用完
- 有更紧急的事需要处理(如 I/O中断)
- 有更高优先级的进程进入就绪队列
不能进行进程调度与切换的情况
- 在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换
- 进程在操作系统内核程序临界区中
- 在原子操作过程中(原语)。原子操作不可中断,要一气呵成(如修改PCB中进程状态标志,并把PCB放到相应队列)
2.2 临界区与内核程序临界区
进程在操作系统内核程序临界区中不能进行调度与切换 ✔
进程处于临界区不能进行处理机调度 ✘
临界资源:一个时间段内只允许一个进程使用的资源(比如qq微信不可以同时使用摄像头)。各进程需要互斥的访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
如上图,假设进程访问就绪队列,此时没有退出临界区(还没解锁)就进行进程调度,但是进程调度相关程序也需要访问就绪队列,但此时就绪队列又被锁住了,因此又无法顺利进行进程调度。
内核程序临界区访问的临界资源如果不尽快释放,极有可能影响到操作系统内核的其他工作。因此在访问内核程序临界区期间不能进行调度和切换。
如上图,在打印机打印完成前,进程一直处于临界区内,临界资源不会解锁。但打印机又是慢速设备,此时如果一直不允许进程调度的话就会导致CPU一直空闲。
普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进行调度与切换。
2.3 进程切换与过程
“狭义的进程调度” 与 “进程切换” 的区别:
狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况需要进程切换)
进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。
广义的进程调度包含了选择一个进程和进程切换两个步骤。
进程切换的过程主要完成了:
- 对原来进程各种数据的保存
- 对新的进程的各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)
注:进程切换是有代价的,因此如果过于频繁的进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间浪费在进程切换上,而真正用于执行进程的时间减少。
2.4 进程调度的方式
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧急的任务到达,当前进程依然会继续使用处理机,直到进程终止或主动要求进入阻塞态。(实现简单,系统开销小但是无法处理晋级任务,适合于早期的批处理系统)
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要的那个进程。(可以优先处理紧急的进程,也可以实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合分时操作系统,实时操作系统)
3 调度算法的评价指标
操作系统调度程序所使用的算法称为调度算法。根据调度所要达到的目标,设计调度 算法通常应考虑如下原则。
1) 资源利用率
资源包括CPU及I/O设备等,其中CPU资源的利用率最为关键。在一定I/O操作等待 时间的比率下,运行程序的道数越多,CPU空闲时间所占百分比越低。CPU利用率的计算 公式如下。
CPU利用率=CPU有效工作时间/CPU总的运行时间
CPU总的运行时间=CPU有效工作时间+CPU空闲等待时间
利用率=忙碌的时间/总时间
2) 吞吐率
吞吐率是单位时间内CPU处理的作业数。这是批处理系统调度性能的一个指标。显然, 处理的长作业多则吞吐率低,短作业多则吞吐率高。
系统吞吐量:单位时间内完成作业的数量
系统吞吐量=总共完成了多少道作业/总共花了多少时间
3) 公平性
调度算法要确保每个用户每个进程获得合理的CPU份额或其他资源份额,不会出现 “饥饿”现象。
4) 响应时间
交互式进程从提交一个请求到接收到响应之间的时间间隔称为响应时间。响应时间包括命令传输到CPU的时间、CPU处理命令的时间和处理结果返回终端的时间。使交互式用户的响应时间尽可能短,或尽快处理实时任务,是分时系统和实时系统衡量调度性能的一个重要指标。
5)周转时间