在控制台窗口中运行的应用程序是否被 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/