【问题标题】:How can I measure the approximation of the time spent in a process context switch?如何测量进程上下文切换所用时间的近似值?
【发布时间】:2012-11-22 18:46:40
【问题描述】:

是否有可能测量 C# 中进程上下文切换的大致时间? 如果是,怎么做?

我根据Cracking the Coding Interview: 150 Programming Questions and Solutions 这本书提出了这个问题。

他们的解决方案是:

假设只有 2 个进程,P1 和 P2。 (是一个巨大的近似值,我相信还有更准确的)

P1 正在执行,P2 正在等待执行。在某些时候,操作系统必须交换 P1 和 P2 - 假设它发生在 P1 的第 N 条指令处。所以上下文切换时间是:

Time_Stamp(P2_1) - TimeStamp(P2_N)

其中一个问题是我们无法记录过程中每条指令的时间戳。 而且我们不考虑其他进程之间的上下文切换所花费的时间。

【问题讨论】:

  • 当你提出这个解决方案时,你可以放心地假设你不会被录用。
  • @HansPassant 我认为你是对的,而且我认为这个问题也不是一个好的面试问题,有点棘手,你需要假设很多与现实相去甚远的事情。

标签: c# .net process operating-system context-switch


【解决方案1】:

您可以使用 WMI(Windows 管理规范)

例子:

ManagementScope managementScope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Thread");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection objectCollection = searcher.Get();

foreach (ManagementObject m in objectCollection)
{
    Console.WriteLine("ContextSwitchesPersec : {0}", m["ContextSwitchesPersec"]);
}

【讨论】:

    【解决方案2】:

    进程上下文切换由操作系统完成,与 .NET 或 C# 无关。

    您可以使用 Windows 性能监视器监控每秒上下文切换的数量,但进程本身不知道任何上下文切换。

    您还可以使用Process Explorer 来监视上下文切换和单个进程的增量,这些默认情况下不显示,但可以从视图、选择列、性能选项卡中添加

    【讨论】:

    • 我可能把这个问题误解为测量 C# 程序花费的时间
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多