对于多核计算,一开始让我感到困惑的一件事是多核硬件的模型与实际机器相比过于抽象。
我使用单个英特尔处理器的笔记本电脑,包含 4核并支持超线程,这使得逻辑核心数<8>
。假设我有一个 Java 程序实现了一个并发算法(据说Java会使用线程调度的操作系统规则,所以JVM不会影响调度),而且程序是纯粹受CPU限制。
我的观察:
我对此的了解 据我所知,我运行的程序被操作系统视为用户进程,如果程序创建线程试图获得并行性,操作系统将尝试在可用的核心之间安排这些线程。 同一核心上的进程的任何线程可以共享该核心上进程的总执行时间。
我的问题: 假设CPU只运行我的程序。即没有其他用户进程。
如果只有1个CPU核心,则该过程不会受到多线程并行的好处,因为该过程的总执行时间不会改变。这是真的吗?
如果有多个可用内核,操作系统将尝试在不同内核上均匀公平地调度进程的线程,并且不同内核上的进程线程自己(额外) 执行时间,因此加快。这是真的吗?
如果有n个线程和m个核心,其中n> m,则某个核心可能会运行多于1个进程的线程,这可能会因为“上下文切换”而损害并行性的加速线程 与以不同速度运行的进程的线程相同的核心和潜在的副作用。这是真的吗?
非常感谢!
答案 0 :(得分:2)
如果只有1个CPU核心,则该过程不会受到多线程并行的好处,因为该过程的总执行时间不会改变。这是真的吗?
仅当您100%受CPU限制时。如果你有I / O等待,多个线程甚至可以在单个核心上提供帮助。
如果有多个可用核心,操作系统将在不同核心上均匀公平地安排流程的线程
这似乎取决于操作系统的判断力。可能涉及各种配额和优先事项。
由于同一核心线程之间的“上下文切换”,甚至可能会损害并行性的加速
确实存在管理额外线程的开销(不仅在调度级别,而且在应用程序内同步和通信),如果这些线程无法有效利用其他空闲的CPU核心,那么线程实际上可以提高性能。