Linux的调度算法
(1)O(N)调度器
O(N)调度器发布于1992年,从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程。
- 优点:操作简单,便于理解。
- 缺点:时间消耗太大,在众多可运行进程或者多处理器的环境下都难以胜任
(2)O(1)调度器
O(1)调度器在Linux2.5系列内核开始至Linux2.6.23版本之前,优化了选择下一个进程的事件,为每个CPU维护一组进程优先级队列,每个优先级一个队列,这样在选择下一个进程时,只需要查询优先级队列相应的位图即可知道哪个队列中有就绪进程,所以查询时间为常数O(1)。
- 优点:适合于大型服务器的负载场景。
- 缺点:对处理桌面系统的交互式进程时存在问题,进程反应缓慢,并且对NUMA支持也不完善
(3)CFS调度器
Con Kolivas(麻醉师)提出了RSDL(Rotating Staircase Deadline Scheduler, 翻转楼梯最后期限调度算法),该算法吸收了队列理论算法,将公平调度的概念引入了Linux调度程序中,但没有被社区所采纳。Ingo Molnar(RedHat)借鉴了RSDL的思想,提出了CFS调度算法。CFS算法在Linux2.6.23后的版本使用。
进程的行为
- I/O密集型:进程的大部分时间用来提交I/O请求或是等待I/O请求。多数的用户界面程序(GUI)在多数的时间里等待鼠标或键盘的交互操作。
- CPU密集型:进程把时间大多数用在执行代码上,除非被抢占,否则一至不停地运行。例如编译代码、MATLAB等。
当然这种分法不是绝对的,进程可以同时展示这两种行为,比如X Window服务器及时I/O密集型,也是CPU密集型。进程也可以一会是I/O密集型,一会又是CPU密集型。通常I/O密集型的进程优先级比CPU密集型高。Linux作为通用系统,因此需要在调度策略上对I/O密集型、CPU密集型的两个矛盾中寻找平衡:进程响应迅速和最大系统利用率。
进程优先级
进程PCB描述符struct task_struct数据结构中有4个成员描述进程的优先级:prio、 static_prio、 normal_prio、 normal_prio。
- (1)prio保存着进程的动态优先级,是调度类考虑的