c - 通过程序集以编程方式检测上下文切换

标签 c windows assembly kernel

我知道在 Windows 机器上通过托管语言(如 C#、Java 等)遇到上下文切换时无法监听、检测和执行某些操作。但是,我想知道是否有一种方法可以使用汇编(或其他语言,也许是 C)?如果是这样,您能否提供一个小代码片段来说明如何执行此操作(因为我对内核编程还比较陌生)?

这段代码的主要设计目的是在标准 Windows UI 的后台运行,并监听特定进程何时上下文切换到 CPU 或从 CPU 切换出去。一旦听到这些 Action 中的任何一个,它就会发出一个信号。澄清一下,我只想检测直接涉及特定进程的上下文切换,而不是任何上下文切换。我最终想要实现的是能够在特定进程开始使用 CPU 以及停止使用时通知另一台机器(通过互联网信号)。

我第一次尝试这样做涉及简单地计算特定进程的 CPU 使用百分比,但最终证明这过于粗略,无法捕捉到最微小的计算。例如,我编写了一个测试程序,它简单地执行运算 2+2 并将答案放在一个 int 中。 CPU 使用率方法没有注意到这一点。因此,我正在寻找较低级别的东西,因此是这个问题的起源。如果有潜在的替代方案,我会非常乐意将它们投入使用。

最佳答案

Event Tracing for Windows (ETW) ,您可以将其配置为接收有关系统中发生的各种事件的消息。

您应该能够接收有关线程调度事件的消息。 CSwitch class事件就是为此。

抱歉,我不知道有什么好的 ETW 示例可以轻松地重复用于您的任务。阅读 MSDN 并环顾四周。

Simon指出了一个很好的链接,解释了为什么 ETW 有用。很有启发性:http://randomascii.wordpress.com/2012/05/11/the-lost-xperf-documentationcpu-scheduling/

关于c - 通过程序集以编程方式检测上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12588782/

相关文章:

c# - 向 Windows 进程(不是它的主窗口)发送消息

c - GCC assembly 优化-为什么这些等效?

assembly - Motorola 68000 的 vasm 无法将两个标签之间的距离分配给符号

c - 这个程序用C怎么实现呢?第3.2-3.9部分

c - 从 C 中的多维数组中获取列的有效方法是什么?

c - gcc 编译器未通过 cmd 在 Windows 中为 C 创建 .exe 文件

c - 在内存中(在后台)创建结构体时的操作顺序是什么?

c - 将 PuTTY 数据导入 MSP430

c - 我需要在 C 中拆分代码以实现高斯消除法

windows - 我的 Windows Phone 应用程序在通过 visual studio 运行时运行(单击设备按钮)但是当我断开连接并运行时它没有运行?