【发布时间】:2012-09-14 16:01:03
【问题描述】:
我想知道是否可以在我的代码每次检测到发生 CPU 上下文切换时检测并执行一些操作(而不是计算在特定时间段内发生了多少次上下文切换)。无论如何要在 C# 中执行此操作?
【问题讨论】:
-
那不需要你的程序在一个专用的内核中全职运行吗?我不确定这是否可能。 (如果不是您的程序打开 CPU,它将如何对上下文切换事件“做出反应”)
我想知道是否可以在我的代码每次检测到发生 CPU 上下文切换时检测并执行一些操作(而不是计算在特定时间段内发生了多少次上下文切换)。无论如何要在 C# 中执行此操作?
【问题讨论】:
不,这在 C# 中是不可能的。因为 C# 是一种在用户模式下运行代码的托管语言。上下文切换源自内核模式,用户级代码无法访问该模式。
这可能通过 C 驱动程序实现,但是,代码可能会严重损害操作系统的性能和稳定性。
【讨论】:
上下文切换是非常低级的内核活动,因此(我不确定)这种钩子不太可能存在。
你肯定不能用在正常的.Net运行时运行的代码来做到这一点,至少因为它不允许完全控制线程并且不在内核模式下运行。
现在,如果问题是“我可以在 C# 中编写内核代码”,那么 - 是*(*- 我不相信有可用的 C# 编译器可以生成可以在内核级别执行的本机代码 - 编写你的自己)。
【讨论】:
我认为 possible with pure C 和 getrusage() 可能是有用的信息
struct rusage {
...
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
但我不懂 C#
【讨论】: