面试题5-8
CPU调度算法
Motivation:
多道程序的初衷是最大化CPU利用率。
多个进程同时存在于内存中叫做并发。当一个进程不使用CPU的时候,调度另一个进程占用CPU。
概念:cpu burst,cpu指令花的时间。I/O burst,I/O使用的时间。在CPU处于IDEL的时候,在ready的process中挑选一个执行,这个过程就是由CPU调度程序来执行的。
非抢占式调度(Non-preemptive scheduling):一旦进程开始执行,就执行到终止或者等待状态。
抢占式调度(preemptive scheling):进程在执行中会被优先级高的,或者时间片用完被终止的调度。
CPU调度的metric:CPU占用率,响应时间,等待时间,周转时间(提交到运行结束),吞吐率,公平性。
一、FCFS,First come,first-served
以前的FCFS会让一个进程运行直到结束(其中包括I/O)。现在阻塞会让出CPU。
FCFS的优点是简单,但是缺点是如果长进程排在短进程后面。等待时间和周转时间都很长。
二、时间片轮转:round robin。
使用的策略是:每个进程都可以得到CPU的相同时间,当时间用完了,那就要让出cpu,排到ready queue的尾部。这是一种抢占式的算法,每一个都能得到cpu 1/n的时间,q个时间片。每一个进程等待的时间不会超过(n-1)q。
RR分析:时间片选取对算法性能影响大,取的小性能就卡在context swtiching,太大响应速度下降。上下文花费的时间大概是0.1ms到1ms。一般time slice取10-200ms。
RR特点:公平公正,但是对长进程有额外的开销。
RR不一定比FCFS好,在长进程的情况下,RR的周转时间是相当糟糕的。
三、最短作业优先(SJF)。
下一次调度时选择需要时间最短的进程(短进程FCFS)。这是一个非抢占式的算法,也可以变成一个抢占式的算法(SRJF)。这个算法的等待时间可以被证明是最优的。缺点:无法预测一个进程所需要的时间,而且长进程有饥饿现象。而且它是一个不公平算法。
四、优先级调度算法
考虑优先级不同的时候,用nice值来体现。0是最高优先级。在就绪队列中找最高优先级的进程来running。优先级调度算法可以被设计为抢占式的,也可以被设计为非抢占式的。
优先级:动态优先级+静态优先级。静态优先级容易产生饥饿现象。动态优先级(aging 算法)。主要就是根据在cpu待的时间长降低优先级,或者等待时间长增大优先级。
Linux线程调度
线程调度方式:
如果是normal的线程调度。priority一般会被设置为0。SCHED_OTHER, SCHE_IDLE, SCHE_BATCH。
如果是real-time 线程 priority value 在1-99之间。值越大优先级越高。SCHED_FIFO, SCHED_RR。
SCHED_OTHER: time-sharing policy(RR)。这里面用的优先级是NICE值,nice值[-20,19],PR=20+nice[0,39]。PR高,优先级就低。NICE值只对normal的有效。
SCHED_FIFO和SCHED_RR的PR是 -1 - priority_value。
介绍一下SCHED_OTHER的具体实现。首先是time-slice,然后结合了动态优先级,其中还有CFS算法。
real-time的SCHED_FIFO调度。直接用SCHED_FIFO(under same PR),还有一些是SCHED_RR(under the same PR)。
ps -eLf可以看到多线程tid的信息。LWP(Light-weight process)。chrt -p pid可以看进程的调度方式。