怎么运行的

怎么运行的

我对 bash shell 中的并发和并行性有点困惑。据我了解,当我们同时在多个子 shell 中运行命令时,这些命令会在各个处理器内核上并行运行。

例如;

cmd1 & cmd2 & cmd3 & 

这里,“&”符号同时在每个命令的后台(也称为子 shell)中运行。它可以通过其他方式在子 shell 中创建。 (就像写在括号中或使用管道..)。

在这个方向上,我想知道这些问题的答案;

  • Bash 通过子 shell 提供并行性,另一方面,bash 上是否也使用另一种方法来实现并发?据我所知,并发的工作原理是单个CPU间歇性地执行操作。我是否需要在外部实现一个方法来实现此目的,或者 bash 已经以这种方式工作(并发)。
  • 如果我使用并行性占用所有CPU核心,系统会崩溃吗?或者是否有针对这种情况的保护机制?
  • 我用 subshel​​l 提供的并行和 GNU Parallel 工具有什么区别?如果 GNU Parallel 工具工作得更好,它是如何实现这一点的呢?
  • “并行”或“并发”操作哪个更有效?
  • 与正常(顺序执行命令)不同,进行“并行”或“并发”操作时会遇到什么样的损失?

答案1

怎么运行的

您说的“并发以单个 CPU 间歇性执行操作的方式工作”是正确的:请参阅http://ncce.io/wall-building

并发可以在单个处理器上运行,因此不需要很多核心,并且如果它们都在使用中也没关系。

如果有空闲核心,则不会使用上述技术,直到进程数多于核心数。

有管理费用:

  • 创建进程:比 MS-Windows 快得多,但仍然有开销。
  • 进程之间进行通信。
  • 进行并发:给人一种许多进程同时运行的错觉(切换到运行不同的进程需要一些努力)。

bash 有什么作用

Bash 创建一个新进程,操作系统内核完成剩下的工作。当一个进程(任何进程)创建一个新进程时,内核都会以相同的方式对待它。这是如何在 python 中执行此操作的示例https://ctrlaltdelor.wordpress.com/2019/06/01/creation-of-an-interprocess-pipe-in​​-python-the-unix-gnu-linux-way/

答案2

据我了解,当我们同时在多个子 shell 中运行命令时,这些命令会在各个处理器内核上并行运行。

不,这根本不是真的。当您运行多个命令时,它们会在系统上同时运行。

您也可以说这些命令是并行运行的。 “并行”一词有多种含义,但在谈论操作系统设计时,它通常与“并发”同义。

进程没有分配特定的核心。系统同时运行所有进程。更准确地说,内核运行所有[线程](更准确地说是所有线程) 同时;一个进程可以有多个线程。

当一个核心空闲时,内核会选择一个尚未在另一个核心上执行的有事情要做的线程(就绪线程),并在空闲核心上运行它一段时间。一旦时间片结束,内核就会选择另一个线程,依此类推。将线程从一个核心移动到另一个核心会消耗一些资源,但消耗量非常小,因此线程通常会经常从一个核心迁移到另一个核心。

并发并不意味着所有线程都在同一核心上运行。

这里,“&”符号同时在每个命令的后台(也称为子 shell)中运行。它可以通过其他方式在子 shell 中创建。 (就像写在括号中或使用管道..)。

这些命令在后台运行,但如果它们是外部命令,则它们不是子壳。子 shell 是在单独进程中运行的脚本的一部分,或者表现得就像在单独进程中运行一样(历史上所有子 shell 都在单独进程中运行,但一些现代 shell 可以对此进行优化)。

两者同时&运行|左侧和右侧。

几乎所有其他问题都是没有意义的,因为你所谓的“并行”根本不会发生。

答案3

我用 subshel​​l 提供的并行和 GNU Parallel 工具有什么区别?如果 GNU Parallel 工具工作得更好,它是如何实现这一点的呢?

“更好”是这里的关键词。它并不更快(&每个作业大约需要 0.5 毫秒,GNU Parallel 每个作业大约需要 5 毫秒),但它给了您更多的控制权:

  • 它可以防止混合输出:seq 100000 & seq 100000 &将混合输出。
  • 它可以继续并行运行有限数量的作业。
  • 它可以远程运行作业。
  • 它可以从模板和多个输入生成命令行。
  • 它可以重试失败的作业。

仅举几个。

相关内容