操作系统如何使用多个CPU内核

Vak*_*ang -3 performance multithreading operating-system multicore

有很多文章讨论多核神话。为了真正受益于多个内核,需要编写并行算法。他们中许多人提到阿姆达尔定律

为了简单起见,假设我们有一台带有4核商品CPU的台式计算机。并假设目标是提高我们的应用程序性能以及整体系统性能。

我想知道如何使用CPU内核来执行任务。

  • 是否将单个进程的线程分配给所有内核
  • 或者将来自不同进程的线程安排在不同的内核上运行。

如果是后者,那为什么还要讨论神话呢?即使所有进程都是单线程的,多任务OS也不总是受益于多核CPU吗?来自同一进程的线程是否更有可能在多个内核上同时调度?

  • 有哪些重要因素?CPU缓存可能吗?可能与某些应用程序相关?为什么?
  • 您为什么要使用并行库/算法?毕竟,CPU资源在所有正在运行的进程之间共享,并且总是有足够的资源。

是否有一个“主动过程”概念?即,最受调度程序关注的过程。如果是这样,那么此过程通常会引起多少关注?

Dav*_*rtz 5

是否将单个进程的线程分配给所有内核

是。

或者将来自不同进程的线程安排在不同的内核上运行。

是的,那也是。

如果是后者,那为什么还要讨论神话呢?即使所有进程都是单线程的,多任务OS也不总是受益于多核CPU吗?

在某种程度上,是的。但是,如果该过程需要进行大量计算,而我们只关心某个特定时间,那么收益将非常低。

另一方面,这也意味着该进程不太可能被中断,因为操作系统必须执行诸如处理磁盘中断,到达网络数据包之类的操作。中断进程以处理某些硬件任务,不仅减少了进程获得的CPU时间,而且还污染了CPU缓存,导致进程在恢复时运行得更慢。因此,多核CPU可以允许单线程进程以更长的时间百分比和更长的突发次数来命令内核。

来自同一进程的线程是否更有可能在多个内核上同时调度?

通常没有。你为什么想这么做?由于来自同一进程的线程更有可能踩到彼此的脚趾,因此这会降低整个系统的性能。您希望系统有效地完成其他进程的工作,以便您收回CPU。

是否有一个“主动过程”概念?

在某种程度上。Windows恰好具有这样的概念-“前台过程”。大多数操作系统没有。但是它们确实具有“动态优先级提升”功能。基本上,如果某个流程无所事事,然后又需要做某事,则将其作为“奖励”给予一定的优先级。这样一来,整个过程就可以等待工作完成,从而快速完成工作,并使系统更具交互性和响应能力。在服务器上通常没有什么意义,但在台式机上很有用。这是在线程上单独实现还是在一组进程的所有线程上实现都是特定于实现的。