【问题标题】:Writing a service for low CPU usage [duplicate]为低 CPU 使用率编写服务 [重复]
【发布时间】:2019-01-15 18:40:56
【问题描述】:

我正在用 C 语言编写一个 Windows 服务,使用这里的经典示例: https://docs.microsoft.com/en-us/windows/desktop/Services/svc-cpp。我试图了解为什么我的服务在不执行任何操作时的 CPU 使用率为 25%。

我已经取出了几乎所有的代码,只留下了原始的骨架程序。基本上它处于一个紧密的循环中,它检查服务停止命令,然后是 Sleep(0),然后循环回来。在我的真实代码中,我正在侦听一个 tcp 连接,但这在本次测试中不适用。

VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
{
// initialization code not shown here

// Main loop
while(TRUE) {

// Check whether to stop the service.

ret=WaitForSingleObject(ghSvcStopEvent, 0);
if (ret == 0) {
  com_Log("Stop command received from service manager");
  break;
}

Sleep(0);

// This is where the service looks for work to do, but disabled for 
 testing

}

// shutdown code here

}

我认为 Sleep(0) 是将控制权返回给操作系统,那么为什么这段代码会出现异常并占用如此大的 CPU 资源?

【问题讨论】:

  • 您希望 Sleep(0;) 在限制您的服务时实际做什么?
  • 自 Windows 95 以来,当抢先式多任务处理到来时,睡眠并没有恢复对操作系统的控制。它只是让你的进程或线程休眠,仅此而已。操作系统始终处于控制之中。
  • 根本不使用Sleep,只需将第二个参数的非零值传递给WaitForSingleObject,并在它返回WAIT_TIMEOUT 时执行您的服务的工作。根据您的服务所需的响应时间确定超时。大约 200 毫秒的超时应该足够了,您可以轻松地增加它。

标签: c++ windows cpu-usage


【解决方案1】:

Sleep(0) 已经讨论过here

由于你的 CPU 什么都不做 (23%),这个函数会立即返回。尝试将其替换为 Sleep(value)(以毫秒为单位的值)之类的内容,以实际减少 CPU 使用率。

【讨论】:

  • 或者更好的是,让它在一些 blocking 函数中进入睡眠状态,直到有事情要做时才会真正返回——比如selectpoll、@987654327 @ 或类似的......我的意思是,就像任何 sensible 事件循环一样。即使您Sleep“一段时间”,您仍然有效地“忙于等待”,因为您的进程在计时器到期时被唤醒,什么也不做 - 您不希望这样。 Sleep(42) 只是 似乎 有帮助的 hack。这不是正确的解决方案。
  • @JesperJuhl 是的,如果 OP 正在等待网络连接,那么带有超时的 select 将是合适的选择。在这种情况下,超时将表示轮询关闭事件的时间段,该时间段可能很大(即 1 或 2 秒)。
  • @paddy 或者,等待计时器或其他(无论)事件。网络事件远非唯一应该阻止等待的事情。并且可以阻止一个等待多个事件之一发生。
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 2015-10-30
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多