Windows Server 2008 R2 (Windows 7) 上的命令提示符窗口优先级

标签 c windows multithreading sleep thread-priority

在控制台窗口中运行的应用程序是否被 Windows 调度程序视为“不太重要”,即,如果最小化,Windows 是否允许它“休眠”更长时间?我想我读过一些有关 Windows 在最小化时降低其优先级的内容,但也许我只是混淆了一些内容。

问题是,我有一个 C 控制台应用程序(用 VS2015 编写,但在 Windows Server 2008 R2 上运行,因此不幸的是没有 GetSystemTimePrecise 支持),它执行一些套接字通信,但有时接收线程 (IOCP) 暂停,数据包合并在一起。

所以,在我的主函数中我写了这样的东西:

 timeBeginPeriod(1);

while (true)
{
    QueryPerformanceCounter(&start);
    Sleep(1);
    QueryPerformanceCounter(&stop);
    LogTimeElapsed(start, stop);
}

我显然没有想到从 Sleep(1) 中获得毫秒级的精度,但令我惊讶的是,出现了约 50 毫秒的大量延迟,最大延迟达到超过 120 毫秒多次。

当然,在此期间,还有其他事件进程消耗 CPU(进行一些数据库导出等类似操作,总 CPU 达到约 50%),但由于这是四核 CPU,我认为线程调度程序会仍然可以防止发生这么长时间的延误。

这是作为普通控制台应用程序运行的产物,还是我应该期望在任何 Windows 桌面/服务应用程序中出现类似的延迟?

最佳答案

Windows 不是实时系统,因此允许将任务挂起一段不确定的时间。如果其他任务在短时间内(零点几秒)使用 4 个内核,则任何程序(无论是 GUI 的控制台)都可能会在这段时间内暂停。由于 Windows 是一个功能丰富的操作系统,除了其他任务之外,许多系统服务还可能争夺 CPU,因此任何时候都可能出现高达零点几秒的延迟

简单地说,TCP 堆栈保证程序将以正确的顺序获取该时间内接收到的所有数据,但允许在一次读取中连接多个数据包,因为 TCP 是流协议(protocol)。所以你的程序应该为此做好准备。唯一的选择是使用实时操作系统,无论是在主机上还是在专用机上。

关于Windows Server 2008 R2 (Windows 7) 上的命令提示符窗口优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183425/

相关文章:

c - 如何在命令行中提供多个文件作为输入

c++ - 有人能帮我弄清楚为什么我的 Do/While 循环不工作吗? (C++)

c++ - 线程和互斥量

c - 在结构体中使用双指针

c - 二维数组中穿过障碍物(地雷)的最短路径(C 编程)

c - 理解为什么 fork 在 C 中给出不同的结果

windows - 使用Windows视觉样式绘制的按钮周围额外的1像素边距

c++ - C中的蓝牙MAC地址

java - 如何让每个SQL查询都是一个线程?

python - asyncio.to_thread() 方法与 ThreadPoolExecutor 不同吗?