标签:
调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。
多任务操作系统就是能同时并发地交互执行多个进程的操作系统。
多任务系统可以划分为两类:
像所有unix的变体和许多其他现代操作系统一样,Linux提供了抢占式的多任务模式。
进程的时间片:进程在被抢占之前能够运行的时间是预先设置好的。
O(1)调度器虽然在拥有数以十计(不是数以百计)的多处理器的环境下尚能表现出近乎完美的性能和可扩展性,但是时间证明该调度算法对于调度那些响应时间敏感的程序却有一些先天不足,这些程序我们称其为交互进程一它无疑包括了所有需要用户交互的程序。
因此:
O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要运行的桌面系统上则表现不佳,因为其缺少交互进程,自2.6内核系统开发初期,开发人员为了提高对交互程序的调度性能引入了新的进程调度算法,其中最为著名的是“反转楼梯最后期限调度算法,该算法吸取了队列理论,将公平调度的概念引入了Linux调度程序。并且最终在2.6.23内核版本中替代了O(1)调度算法,它此刻被称为“完全公平调度算法”,或者简称CFS。
调度算法中最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。
通常做法:
优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。
优先级分为两类:
时间片:一个数值,它表明进程在被抢占前所能持续运行的时间。
调度策略必须确定一个默认的时间片。
Linux的CFS调度器并没有直接划分时间片到进程,而是将处理器的使用比例划分给了进程。
Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类。允许不同类型的进程可以有针对性地选择调度算法
调度器类允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。
调度器代码会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那一个程序。
将nice值映射到时间片的话,就必须将nice值对应到处理器的绝对时间。
进程调度的效果应如同系统具备―个备一个理想中的完美多任务同时,我们可以调度给它们无限小的时间周期,所以在任何可测量周期内,我们给予一个进程中每个进程同样多的运行时间。
所有的调度器都必须对进程运行时间做记账。
多数Unix系统,分配一个时间片给每一个进程。那么当每次系统时钟节拍发生时,时间片都会被减少一个节拍周期。
CSF调度算法的核心:选择具有最小、vruntime的任务。
具体做法:利用红黑树rbtree(以节点形式存储数据的二叉树)
进程调度的主要入口点是schedule(),它定义在文件kernel/sched.c中。
这一函数最重要的工作就是调用pick_next_state(),依次检查每一个调度类,并从最高优先级的调度类中,选择最高优先级进程。
休眠(被阻塞)的进程处于一个特殊的不可执行状态。
进程休眠的原因:
内核无论是在中断处理程序还是在系统调用后返回,都会检查need_resched标志,如果它被设置了,那么,内核会选择一个其他(更合适的进程投入运行。从中断处理程序或系统调用返回的返回路径都是跟体系结构相关的,在entry.S(此文件不仅包含内核入口部分的程序,内核退出部分的相关代码也在其中)文件中通过汇编语言来实现。
软实时:内核调度进程,尽力使进程在它的限定时间到来前运行,但内核不保证总能满足这些进程的要求
硬实时:系统保证在一定条件下,可以满足任何调度的要求。
Linux调度程序提供强制的处理器绑定机制。
Linux通过sched_yield()系统调用,提供了一种让进程显式地将处理器时间让给其他等待执行进程的机制。
进程调度程序是内核重要的组成部分,但是,满足进程调度的各种需要绝不是轻而易举的。
Linux内核的新CFS调度程序尽量满足了各个方面的需求,并以较完善的可伸缩性和新颖的方法提供了最佳的解决方案。
标签:
原文地址:http://www.cnblogs.com/bonjourvivi/p/5380584.html