《内核设计与实现》第四章读书笔记
第四章:进程调度
- 进程(操作系统)程序的运行态表现形式。
- 进程调度程序,它是确保进程能有效工作的一个内核子系统。 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间。
进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.
最大限度地利用处理器时间的原则是,
只要有可以执行的进程,那么就总会有进程正在执行。
但是只要系统中可运行的进程的数目比处理器的个数多,就注定某一给定时刻会有一些进程不能执行。这些进程在等待运行。在一组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。
一、多任务
多任务操作系统:同时并发地交互执行多个进程的操作系统。
二、Linux进程调度
O(1)调度程序的新调度程序。
缺点:交互程序
RSDL--CFS公平调度的概念。
三、策略
四、Linux调度算法
五、进程调度入口
进程调度的主要入口点是schedule(),它定义在文件kernel/sched.c中。
六、用户抢占
用户抢占在以下情况时产生:
- 从系统调返回用户空间时。
- 从中断处理程序返回用户空间时。
七、内核抢占
Linux完整地支持内核抢占,在不支持内核抢占的内核中,内核代码可以一直执行
软实时的含义是,内核调度进程,尽力使进程在它的限定时间到来前运行,但内核不保证总能满足这些进程的要求。
相反,硬实时系统保证在一定条件下,可以满足任何调度的要求。
Linux对于实时任务的调度不做任何保证。
八、与调度策略和优先级相关的系统调用
- sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的调度策略和实时优先级。与其他的系统调用相似,它们的实现也是由许多参数检查、初始化和清理构成的。其实最重要的工作在于读取或改写进程task_struct的policy和rt_priority的值。
- sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的实时优先级。这两个系统调用获取封装在sched_param特殊结构体的rt_priority中。实时调度策略的的最大优先级:是MAX_ USERRT_PRIO减1。最小优先级等于1。
- 对于―个普通的进程,nice函数可以将给定进程的静态优先级增加一个给定的量。只有超级用户才能在调用它时使用负值,从而提高进程的优先级。nice函数会调用内核的set_user_nice函数,这个函数会设置进程的的task_struct的static_prio值。
九、与处理器绑定有关的系统调用
Linux调度程序提供强制的处理器绑定机制。
这种强制的亲和性保存在进程的一个位掩码标志中。该掩码标志的每一位对应一个系统可用的处理器,
默认情况下,所有的位都被设置。
十、放弃处理器时间
1.Linux通过sched_yield()系统调用,提供了一种让进程显式地将处理器时间让给其他等待执行进程的机制
2.是通过将进程从活动队列中移到过期队列中实现的
3.现在,应用程序甚至内核代码在调用sched_yield()前,应该仔细考虑是否真的希望放弃处理器时间。
4.可以直接调用sched_yield(),先要确定给定进程确实处于可执行状态,然后再调用sched_yield(),用户空间的应用程序直接使用sched_yield()系统调用就可以 。