linux realtime任务源码分析(二)

admin 2024年10月7日19:27:09评论16 views字数 1432阅读4分46秒阅读模式

微信公众号: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任务源码分析(二)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月7日19:27:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   linux realtime任务源码分析(二)https://cn-sec.com/archives/1994242.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息