while(1) 为什么只能占满 CPU 的一个核心?

这个问题可以分成两个问题

  1. while(1) 为什么不能将 CPU 的所有核心占满? 答案是:一个线程同一时刻只能运行在一个核心上。
  2. 就算一个线程同一时刻只能运行在一个核心上,那为什么不是平均分布在多个核心上,而是只霸占一个核心呢? 答案是:Linux 内核线程调度天生具有 软 CPU 亲和性 的特性,这意味着线程通常不会在多核心之间频繁迁移。这种状态也是我们希望的,因为线程迁移也有开销。

当一个进程在一个多处理器系统上被重新调度时无需在上一次执行的CPU上运行。之所以会在另一个CPU上运行的原因是原来的CPU处于忙碌状态。

进程切换CPU时对性能会有一定的影响:如果在原来的CPU的高速缓冲器中存在进程的数据,那么为了将进程的一行数据加载进新CPU的高速缓冲器中,首先必须使这行数据失效(即在没被修改的情况下丢失数据,在被修改的情况下将数据写入缓存)(为防止高速缓冲器不一致,多处理器架构在某个时刻只允许数据被存在在一个CPU的高速缓冲器中)。这个使数据失效的过程会消耗时间。这个使数据失效的过程会消耗时间。由于存在这个性能影响,Linux(2.6)内核尝试了给进程保证软 CPU 亲和力—在条件允许的情况下进程重新被调度到原来的CPU 上运行。

参考

https://zhuanlan.zhihu.com/p/38541212 https://blog.csdn.net/zhizhengguan/article/details/117461777 https://www.cnblogs.com/roverliang/p/6890942.html https://zhidao.baidu.com/question/496674453.html https://www.cnblogs.com/valjeanshaw/p/11469514.html https://zhuanlan.zhihu.com/p/388356797 https://blog.csdn.net/bandaoyu/article/details/113700713

参考

CPU使用率到100%了?

核与线程 什么叫四核八线程_agrinJPG的博客-CSDN博客_4核8线程