【问题标题】:Command prompt window priority on Windows Server 2008 R2 (Windows 7)Windows Server 2008 R2 (Windows 7) 上的命令提示窗口优先级
【发布时间】:2017-08-28 05:57:55
【问题描述】:

在控制台窗口中运行的应用程序是否被 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 桌面/服务应用程序都会出现类似的延迟?

【问题讨论】:

  • 答案取决于服务器上运行的内容,但一般来说,您不能期望睡眠功能具有很高的准确性,应该围绕此设计代码。如果您需要更高的准确性,也许您需要计时器之类的东西。
  • 这有点 XY 的味道。使用 TCP,“数据包合并在一起”是经过设计的。使用 UDP,数据包通过错误合并在一起。尽管如此,考虑到你的小循环,我很惊讶你曾经在一个轻负载的四核盒子上得到这么多的延迟。 Sleep(1) 也可以是 Sleep(0),本质上是一个重新调度内核调用。
  • 嗯...,接收线程 (IOCP) 暂停并且 数据包合并在一起 究竟是什么意思?说到重新排列 TCP 数据包?
  • @this.lau_:代码的重点是检查延迟的来源,因为我没有看到我在应用程序的其他部分检测到的一些延迟的任何原因.
  • @ThingyWotsit:我明白你在说什么,但问题是:数据包每 20 毫秒由同一交换机上的设备发送一次,我可以在 Wireshark 中看到它们在此运行同一台机器,即对于每个 TCP 数据包,接收数据包的时间与传感器报告的时间相匹配,有(比如说)5 毫秒延迟(服务器和传感器都是时间同步的)。但是我看到我的测试控制台应用程序得到了这些延迟,之后下一个 recv 调用得到合并的数据包。

标签: c windows multithreading sleep thread-priority


【解决方案1】:

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

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

【讨论】:

  • 确实如此。如果在网络上只接收到少量数据,堆栈可能会推迟一段时间向它发出信号,以“希望”接收更多数据并因此返回更完整的缓冲区,(类似于 nagle,但在 rx 端)。
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2011-04-17
  • 2012-05-25
相关资源
最近更新 更多