当你在机器上启动某个程序时,它只是在自己的“bubble”里面运行,这个气泡的作用就是用来将同一时刻运行的所有程序进行分离。这个“bubble”也可以称之为进程,包含了管理该程序调用所需要的一切。
例如,这个所谓的进程环境包括该进程使用的内存页,处理该进程打开的文件,用户和组的访问权限,以及它的整个命令行调用,包括给定的参数。
此信息保存在UNIX/Linux系统的流程文件系统中,该系统是一个虚拟文件系统,可通过/proc目录进行访问。条目都已经根据进程ID排过序了,该ID是每个进程的唯一标识符。示例1显示了具有进程ID#177的任意选择的进程。
示例1:可用于进程的信息
构建程序代码以及数据
程序越复杂,就越有助于将其分成较小的模块。不仅仅源代码是这样,在机器上执行的代码也同样适用于这条规则。该规则的典型范例就是使用子进程并行执行。这背后的想法就是:
单个进程包含了可以单独运行的代码段
某些代码段可以同时运行,因此原则上允许并行
使用现代处理器和操作系统的特性,例如可以使用处理器的所有核心,这样就可以减少程序的总执行时间
减少程序/代码的复杂性,并将工作外包专门的代理
使用子进程需要重新考虑程序的执行方式,从线性到并行。它类似于将公司的工作视角从普通员工转变为经理——你必须关注谁在做什么,某个步骤需要多长时间,以及中间结果之间的依赖关系。
这有利于将代码分割成更小的部分,这些更小的部分可以由专门用于此任务的代理执行。如果还没有想清楚,试想一下数据集的构造原理,它也是同样的道理,这样就可以由单个代理进行有效的处理。但是这也引出了一些问题:
为什么要将代码并行化?落实到具体案例中或者在努力的过程中,思考这个问题有意义吗?
程序是否打算只运行一次,还是会定期运行在类似的数据集上?
能把算法分成几个单独的执行步骤吗?
数据是否允许并行化?如果不允许,那么数据组织将以何种方式进行调整?
计算的中间结果是否相互依赖?
需要对硬件进行调整吗?
在硬件或算法中是否存在瓶颈,如何避免或者最小化这些因素的影响?
并行化的其他副作用有哪些?
可能的用例就是主进程,以及后台运行的等待被激活的守护进程(主/从)。此外,这可能是启动按需运行的工作进程的一个主要过程。在实践中,主要的过程是一个馈线过程,它控制两个或多个被馈送数据部分的代理,并在给定的部分进行计算。
请记住,由于操作系统所需要的子进程的开销,并行操作