了解 Linux 内核调度程序

2024-03-04

我正在研究 Linux 内核,并试图弄清楚循环调度算法是如何工作的。在里面kernel\sched_rt.c文件中,有一个方法叫做task_tick_rt定义如下:

static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
{
    update_curr_rt(rq);

    watchdog(rq, p);

    /*
     * RR tasks need a special form of timeslice management.
     * FIFO tasks have no timeslices.
     */
    if (p->policy != SCHED_RR)
            return;

    if (--p->rt.time_slice)
            return;

    p->rt.time_slice = DEF_TIMESLICE;

    /*
     * Requeue to the end of queue if we are not the only element
     * on the queue:
     */
    if (p->rt.run_list.prev != p->rt.run_list.next) {
            requeue_task_rt(rq, p, 0);
            set_tsk_need_resched(p);
    }

}

我不明白什么(除了事实上有一个无用的queued参数)是代码试图通过if (--p->rt.time_slice)查看。我不明白为什么任务列表指针p被减 1,换句话说,为什么该方法要检查上一个任务而不是现在的?任何对此的澄清表示赞赏。


查看 c 运算符优先级http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

The ->运算符的优先级高于前缀++,因此这个特定条件可以写成:

if (--(p->rt.time_slice))

换句话说,减少的是时间片,而不是指针。


The queued参数在这里可能显得无用,但它有一个存在的理由。具体注意哪里task_tick_rt()是从调用的。它唯一的参考是当它被分配给.task_tick函数指针在rt_sched_class的实例struct sched_class: http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991 http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991

所以我们看到每个调度算法都有自己的struct sched_class内核将调用它来进行调度服务的函数向量。如果我们看看其他算法,我们会发现 CFS(完全公平调度)算法也有自己的实例struct sched_class, named fair_sched_class: http://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179 http://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179

The .task_tick粮安委个案中的成员指出task_tick_fair(): http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785 http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785

Note task_tick_fair() does利用queued范围。所以当.task_tick成员被召唤到(here http://lxr.free-electrons.com/source/kernel/sched/core.c#L393 and here http://lxr.free-electrons.com/source/kernel/sched/core.c#L2179),传入 0 或 1queued范围。所以虽然task_tick_rt()不使用它,则queued参数仍然必须是它们的,因此函数指针类型在struct sched_class函数向量全部匹配。

简而言之,struct sched_class函数向量指定调度算法和内核其余部分之间的接口。这queued参数是给定算法应该选择使用它的参数,但在循环的情况下,它会被忽略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Linux 内核调度程序 的相关文章

随机推荐

  • 默认字典(无)

    我希望有一本包含一组状态转换的字典 我认为我可以使用 states defaultdict None 来做到这一点 但它没有按我的预期工作 例如 states defaultdict None if new state 1 states S
  • jQuery Tablesorter 的日期排序问题

    我正在尝试对具有类似列的表进行排序2009 12 17 23 59 59 0 我正在使用下面的应用排序 document ready function dataTable tablesorter 但它不适用于 yyyy mm dd 格式的日
  • 比较 numpy.save 和 h5py 的速度时如何获得一致的结果?

    我正在尝试比较两种工具的速度效率 这两种工具可以节省 2 GB 的空间numpy array到磁盘到文件 numpy save and h5py create dataset 注意 这只是第一个测试 我必须处理的真实情况是数千个大小在 1
  • R data.table 使用 lapply 创建自定义函数来创建和重新分配多个变量

    我有以下几行代码 DT flag T temp haz 1 5 DT temp na locf temp na rm FALSE pid DT agedays 61 haz 1 5 1 temp 我需要将其转换为一个函数 以便它可以处理一系
  • 哪种报告技术? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 哪种报告技术最适合最佳情况 产品类型 我现在在想3技术 嵌入式报告 Crystal Reports M
  • codeigniter + 密码需要字母和数字

    我想使用表单验证来要求同时包含字母和数字字符的密码 到目前为止 这是我想到的 this gt form validation gt set rules password Password required matches passconf
  • Rust musl Docker 镜像找不到 Cargo

    我正在尝试让 Rust 在 Docker 中运行 以将其用于 32 位 musl 构建 自从我更新它以使用新的 URL 来拉 rustup 后 我在使用 bash 交互运行容器时遇到了这个问题 root 2c3549fe3169 sampl
  • Sqlite:自己行中的小计又名“汇总”

    我正在寻找一种方法来模拟其他基于 sql 的 dbms 中可用的 汇总 需要明确的是 我知道如何获得运行小计 这是not我在追求什么 我也知道我可以通过编程来做到这一点 但是 如果可以使用一个 或几个 sql 语句来完成 我宁愿这样做 例如
  • Eclipse - 期间发生内部错误:“计算启动按钮工具提示”

    我早些时候启动了 Eclipse 来记下一个片段 当我尝试运行一个新项目时 遇到了以下错误 期间发生内部错误 计算启动按钮工具提示 当我将鼠标悬停在顶部栏中的运行图标上时 或者右键单击资源管理器窗口中的类并选择任何运行 调试选项时 就会显示
  • scipy 中 line_search 的示例

    我正在寻找使用的例子scipy optimize line search 我不太明白这个函数如何与多变量函数一起使用 我写了一个简单的例子 import scipy as sp import scipy optimize def test
  • 如何在 Seaside 回调中访问 jQuery 事件对象

    基本上 我想将以下内容翻译成 Seaside Smalltalk myDiv bind click function e console log e 除此之外我不想console log事件 但在我的 ajax 回调中访问它 最有希望的方法
  • 返回上一页适用于模拟器,不适用于 iOS 设备 jquerymobile

    我正在用这种方法更改页面 mobile changePage Preview html transition slide role page changeHash true 这就是我的预览页面的样子 div class prew div c
  • 如何将字典写入文件?

    我有一个 FileHelper 类 其中实现了 3 个方法 其工作是将字典内容写入文件 这些方法是 func storeDictionary dictionary Dictionary
  • JavaConfig:替换 aop:advisor 和 tx:advice

    我想知道是否可以将这段 xml 配置映射到 Spring JavaConfig
  • AES256EncryptWithKey 方法的 openssl 等效项

    如何使用命令行 openssl 获得与以下 Objective C 加密方法相同的结果 NSData AES256EncryptWithKey NSString key NSData returnData nil char keyPtr k
  • 根据日期显示/隐藏 div

    我正在尝试根据日期显示隐藏 div 并尝试使用以下代码
  • 工作流程单元测试

    如何对 Windows 工作流程进行单元测试 K 斯科特 艾伦 已发布this http odetocode com Blogs scott archive 2006 08 02 5492 aspx 它提供了一种对自定义活动进行单元测试的方
  • Objective-C 到 Swift 的完成处理程序

    我目前正在将一个项目从 Objective C 重写为 Swift 项目的大部分已完成 但我在翻译具有完成处理程序的方法时遇到问题 我已经查看了文档 但仍然遇到问题 方法是 void start void WTStartupConfigur
  • ADO.NET CommandBuilder、InsertCommand 和默认约束

    我正在将数据从表 A 复制到表 B 表 B 有一个nullable列有一个默认约束值为 0 一般来说 我使用以下访问器设置列的值 public object this string columnName get return DataTab
  • 了解 Linux 内核调度程序

    我正在研究 Linux 内核 并试图弄清楚循环调度算法是如何工作的 在里面kernel sched rt c文件中 有一个方法叫做task tick rt定义如下 static void task tick rt struct rq rq