bonus是范围从0~10的值,值小于5表示降低动态优先级以示惩罚,值大于5表示增加动态优先级以示奖赏。
(3)活动和过期进程
活动进程:这些进程还没有用完他们的时间片,因此允许他们运行。
过期进程:这些可运行进程已经用完了它们的时间片,并因此被禁止运行,直到所有活动进程都过期。
2、实时进程的调度
当系统调用nice()和setpriority()用于基于时间片轮转的实时进程时,不改变实时进程的优先级而会改变其基本时间片的长度。
三、调度程序所使用的数据结构
1、数据结构runqueue
2、进程描述符
四、调度程序所使用的函数
调度程序依靠几个函数来完成调度工作,其中最重要的函数是:
scheduler_tick() 维持当前最新的time_slice计数器
try_to_wake_up() 唤醒睡眠进程
recalc_task_prio() 更新进程的动态优先级
schedule() 选择要被执行的新进程
load_balance() 维持多处理器中运行队列的平衡
1、scheduler_tick()函数
(1)更新实时进程的时间片
如果是先进先出(FIFO)的实时进程,函数scheduler_tick()什么都不做。
(2)更新普通进程的时间片
2、try_to_wake_up()函数
3、recalc_task_prio()函数
4、schedule()函数
(1)直接调用
(2)延迟调用
(3)schedule()完成进程切换时所执行的操作
内核线程没有自己的地址空间。
五、多处理器系统中运行队列的平衡
(1)调度域
(2)rebalance_tick()函数:在rebalance_tick()函数中调用load_balance()函数来进行负载调整
(3)load_balance()函数
(4)move_tasks()函数:调用can_migrate_task()函数、pull_task()函数(执行dequeue_task()函数和enqueue_task()函数)。
六、与调度相关的系统调用
1、nice()系统调用:sys_nice()服务例程处理nice()系统调用。nice()系统调用只维持向后兼容,它已经被setpriority()系统调用取代。
2、getpriority()和setpriority()系统调用:系统调用sys_getpriority()和sys_getpriority()服务例程完成的。
3、sched_getaffinity()和sched_setaffinity()系统调用
sys_sched_getaffinity()
sys_sched_setaffinity()
4、与实时进程相关的系统调用
(1)sched_getscheduler()和sched_setscheduler()系统调用
sys_sched_getscheduler()服务例程调用find_task_by_pid();
sys_sched_setscheduler()调用do_sched_setscheduler()函数。
(2)sched_getparam()和sched_setparam()系统调用
(3)sched_yield()系统调用
(4)sched_get_priority_in()和sched_get_priority_max()系统调用
(5)sched_rr_get_interval()系统调用
sys_sched_rr_get_interval()服务例程调用find_process_by_pid()检索与pid相关的进程描述符。