【问题标题】:Is kernel/sched.c/context_switch() guaranteed to be invoked every time a process is switched in?kernel/sched.c/context_switch() 是否保证每次切换进程时都会被调用?
【发布时间】:2012-06-20 00:19:09
【问题描述】:

我想更改 Linux 内核,以便每次当前 PID 更改时 - 即,切换新进程 - 执行一些诊断代码(如果好奇,下面会详细说明)。我做了一些挖掘,似乎每次调度程序选择一个新进程时,都会调用函数context_switch(),这是有道理的(这只是对sched.c/schedule()的粗略分析)。

问题是,Linux 调度程序现在对我来说基本上是黑魔法,所以我想知道这个假设是否正确。是否保证每次选择一个新进程以在 CPU 上获得一些时间时,都会调用 context_switch() 函数?或者内核源代码中是否有其他地方可以在其他情况下处理调度? (或者我完全误解了这一切?)

为了提供一些背景信息,我正在使用 MARSS x86 模拟器尝试对某些程序进行一些检测和测量。问题是我的仪器需要知道某些代码事件对应于哪个执行过程,以避免误解数据。这个想法是使用 MARSS 中的一些内置消息传递系统在每次上下文切换时传递新进程的 PID,因此它始终知道当前正在执行的 PID。如果有人能想到一种更简单的方法来实现这一点,那也将不胜感激。

【问题讨论】:

    标签: c linux process scheduler context-switch


    【解决方案1】:

    是的,你是对的。

    schedule() 将调用context_switch(),当schedule() 选择了新进程时,context_switch() 负责从一个任务切换到另一个任务。

    context_switch() 基本上做了两件事。它调用switch_mm()switch_to()

    switch_mm() - 切换到新进程的虚拟内存映射

    switch_to() - 将处理器状态从前一个进程切换到新进程(保存/恢复寄存器、堆栈信息和其他架构特定的东西)

    至于你的方法,我想这很好。使用内核时保持整洁和干净很重要,并尽量保持相对简单,直到您获得更多知识。

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2023-03-28
      • 2013-03-10
      • 2013-04-27
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多