进程调度

一、调度策略
传统上把进程分类为“I/O受限”或“CPU受限”,另一种分类法为:交互式进程、批处理进程、实时进程。
二、调度算法
1、普通进程的调度
     内核使用从100(最高优先级)到139(最低优先级)的数表示普通进程的静态优先级。
(1)基本时间片
技术分享
2)动态优先级和平均睡眠时间
技术分享
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相关的进程描述符。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。