对于多核计算,一开始让我感到困惑的是,多核硬件的模型对真机过于抽象。
我在一台带有单个英特尔处理器的笔记本电脑上工作,包含4 个内核并支持超线程,这使得逻辑内核的数量为 8。
假设我有一个Java程序实现了并发算法(据说Java会使用线程调度的OS规则,所以JVM不会影响调度),并且程序是纯CPU绑定的。
我的观察:
- 如果程序(进程)运行的线程数少于 8 个,则工作的并行度会随着线程数的增加而增加
- 当总线程数大于 8 时,性能会变得复杂,但通常不会比运行 8 个线程有更多的改进;而对于某些特定的算法,它比运行8个线程更糟糕,即时间消耗大大增加。
我对此的了解: 据我所知,我运行的程序被操作系统视为用户进程,如果程序创建线程以尝试获得并行性,操作系统将尝试在可用内核中调度这些线程。同一内核上进程的任何线程都可以共享该内核上进程的总执行时间。
我的问题: 假设 CPU 只运行我的程序。即没有其他用户进程。
如果 CPU 只有 1 个核心,则该进程将无法通过多线程获得并行性的好处,因为该进程的总执行时间不会改变。这是真的吗?
如果有多个内核可用,操作系统将尝试在不同内核上均匀、公平地调度进程的线程,并且不同内核上的进程线程获得自己的(额外)执行时间,从而加快速度。这是真的吗?
如果有 n 个线程和 m 个内核,其中 n>m,则某些内核可能会运行超过 1 个进程的线程,这甚至可能会因为同一内核上的线程之间的“上下文切换”而损害并行性的加速,并且以不同速度运行的进程线程的潜在副作用。这是真的?
非常感谢!