I am having some real trouble finding this info online, im in Uni monday so i could use the library then but the soon the better. When a system has multicore processors, does each processor take a thread from the first process in the ready queue or does it take one from the first and one from the second? Also just to check, threads will be sent and fetched from the multicores concurrently by the OS right? If anyone could point me in the right direction resource wise, that would be great!
1 回答
关键是要了解机器的架构实际上是什么。
“核心”是一个带有高速缓存的 CPU,它连接到系统内存。大多数机器架构都是对称多处理,这意味着系统内存可以被系统中的所有内核平等地访问。
大多数操作系统在每个内核上运行一个调度程序线程(Linux 有)。调度程序有一个它负责的线程列表,它会在它控制的核心上尽其所能地运行它们。它用于选择运行哪个线程的规则将是循环或基于优先级等;即所有正常的调度规则。到目前为止,它就像您可以在单核计算机中找到的调度程序。在某种程度上,每个调度器都独立于所有其他调度器。
但是,这是一个 SMP 环境,这意味着哪个内核运行哪个线程并不重要。这是因为所有的内核都可以看到所有的内存,整个系统中所有线程的所有代码和数据都存储在那个单一的内存中。
因此,调度员相互交谈以互相帮助。有太多线程无法运行的调度程序可以将线程传递给其核心未充分利用的调度程序。它们是机器内的负载平衡。“传递线程”意味着复制描述线程的数据结构(线程id,哪些数据,哪些代码)。
就是这样。由于内核之间的唯一通信是通过内存进行的,因此这一切都依赖于可用的有效互斥信号系统,这是硬件必须允许的。
困难
所以我画了一个非常简单的画面,但实际上记忆并不是完全对称的。如今的 SMP 是在 HyperTransport 和 QPI 之上综合的。
在电子级别上,内核确实可以平等地访问系统内存的日子已经一去不复返了。在其架构的最底层,AMD 纯粹是 NUMA,而英特尔几乎也是。
如今,一个核心必须通过高速串行链路(HyperTransport 或 QPI)向其他核心发送请求,要求它们发送它们在附加内存中获得的数据。英特尔和 AMD 做得很好,使它在一般情况下看起来像 SMP,但它并不完美。连接到不同内核的内存中的数据需要更长的时间才能获取。这非常复杂——核心现在是网络上的节点——但这是他们必须做的才能提高性能。
因此调度程序在选择哪个内核应该运行哪个线程时会考虑到这一点。他们将尝试将线程放置在最靠近内存的内核上,该内存保存线程可以访问的数据。
未来,再一次
如果世界的软件生态系统可以脱离 SMP,硬件人员将能够在硅片上节省大量空间,我们将拥有更快更高效的系统。这是以前做过的;晶片机是严格 NUMA 架构的一次很好的尝试。
NUMA 和 Communicating Sequential Processes 今天将使编写多线程软件变得更加容易,这些软件比当今的 SMP 共享内存庞然大物更容易扩展和更高效地运行。
SMP 实际上是一种将多个内核聚集在一起的廉价而讨厌的方式,并且在软件开发困难和低效硬件方面的成本非常高。