“工作”和“过程”有什么区别?
“工作”和“过程”有什么区别?
Answers:
进程是具有自己的地址空间的任何正在运行的程序。
作业是外壳程序使用的概念-交互启动的任何不会分离的程序(即,不是守护程序)都是作业。如果您正在运行交互式程序,则可以按CtrlZ暂停它。然后,您可以从前台(使用fg
)或在后台(使用bg
)重新启动它。
当程序挂起或在后台运行时,您可以启动另一个程序-然后,您将有两个作业在运行。您还可以通过添加“&”来启动在后台运行的程序,如下所示:program &
。该程序将成为后台工作。要列出您正在运行的所有作业,可以使用jobs
。
有关作业的更多信息,请参见bash手册页的此部分。
ls | sort
是一项工作,但是每个命令都作为不同子shell进程的子进程运行。这是一个由多个流程组成的工作示例。您对工作的定义如何解释工作可以包含多个流程?
UNIX具有单独的概念“进程”,“进程组”和“会话”。
登录时获得的每个shell都将成为其自己的新会话和进程组的领导者,并将终端的控制进程组设置为其自身。
Shell在当前会话中为其启动的每个“作业”创建一个进程组,并将其启动的每个进程放入相应的进程组中。例如,ls | head
是两个流程的管道,外壳将其视为单个作业,并将属于一个新的流程组。
进程是执行线程和其他上下文(例如地址空间和文件描述符表)的(集合)。一个进程可以启动其他进程;除非采取其他措施,否则这些新流程将与父流程属于同一流程组。每个进程也可能有一个“控制终端”,它从其父进程开始。
外壳具有“前景”作业和“背景”作业的概念。前台作业是受终端控制的过程组,而后台作业是不受终端控制的过程组。
每个终端都有一个前台进程组。当将作业带到前台时,shell将其设置为终端的前台进程组;当将作业放到后台时,shell将终端的前台进程组设置为另一个进程组或本身。
如果进程在前台进程组中,则它们可以从其控制终端读取和写入。否则,它们接收SIGTTIN
和SIGTTOU
上尝试信号从读取和写入分别向终端。默认情况下,这些信号会挂起该过程,尽管大多数外壳会掩盖,SIGTTOU
以便后台作业可以不间断地写入终端。
上面的定义是非常技术性的,但是操作人员可能需要更多的日常澄清。我认为工作是有计划的过程。一般而言,当我们处理流程时,不一定有计划的概念,但是当我们使用“工作”一词时,我们总是表示它是计划的,或者像循环一样重复,就像工作。