面试题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可以看进程的调度方式。

进程调度与线程调度的联系

img

https://zhuanlan.zhihu.com/p/554149581

posted @ 2023-05-08 14:53  John_Ran  阅读(32)  评论(0编辑  收藏  举报