假设我有一个运行 linux 的双核 cpu。
如果我在后台启动两个单线程进程(nodejs),它们是如何调度的?
我是否可以假设操作系统将尽其所能,尝试让每个进程在不同的内核上运行,或者我是否需要做一些不同的事情?
答案1
是的,它会跨核心安排工作,而无需您进行任何额外的配置。
由此ibm.com 上关于 Linux SMP 的优秀文章(强调我的):
在 Linux 2.0 的早期,SMP 支持由一个“大锁”组成,它可以跨系统串行访问。对 SMP 支持的进步慢慢地出现了,但直到 2.6 内核,SMP 的威力才最终显现出来。
2.6 内核引入了新的 O(1) 调度程序,其中包括对 SMP 系统的更好支持。关键是能够在可用 CPU 之间平衡工作负载,同时保持一定的缓存效率。为了提高缓存效率,请回顾图 4,当某个任务与单个 CPU 关联时,将其移动到另一个 CPU 需要刷新该任务的缓存。这会增加任务的内存访问延迟,直到其数据进入新 CPU 的缓存。
2.6内核为每个处理器维护一对运行队列(过期运行队列和活动运行队列)。每个运行队列支持 140 个优先级,其中前 100 个用于实时任务,后 40 个用于用户任务。任务被赋予执行时间片,当它们使用分配的时间片时,它们会从活动运行队列移动到过期运行队列。这为所有任务提供了对 CPU 的公平访问(并且仅针对每个 CPU 进行锁定)。
通过每个 CPU 的任务队列,可以在给定系统中所有 CPU 的测量负载的情况下平衡工作。每 200 毫秒,调度程序执行负载平衡以重新分配任务负载,以维持处理器复合体之间的平衡。有关 Linux 2.6 调度程序的更多信息,请参阅参考资料部分。