微信公众号:deepcoder
微信号:deepcoder_001
关注可了解操作系统知识。问题或建议,请公众号留言;
如果你觉得文章对你有帮助,欢迎转发[1]
这里首先给大家道个歉,上一节的文章中我们将实时任务叫做runtime,这个错了,应该叫realtime。
一,realtime任务的watchdog
上一篇我们说了sched_rt_runtime_exceeded会根据给realtime任务设置的rt_runtime,保证realtime任务连续占有cpu的时间不能超过rt_runtime(默认950ms)。但是内核也有接口通过__disable_runtime禁止这个机制检查,这个时候,realtime任务在没有高优先级任务的时候一直占有cpu不释放。
但是内核同样给我们提供了另外一个机制来限制,这个就是RLIMIT_RTTIME,用来限制一个任务连续使用cpu的最大时间。用户态可以在root权限下调用setrlimit来设置这个时间。该时间是限制一个realtime任务连续使用cpu的时间限制(如果调用某些系统调用,会主动释放,那么时间会重新计算)。内核如何检测呢,这个就是上一节的接口watchdog。
在每一个系统调度周期tick的时候都会调用到task_tick,对于realtime就会调用到上一节提到的watchdog
static void watchdog(struct global_rq *rq, struct task_struct *p)
{
unsigned long soft, hard;
/* max may change after cur was read, this will be fixed next tick */
//用户态可以通过setrlimit来设置
soft = task_rlimit(p, RLIMIT_RTTIME);
hard = task_rlimit_max(p, RLIMIT_RTTIME);
if (soft != RLIM_INFINITY) {
unsigned long next;
if (p->rt.watchdog_stamp != jiffies) {
p->rt.timeout++;//计数加1,达到一定值,那么就认为连续运行时间过长
p->rt.watchdog_stamp = jiffies;
}
next = DIV_ROUND_UP(min(soft, hard), USEC_PER_SEC/GG_HZ);
if (p->rt.timeout > next)
p->cputime_expires.sched_exp = p->se.sum_exec_runtime;
}
}
可以看到watchdog会根据判断是否设置了RLIMIT_RTTIME(soft),来决定是否启用看门狗计数,这里的watchdog_stamp就是喂狗,jiffies在每次调度tick的时候都会更新,和HZ相关。这里的timeout一直计数,达到一定值的时候会有一个检测接口check_thread_timers,
原文始发于微信公众号(deepcoder):linux realtime任务源码分析(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论