【问题标题】:How can the OS use all cores for my application?操作系统如何为我的应用程序使用所有内核?
【发布时间】:2017-05-29 06:32:36
【问题描述】:

我有一个用 Delphi 101 Berlin 编写的 COM。我编写了一个脚本来调用它的 API(只有一个 API,单线程,每个大约需要 1 分钟才能完成)。

我使用 cscript.exe(64 位)(我使用 simple job runner here)运行 vbs 文件,同时运行多个副本(因此有很多进程)。

但是,我在许多 PC(Windows 10 Pro)上进行了测试,观察到只有大约 1 个内核在运行,尽管它有很多内核。

例如,在我的 2 个 CPU(HPZ800 Intel Xeon X5650,每个 6 个内核 = 12 个内核)上,只使用了 1 个内核。

如果某些脚本提前退出,那么其余的 CPU 使用率会有所提高,但加起来不超过 1 个内核。

我的问题是如何编写代码才能从多核中受益?

【问题讨论】:

  • 您说“我使用 cscript.exe 运行 VBS 文件...很多副本(因此有很多进程)”。您是否有任何证据表明 cscript.exe 派生了许多进程?对我来说似乎很清楚您的项目正在作为单线程进程运行。
  • 如您在屏幕截图中看到的,cscript.exe(进程)有很多副本,在我的应用程序中,它是单线程的。
  • 另外,仅仅因为有很多进程正在运行,这并不意味着你会最大化你的 CPU。这取决于过程的性质。如果每个进程只执行一个 sleep() 60 秒,那么您可以拥有数千个进程而不会影响您的 CPU。
  • this article 似乎你必须启用多核。你已经做过这个或类似的事情了吗?您还可以查看超级用户上的this question
  • @PrestonHager 是的,它已经启用。您提供的文章主要是教您如何禁用某些内核。

标签: multicore


【解决方案1】:

为了同时使用多个核心,多线程是 必需的。反之则不成立!

要真正利用多核系统,应用程序应该 也将主处理拆分为多个线程。它的 算法需要并行化。

来源:https://scalibq.wordpress.com/2012/06/01/multi-core-and-multi-threading/

我的 COM API 是单线程的。因此,多个进程不会让操作系统利用所有内核。正如 cmets 中所解释的,如果每个进程都只是睡眠 60 秒,那么就没有办法让所有内核都陷入困境。

我还有另一个完全多线程的 API,即使只有一个进程,它也可以利用所有内核。

另外,提到如果有 I/O 竞争或多个进程争夺相同的资源,会影响核心的利用率。

更新我做了一些实验,结果发现单线程进程最多可以使用一个内核,但是启动多个它们可以使用所有内核,这实际上取决于操作系统来决定.详情请看我的实验When Can Windows Utilize All the Cores?

【讨论】:

  • 我想补充一点:您无法控制哪个线程在哪个进程上以及何时运行。这是操作系统的责任,或者更具体地说是调度程序的责任。您所能做的就是为进程设置优先级,以便调度程序为其提供更多空间。
  • 我已经尝试为进程设置高优先级,但似乎没有多大帮助。
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2013-12-06
  • 2016-10-21
  • 1970-01-01
相关资源
最近更新 更多