在Windows调度程序中,运行在控制台窗口中的应用程序是否被视为“不太重要”,即,如果Windows最小化,是否允许它“睡眠”更长时间? 我认为我读了一些关于Windows降低它的优先级的东西,如果它被最小化,但也许我只是混淆了一些东西。
问题是,我有一个C控制台应用程序(写在VS2015中,但在Windows Server 2008 R2上运行,所以不支持GetSystemTimePrecise
),它执行一些套接字通信,但有时接收线程(IOCP)暂停,数据包得到合并在一起。
所以,在我的主要function中,我写了这样的东西:
timeBeginPeriod(1); while (true) { QueryPerformanceCounter(&start); Sleep(1); QueryPerformanceCounter(&stop); LogTimeElapsed(start, stop); }
我显然并不期望从Sleep(1)
获得毫秒级的准确度Sleep(1)
,但我惊讶地发现大约有50毫秒的延迟,最多可以多次达到120毫秒以上 。
当然,在这段时间里,还有其他的活动进程消耗CPU(做一些数据库导出和类似的,总CPU达到〜50%),但是由于这是一个四核CPU,我认为线程调度器仍然会阻止发生长时间的延误。
这是一个简单的控制台应用程序运行的神器,或者我应该期望在任何Windows桌面/服务应用程序类似的延迟?
Windows不是一个实时的系统,所以它可以暂停一个非确定性时间的任务。 如果其他任务在短时间(十分之几秒)内使用4个内核,则任何程序(不管是GUI的控制台)都可能暂停。 而且由于Windows是一个功能丰富的操作系统,除了其他任务之外,许多系统服务还可以竞争CPU,所以随时都可以预计到十分之几秒的延迟
TCP堆栈只是保证程序能够在正确的时间内获得所有的数据,但是由于TCP是一个流协议,所以允许在一次读取中连接多个数据包。 所以你的计划应该为此做好准备。 唯一的选择是在主机上或专用的操作系统上使用实时操作系统。