Windows 中特定进程的上下文切换计数

2023-12-23

我想做的是编写一个小程序,连续实时计算特定进程在足够小的时间单位内经历的上下文切换的数量。我在“Process Explorer”软件中观察到了此功能,所以我知道这绝对是可能的。

不幸的是,我对如何开始编码知之甚少,并且到目前为止无法在网上找到任何有用的代码片段。因此,一个实现每个进程和每单位时间实时上下文切换计数的小型工作示例将对我非常有帮助。


这是一种方法 - 这将打印记事本的线程 0 每秒使用的上下文切换数量(您可以在 CounterPathBuffer 初始化中替换您想要的任何进程和线程号):

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>

#pragma comment(lib, "pdh.lib")
using namespace std;
CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";

void wmain(void)
{
    PDH_STATUS Status;
    HQUERY Query = NULL;
    HCOUNTER Counter;
    PDH_FMT_COUNTERVALUE DisplayValue;
    DWORD CounterType;
    SYSTEMTIME SampleTime;
    PDH_BROWSE_DLG_CONFIG BrowseDlgData;
    WCHAR CounterPathBuffer[PDH_MAX_COUNTER_PATH] = L"\\\\ComputerNameGoesHere\\Thread(notepad/0)\\Context Switches/sec";


    //
    // Create a query.
    //

    Status = PdhOpenQuery(NULL, NULL, &Query);
    if (Status != ERROR_SUCCESS) 
    {
       wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
       goto Cleanup;
    }

    //
    // Initialize the browser dialog window settings.
    //



    ZeroMemory(&BrowseDlgData, sizeof(PDH_BROWSE_DLG_CONFIG));

    BrowseDlgData.bIncludeInstanceIndex = FALSE;
    BrowseDlgData.bSingleCounterPerAdd = TRUE;
    BrowseDlgData.bSingleCounterPerDialog = TRUE;
    BrowseDlgData.bLocalCountersOnly = FALSE;
    BrowseDlgData.bWildCardInstances = TRUE;
    BrowseDlgData.bHideDetailBox = TRUE;
    BrowseDlgData.bInitializePath = FALSE;
    BrowseDlgData.bDisableMachineSelection = FALSE;
    BrowseDlgData.bIncludeCostlyObjects = FALSE;
    BrowseDlgData.bShowObjectBrowser = FALSE;
    BrowseDlgData.hWndOwner = NULL;
    BrowseDlgData.szReturnPathBuffer = CounterPathBuffer;
    BrowseDlgData.cchReturnPathLength = PDH_MAX_COUNTER_PATH;
    BrowseDlgData.pCallBack = NULL;
    BrowseDlgData.dwCallBackArg = 0;
    BrowseDlgData.CallBackStatus = ERROR_SUCCESS;
    BrowseDlgData.dwDefaultDetailLevel = PERF_DETAIL_WIZARD;
    BrowseDlgData.szDialogBoxCaption = BROWSE_DIALOG_CAPTION;

    //
    // Add the selected counter to the query.
    //


    Status = PdhAddCounter(Query, CounterPathBuffer, 0, &Counter);
    if (Status != ERROR_SUCCESS) 
    {
        wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
        goto Cleanup;
    }

    //
    // Most counters require two sample values to display a formatted value.
    // PDH stores the current sample value and the previously collected
    // sample value. This call retrieves the first value that will be used
    // by PdhGetFormattedCounterValue in the first iteration of the loop
    // Note that this value is lost if the counter does not require two
    // values to compute a displayable value.
    //

    Status = PdhCollectQueryData(Query);
    if (Status != ERROR_SUCCESS) 
    {
        wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
        goto Cleanup;
    }

    //
    // Print counter values until a key is pressed.
    //

    while (!_kbhit()) 
    {
        Sleep(SAMPLE_INTERVAL_MS);

        GetLocalTime(&SampleTime);

        Status = PdhCollectQueryData(Query);
        if (Status != ERROR_SUCCESS) 
        {
            wprintf(L"\nPdhCollectQueryData failed with status 0x%x.", Status);
        }

        wprintf(L"\n\"%2.2d/%2.2d/%4.4d %2.2d:%2.2d:%2.2d.%3.3d\"",
                SampleTime.wMonth,
                SampleTime.wDay,
                SampleTime.wYear,
                SampleTime.wHour,
                SampleTime.wMinute,
                SampleTime.wSecond,
                SampleTime.wMilliseconds);

        //
        // Compute a displayable value for the counter.
        //

        Status = PdhGetFormattedCounterValue(Counter,
                                             PDH_FMT_DOUBLE,
                                             &CounterType,
                                             &DisplayValue);
        if (Status != ERROR_SUCCESS) 
        {
            wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
            goto Cleanup;
        }


        wprintf(L",\"%.20g\"", DisplayValue.doubleValue);
    }

Cleanup:

    //
    // Close the query.
    //

    if (Query) 
    {
       PdhCloseQuery(Query);
    }

    int x;
    cin >>x;
}

大部分代码来自此来源:msdn.microsoft.com/en-us/library/aa371886%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/aa371886%28v=vs.85%29.aspx。我想缩短上下文切换连续检查之间的时间(使其少于一秒)。如果有人对如何做到这一点有任何想法,那就太好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 中特定进程的上下文切换计数 的相关文章

随机推荐

  • 使用 boto 从 dynamodb 获取唯一哈希键值列表

    我想获取 dynamodb 表的唯一哈希键值列表 我目前知道的唯一方法是扫描整个表 然后迭代扫描 更好的方法是什么 rs list table scan range eq rangevalue for i in rs print i pri
  • 自定义域验证是否在 Azure 订阅之间共享?

    我注意到 在我的 Azure 订阅中的许多应用程序服务 应用程序服务计划和 Azure 区域中 自定义域验证 ID 的值似乎是相同的 我看不到任何关于是否证实这一观察结果的文件 自定义域验证是否在 Azure 订阅之间共享 I m refe
  • 编码 URL 后出现 HTTP 404 错误

    当我使用 HttpUtility UrlEncode 对 Url 进行编码时 我最终收到服务器错误 ASP NET 代码 NavigateUrl 网址 http localhost UITest MM UpdateMember aspx 3
  • 按组计算唯一值

    DATA data frame TRIMESTER c 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 STUDENT c 1 2 3 4 5 6 7 1 2 3 5 9 10 11 3 7 10
  • Mean.io 框架与 socket.io

    如何在 Mean io 堆栈中使用 socket io 首先 Mean io 非常定期地更改其文件夹结构 所以我的问题是配置 socket io 的最佳位置在哪里 还是使用express io更好 其次 我仍然不太确定在哪里寻找告诉mean
  • 如何在 Clojure 中迭代向量的向量?

    我有一条包含 3 个属性的消息 类型 货币和金额 我有一个具有 4 个属性的规则 目的地 消息类型 货币和金额 我想检查我的规则并在消息类型上找到与消息匹配的消息并返回目的地 如果没有匹配则返回 null 我使用向量作为消息和规则中字段的固
  • Django 中的 Apscheduler Job 执行两次

    计划的作业执行两次 差异以纳秒为单位 我有一个任务如下task py def print hello print time gt datetime datetime now print hello def print world print
  • 指定制表符宽度?

    显示空白时是否可以定义制表符宽度 例如在 标记或其他内容内 我找不到任何可以用 CSS 做到这一点的东西 但这似乎是一件很常见的事情 就我而言 选项卡宽度太宽 导致页面上的一些代码片段太宽 如果我能以某种方式缩短选项卡宽度以使其适合没有滚动
  • 在 PHP 中将二进制字节数组转换为图像

    我有一个 Java 网络服务 它返回所请求的文件内容byte 字节数组 形式 有时这些文件是 HTML 文件 有时是图像 文件类型没有限制 我正在寻找一种方法将此数组转换为有效的图像 字符串 我的working for text文件如下 b
  • Google OAuth 令牌验证如何以及为何执行?

    当 Google OAuth 文档指示我在访问令牌 刷新令牌 范围 受众和客户端 ID 之间进行操作时 我感到很困惑验证所有令牌 https developers google com accounts docs OAuth2UserAge
  • Net::SSH::Perl 使用转发的 SSH 密钥

    我正在尝试使用 Net SSH Perl 编写 perl 脚本 目前它非常简单 因为我只想通过 ssh 在目录中执行 ls usr bin perl use Net SSH Perl KEYFILE user ssh id rsa ssh
  • number_format() 导致错误“遇到格式不正确的数值”

    我正在使用 number format 将浮点数四舍五入为仅 2 位小数 问题是我的一些输入一开始的小数位数不超过 2 位 所以代码 number format value 2 如果没有足够的十进制数字 它不会平静地添加 0 而是会在 Ap
  • X 宏破坏 doxygen 调用图

    我有3个文件 test c int table define X val val include test x undef X void level2 void level3 level4 void level3 void level4 t
  • 我认为等待与调用者在同一线程上继续,但似乎并非如此

    我认为关于 async await 的要点之一是 当任务完成时 延续在调用 wait 时在相同的上下文中运行 在我的例子中 该上下文是 UI 线程 例如 Debug WriteLine 2 Thread ID Thread CurrentT
  • Spring boot:创建名为“methodValidationPostProcessor”的 bean 时出错

    我有一个 Spring Boot 应用程序 正在创建 war 文件并部署在 Tomcat 8 上 该代码在 Eclipse Oxygen 中运行时运行良好 在 Tomcat8 上运行应用程序时遇到异常 Caused by org sprin
  • 如何 grep 查找文件中是否存在特定的十六进制字节?

    我的网络应用程序正在显示一些奇怪的输出 不应该出现的 unicode 字符等 我能想到的最好的情况是 我在源代码中的某个地方引入了一个错误的字符 但我不知道在哪里 I found 这个答案 https stackoverflow com a
  • iPhone开发——防止泄密

    当我使用 Leaks 运行我的应用程序并查看任何泄漏的扩展详细信息时 它会将我带到代码中的特定行 但我不知道之后要做什么 例如 Leaks 在这一行显示了一个 malloc NSData data NSURLConnection sendS
  • PHP preg_replace 跳过匹配重叠的地方

    我整个下午都在谷歌搜索这个正则表达式行为 str b c d w i e f g h this string echo preg replace s bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVW
  • Twitter 的 URL 爬虫执行 JavaScript 吗?

    当 Twitter 抓取 URL 来呈现 Twitter 卡 通过元标记配置 时 Twitter 会首先执行您的 JavaScript 还是要求这些标记直接从服务器发送 我问这个问题的原因是现在是 2016 年 所以我正在开发一个单页应用程
  • Windows 中特定进程的上下文切换计数

    我想做的是编写一个小程序 连续实时计算特定进程在足够小的时间单位内经历的上下文切换的数量 我在 Process Explorer 软件中观察到了此功能 所以我知道这绝对是可能的 不幸的是 我对如何开始编码知之甚少 并且到目前为止无法在网上找