linux进程调度周期,Linux进程组调度机制学习

from:http://oenhan.com/task-group-sched

https://blog.csdn.net/u014089131/article/details/54865073

1.RT组调度策略:

实时进程的优先级是设置固定,调度器总是选择优先级最高的进程运行。而在组调度中,调度单元的优先级则是组内优先级最高的调度单元的优先级值,也就是说调度单元的优先级受子调度单元影响,如果一个进程进入了调度单元,那么它所有的父调度单元的调度队列都要重排。实际上我们看到的结果是,调度器总是选择优先级最高的实时进程调度,那么组调度对实时进程控制机制是怎么样的?

在前面的rt_rq实时进程运行队列里面提到rt_time和rt_runtime,一个是运行累计时间,一个是最大运行时间,当运行累计时间超过最大运行时间的时候,rt_throttled则被设置为1,见sched_rt_runtime_exceeded函数。

if (rt_rq->rt_time > runtime) {

rt_rq->rt_throttled = 1;

if (rt_rq_throttled(rt_rq)) {

sched_rt_rq_dequeue(rt_rq);

return 1;

}

}

设置为1意味着实时队列中被限制了,如__enqueue_rt_entity函数,不能入队。

static inline int rt_rq_throttled(struct rt_rq *rt_rq){

return rt_rq->rt_throttled && !rt_rq->rt_nr_boosted;

}

static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head)

{

if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running))

return;

.....

}

其实还有一个隐藏的时间片的概念,即sched_rt_period_us,意味着sched_rt_period_us时间内,实时进程可以占用CPU

rt_runtime时间,如果实时进程每个时间周期内都没有调度,则在do_sched_rt_period_timer定时器函数中将rt_time减去一个周期,然后比较rt_runtime,恢复rt_throttled。

//overrun来自对周期时间定时器误差的校正

rt_rq->rt_time -= min(rt_rq->rt_time, overrun*runtime);

if (rt_rq->rt_throttled && rt_rq->rt_time < runtime) {

rt_rq->rt_throttled = 0;

enqueue = 1;

2.进程执行期间调度器周期性地启动,其负责更新一些相关数据,并不负责进程之间的切换:

(1)timer_tick();

(2)update_process_times();

(3)scheduler_tick();

(4)task_tick_rt();//RT调度器实现

(5)update_curr_rt();

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值