我有一个Ubuntu服务器,它有16个CPU。(nproc --all给我看16)
我编写了一个名为test.sh的bash脚本,如下所示:
#!/bin/bash
while :
do
echo xxx
done我执行了:./test.sh >/dev/null &。
然后,我使用命令top来监视cpu使用情况,发现由于进程test.sh,几乎100%地使用了一个cpu:
6411 me 20 0 11240 3052 2852 R 93.8 0.0 0:11.71 test.sh
%Cpu5 : 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st正如我们所看到的,进程test.sh已经被分配到第5 CPU上,它已经被使用了几乎100%。
是否有可能在多个CPU上分配一个很重的进程,这样我们就可以更多地使用CPU?为什么操作系统没有在多个CPU上分配进程test.sh?是因为进程test.sh不够重,还是我们应该为操作系统做一些配置?
发布于 2019-06-06 09:40:10
单个线程不能在多个核之间拆分:
一个程序需要编写成有多个线程(每个内核一个线程),或者需要有多个程序。如果没有,你就不会使用核心。
编写使用更多内核的程序并不简单,并不是所有的问题都可以并行化(编写来运行在多个核心上)。如果一个问题包含20%基本上是连续的代码,那么如果有无限多的处理器,那么它将不会比原始执行时间的20%更快(500%的速度增长)。然后是间接费用(线程之间的通信)。
如果你没有任何的核心应用程序,那么你最好出售它,并得到一个更便宜的机器。
每个核心将有大量的并行性,以处理单个线程,但这是不可见的。现在,我们正在努力使单个核心更快,因为我们增加了核心。一开始效果很好。
Unix系统(如Gnu/Linux,例如Ubuntu)在使用额外的内核方面做得很好,大约有2→4。当您拥有病毒扫描器的核心、碎片整理器的核心和其他所有的内核时,微软的Windows都会得到改进。
在那之后,只有当你有为多核设计的应用程序时,它才会起作用。
发布于 2021-03-11 06:17:35
下面是可以使用多个处理器的linux命令的示例:
make -jgcc -pipe在用make编译大型项目时,gcc选项特别有用和简单。
-fopenmp选项添加到构建选项中。默认情况下,OpenMP将创建与机器内核相同的线程,并在它们之间平均地分担工作负载。
https://unix.stackexchange.com/questions/523252
复制相似问题