c - kernel/sched.c/context_switch() 是否保证每次进程切换时都会被调用?

标签 c linux process scheduler context-switch

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

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

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

最佳答案

是的,你是对的。

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

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

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

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

至于你的做法,我觉得还可以。重要的是在使用内核时保持良好和干净,并尽量保持相对简单,直到您获得更多知识。

关于c - kernel/sched.c/context_switch() 是否保证每次进程切换时都会被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075910/

相关文章:

C# 进程的实时标准输出/错误捕获

winapi - ntdll.dll 内部 ZwCreateUserProcess 的远跳转

linux - 检测站(客户端)何时与使用 dnsmasq/hostpad 创建的接入点断开连接

linux - 当它被分成多行时如何避免 echo 中的空格

go - 使用 Golang 启动正在运行的程序的另一个实例的好方法是什么?

c++ - 在共享库中隐藏 "_init"和 "_fini"符号

c - <dos.h> 头文件在代码块中工作吗?

c - 为什么我们在嵌入式c程序的末尾使用空while(1)?

从加载的共享对象库中调用主程序函数

linux - 内存泄漏