以下是后台进程的常见定义:
“后台进程是在没有用户输入的情况下运行的程序。当用户与前台进程交互时,多任务操作系统(例如 Linux)上可以运行多个后台进程。一些后台进程(例如守护进程)用于例如,从不需要用户输入。当用户忙于当前在前台运行的程序时,其他进程只是暂时处于后台,因此其他进程可以处于休眠状态并占用交换空间,直到被激活,这使得它当前成为一个进程。后台进程。”
考虑到这个定义,难道不会使像 apache2 这样的进程成为后台进程,因为它从不与终端中的用户输入交互吗?难道这不会考虑大多数进程后台进程吗,因为系统上运行的大多数进程不处理终端中的用户输入?奇怪的是,我个人不会认为 apache2 是一个后台进程,因为用户确实通过 http 请求(只是不是终端)与它交互。
答案1
“后台进程”有两种常见的定义,一种是笼统的定义,另一种是针对 UNIX 的精确且特定的定义。
从广义上讲,您可以将任何不与坐在控制台的用户交互的进程称为“后台进程”。从这个意义上说,Apache是一个后台进程。
在unix术语中,“后台进程”有一个精确的定义。 A后台进程是从终端启动但当前禁止与终端交互的进程。 (我通过不考虑进程组来进行简化。)通常,您可以通过在 shell 中启动后台作业来获得后台进程:
$ myprogram &
[1] 12345
$
或者启动一个程序,然后挂起它并让它在后台继续运行:
$ myprogram
^Z
[1]+ Stopped myprogram
$ bg
[1]+ myprogram &
$
如果您启动一个没有 的程序&
,它会在前台运行。前台只能有一个进程在给定的终端一次。 (或者更一般地说,如果前台进程启动一些子进程,则为单个进程组。)shell 内置命令bg
并fg
更改哪个进程位于前台。当进程在后台时,如果它尝试读取或写入终端,则由 SIGTTIN 或 SIGTTOUT 信号停止。
我发现您的直觉认为 Apache 不是后台进程,因为它通过 HTTP 与用户交互,这很奇怪。 Apache 不与用户交互:它与远程 Web 浏览器(与用户交互)或自动化客户端(不与用户交互)交互。如果您将任何与交互式进程交互的进程视为交互式进程,那么任何进程都是交互式的,这使得它成为一个无用的概念。
您引用的定义将后台进程与空闲进程混为一谈。后台进程没有理由比前台进程休眠或换出更多时间。例如,后台进程可能正在执行一些繁重的计算。相反,如果用户离开控制台,并且还有其他活动进程,则前台进程可能会被换出。
答案2
前台进程不需要用户交互。你可以做
cp very_large_file destination
这将阻塞您的终端,直到复制完成,并且将被视为没有用户交互的前台进程。这里的重点是过程是否块执行其他进程直至其终止。
有两种方法可以将前台进程变成后台进程:
&1-在命令行末尾添加与号 ( ):
cp very_large_file destination &
2-停止前台进程然后将其置于后台:
cp very_large_file destination
CTRL+Z
bg
现在apache2
肯定会算作后台进程:是的,您可以通过 http 请求与它交互,但它只是侦听端口 80(默认情况下)等待这样的请求:在用户发出请求之前,它不会阻塞系统。
为什么您对大多数被视为后台进程的进程持异议?这在“多任务操作系统”中确实很正常。