大家好,我是本期栏目编辑小友,现在为大家讲解Linux进程的概念说明问题。
进程是Linux操作系统中最重要的基本概念之一。在这一节中,我们将学习Linux进程的一些基本知识。
进程是运行在Linux中的程序的一个实例。这是一个你可能听过的基本定义。
当你在Linux中执行一个程序时,系统会为这个程序创建一个特定的环境。这个环境包含系统运行这个程序所需的一切。
每次在Linux中执行一个命令,它都会创建或启动一个新的进程。例如,当您试图运行命令“ls -l”来列出目录的内容时,您启动了一个进程。如果屏幕上显示了两个终端窗口,那么你可能已经运行了同一个终端程序两次,然后会出现两个终端进程。
每个终端窗口都可能有一个正在运行的Shell,每个正在运行的Shell都是一个进程。当您从Shell中调用命令时,相应的程序将在新的进程中执行。当这个程序的进程被执行时,Shell的进程将恢复运行。
操作系统通过一个称为PID或进程标识的数字代码来跟踪进程。系统中的每个进程都有一个唯一的PID。
现在我们通过一个例子知道了Linux中的这个过程。我们在Shell命令行执行以下命令:
[ c.biancheng.net]$ sleep 10
[1] 3324
因为程序将等待10秒钟,所以我们可以在当前Shell上快速找到任何名为sleep的进程:
[c . biancheng . net]$ PS-ef | grep sleep
莫志艳3324 5712 cons 1 17:11:46/usr/bin/sleep
我们看到名为/usr/bin/sleep的进程正在系统中运行(它的PID与我们在前面的命令中得到的相同)。
现在,我们尝试从三个不同的终端窗口并行运行上面的sleep命令,上面命令的输出将类似于以下内容:
[c . biancheng . net]$ PS-ef | grep sleep
莫志燕896 5712 cons 1 17:16:51/usr/bin/sleep
莫志艳5924 5712 cons 1 17:16:52/usr/bin/sleep
莫志艳24245712 cons 1 17:16:50/usr/bin/sleep
我们看到睡眠程序的每个实例都创建了一个单独的进程。
每个Linux进程都有另一个id号,它是父进程(ppid)的ID。系统中的每个用户进程都有一个父进程。
命令“ps -f”将列出过程的PID和PPID。该命令的输出类似于以下内容:
[ c.biancheng.net]$ ps -f
PPIDTTY史汀生司令部
莫志艳4124 228 cons 0 21:37:09/usr/bin/PS
mozhiyan 228 1 cons 0 21:32:23/usr/bin/bash
在Shell命令提示符下运行的所有命令都将当前的Shell进程作为父进程。例如,如果在Shell命令提示符下输入ls命令,Shell将执行ls命令。此时,Linux内核将复制Shell的内存页面,然后执行ls命令。
在Unix中,每个进程都是使用fork和exec方法创建的。但是,这种方法会导致系统资源的损失。
在Linux中,fork方法是通过写时复制内存页来实现的,因此它只会造成复制父进程内存页表所需的时间和内存的损失,并为子进程创建唯一的任务结构。
写时复制模式避免了在创建新进程时创建不必要的结构副本。比如用户在Shell的命令提示符下输出ls命令,Linux内核会创建Shell的一个子进程,也就是说Shell的进程是一个父进程,而ls命令的进程是一个子进程,它会指向与这个Shell相同的内存页面,然后子进程会利用写时复制技术执行ls命令。
前台流程和后台流程。
启动进程(运行命令)时,可以通过以下两种方式运行:
前台进程
背景过程
默认情况下,您启动的每个进程都在前台运行。它从键盘接收输入,并将其输出发送到屏幕。
当一个进程在前台运行时,我们不能在同一个命令提示符下运行任何其他命令(启动任何其他进程),因为在程序完成其进程之前,命令提示符不可用。
启动后台进程的最简单方法是在命令的末尾添加一个控制运算符“”。例如,以下命令将启动后台进程:
[c.biancheng.net]$ sleep 10 &[1] 5720
现在 sleep 命令被放在后台运行。当 Bash 在后台启动一个作业时,它会打印一行内容显示作业编号([1])和进程号(PID-5720)。当作业完成时,作业会发送类似如下的信息到终端程序,来显示此作业已完成,其内容类似如下所示:
[1]+ Done sleep 10
将进程放在后台运行的好处是:你可以继续运行其他命令,而不需要等待此进程运行完成再运行其他命令。
进程的状态
每个 Linux 进程都有它自己的生命周期,比如,创建、执行、结束和清除。每个进程也都有各自的状态,显示进程中当前正发生什么。
进程可以有如下几种状态:
D(不可中断休眠状态)——进程正在休眠并且不能恢复,直到一个事件发生为止。
R(运行状态)——进程正在运行。
S(休眠状态)——进程没有在运行,而在等待一个事件或是信号。
T(停止状态)——进程被信号停止,比如,信号 SIGINT 或 SIGSTOP。
Z(僵死状态)——标记为 《defunct》 的进程是僵死的进程,它们之所以残留是因为它们的父进程适当地销毁它们。如果父进程退出,这些进程将被 init 进程销毁。
若要查看指定进程的状态,可以使用如下命令:
ps -C processName -o pid=,cmd,stat
例如:
[c.biancheng.net]$ ps -C sleep -o pid=,cmd,stat
CMD STAT
9434 sleep 20 S
标签:
版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。