根据此处:https://www.codeword.xyz/2015/09/02/three-ways-to-script-processes-in-parallel/
等待,我可以执行以下操作:
#!/bin/sh
/usr/bin/my-process-1 --args1 &
/usr/bin/my-process-2 --args2 &
/usr/bin/my-process-3 --args3 &
wait
echo all processes complete
假设我有数百个进程,每个进程是否会在一个单独的线程中同时启动?
什么决定了可以启动的线程数限制?
答案 0 :(得分:1)
首先,进程不是线程。进程包含一个或多个线程。它从一个线程开始,如果愿意,可以创建更多线程。这是一个相似的想法,但是进程中的线程共享进程的地址空间(每个线程可以访问/共享程序的变量)。每个进程都获得一个单独的地址空间,并且无法访问操作系统分配给它之外的内存。
您运行的任何程序都会获得一个进程。当您运行脚本时,语言解释器(无论是外壳程序,Python还是其他语言)都会被调用以执行脚本,这就是一个过程。 程序和进程之间的区别在于,该进程是运行实例。因此,如果有3个终端正在运行bash
,则有3个进程在运行一个程序。请注意,这并不一定意味着要打开窗口:我的邮件程序可以打开多个窗口,但仍然是由一个进程完成的。
是的,您可以启动许多并发进程。限制由操作系统强加。 32K是一个常见的限制,但是不同版本的Unix / Linux支持不同的进程数。除非您是root
,否则通常还会有每个用户的进程限制。
实际上,并发进程数也受可用内存和CPU的限制。如果您有4GB的RAM,并且有一个程序,每个进程/实例占用500K,则在耗尽RAM之前可以运行约6000份副本(500K * 6000份= 3GB,并且操作系统本身需要一些)。此时,您的系统将依赖于其swapfile,但是如果所有这些进程都试图运行,您将遇到thrashing。 如果对SSD执行此操作,则会缩短其寿命。
而且,除非您拥有一台具有数百或数千个处理器的超级计算机,否则实际上不只是几个并发且占用大量CPU的进程。如果在4核计算机上启动100个CPU密集型(“ CPU绑定”)进程,则操作系统将使用time slicing在所有100个CPU上分配核心时间,因此每个进程将以4核/ 100个进程= 1运行/ 25拥有它自己的核心的运行速度。 分叉成千上万个并发进程将无法完成更多工作,除非您有实际执行工作的硬件。
受CPU约束的另一面是受I / O约束-假设您要镜像一个网站,那么您将尝试并行下载所有1000页。它不会比有限数量的并行连接要快得多,因为每个连接只能顺序地捕获项目,因为只有这么多的比特可以流经网络。 一旦网络饱和,更多的并发将不会使任何事情变得更快。
您可以使用ps
列出您的个人流程,或者使用ps -ef
或ps aux
查看所有流程。有很多:当我写这篇文章时,我的系统有235个,但是其中大多数是闲置的:我暂时不使用的终端,网络支持,音频支持(在被调用时),我正在写的网络浏览器,当网络浏览器要求时更新屏幕的合成器。通过查看此列表,并查找各种程序的功能/它们提供的服务,您可以了解有关OS的很多知识。在这里,您可以看到您的操作系统不是一个大黑匣子,而是许多程序/进程的集合,每个程序/进程都提供了一些有限的功能,但是一起提供了大多数OS服务。