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

本文深入探讨了Linux内核中的RT组调度策略,详细解释了实时进程如何通过rt_time和rt_runtime控制运行时间,以及如何在达到最大运行时间后被限制,确保公平性和系统的响应能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

https://blog.youkuaiyun.com/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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值