进程管理和调度——完全公平调度类

完全公平调度类

kernel/sched_fair.c
static const struct sched_class fair_shced_calss = {
.next = &idle_sched_class,
.enqueue_task = enqueue_task_fair,
.dequeue_task = dequeue_task_fair,
.yield_task = yield_task_fair,
.check_preemp_curr = check_preempt_wakeup,
.pick_next_task = pick_next_task_fair,
.put_prev_task = put_prev_task_fair,
.set_curr_task = set_curr_task_fair,
.task_tick = task_tick_fair,
.task_new = task_new_fair,
}

===========================
2.6.1 数据结构
首先,我们介绍一下CFS的就绪队列。
kernel/sched.c
*nr_running 计算了队列上课运行进程的数目,load维护了所有这些进程累积负荷值。
*min_vruntime跟踪记录队列上所有进程的最小虚拟运行时间。
*tasks_timeline是一个基本成员,用于在按时间排序的红黑树中管理所有进程。rb_leftmost总是设置为执行书最左边的节点,即最需要被调度的进程。改成员理论上可以通过遍历红黑树获得,但由于我们通常指对最左边的节点感兴趣,因为这可以减少搜索树话费的平均时间。
*curr指向当前执行进程的可调度实体

========================================
2.6.2 CFS操作
1.虚拟时钟
完全公平调度算法依赖于虚拟时钟,用以度量等待进程在完全公平系统中所能得到的CPU时间。
2.延迟跟踪
内核有一个固有的概念,称之为良好的调度延迟,级保证每个科运行的进程都应该至少运行一次的某个时间间隔。它在sysctl_sched_latency给出,可通过/proc/sys/kernel/sched_latency_ns控制。

2.6.3 队列操作
有两个函数可用来增删就绪队列的成员:enqueue_task_fair和dequue_task_fair.
除了指向所属的就绪队列和task_struct的指针外,改函数还有另一个参数wakeup.这使得可以指定入队的进程是否最近才被唤醒并转换为运行状态。enqueue_task_fair的代码流程图

2.6.4 选择下一个进程
选择下一个将要运行的进程由pick_next_task_fair执行。

2.6.5 处理周期性调度器
在处理周期调度时前述的差值很重要。形式上有函数task_tick_fair负责,但实际工作由entity_tick完成。

2.6.6 唤醒抢占
当try_to_wake_up和 wake_up_new_task中唤醒进程时,内核使用 check_preempt判断是否进程额可以抢占当前的进程。

2.6.7 处理新进程
我们对完全公平调度器需要考虑的最后一个操作是创建新进程时调用的挂钩函数new_fair.
该函数先用update_cur进行通常的统计量更新,然后调用此前讨论过的place_entity.
kernel/sched_fair.c
static void task_new_fair()
kernel/sched_fair.c
如果付进程的虚拟运行世纪那小于子进程的虚拟运行时间,则意味着父进程将于子进程之前调度运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值