多个子进程是否利用多个核心?

多个子进程是否利用多个核心?

我有一个问题,它基本上是探索一些利用机器上所有核心的偷懒方法。

假设我有一个程序“./theprogram”,它对数据集 D 起作用,是“高度并行的”,并且接受一个命令行参数 j,该参数在由 j 确定的数据集子集上执行该程序。

然后假设我在终端中运行命令

./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &

现在我已经为 j1、j2、...jfinal 生成了子进程

我的问题是:假设我有现代的 unix 系统(比如说在多核芯片上运行的最新 Mac Os X)

那么进程是否会分别分布在所有核心上?也就是说,我会利用所有核心吗?

答案1

理论上是的。

操作系统将任务调度到未使用的 CPU 核心上。它知道什么时候核心未使用,因为它刚刚取消了该核心上的任务调度。

您的进程将在其结构中有一个标志,表示它是否正在等待输入(磁盘,键盘,鼠标等),如果它没有等待任何这些东西,那么它是可调度的。

对于每个核心,操作系统基本上都会运行其可调度任务列表并进行调度。这些任务将在核心上分配一段时间,然后再次暂停,以便操作系统能够查看其他进程需要运行。

如果不需要运行其他进程,那么您的进程仍将位于列表顶部并可再次运行。

自然的效果是,只需很少的管理开销,您的 CPU 将得到充分利用,假设您的所有进程都不会相互阻塞或花费大量时间等待磁盘访问。

您可以使用任何具有可并行数据的多线程应用程序对此进行测试。视频编码和数据压缩是这种并行性发挥作用的两种情况。

Handbrake 是一款基于 CPU 的视频编码器(最近还支持 GPU),可以使用任意数量的 CPU 内核,从而大幅提高速度。许多视频编码器可以充分利用多个内核。x.264 和其他编码器也支持多线程。

7-Zip 是一款压缩程序,它还可以利用 LZMA2 算法中的多个线程来加速压缩。压缩字典的构建是一个合理的共享过程,一旦您拥有了字典,实际的压缩就“很容易”并行化。

答案2

为了实现多进程,你必须选择遵循以下规则的代码部分:

  1. 不能依赖以前的结果
  2. 不需要按特定顺序执行
  3. 不会返回任何需要在代码中稍后访问的内容

所以从我听到的来看,您应该能够使用多个核心。

相关内容