目录
在Linux中,进程是指计算机中正在运行的程序的实例。它是操作系统进行任务管理和资源分配的基本单位。每个进程都有自己的内存空间、代码、数据、文件描述符等资源。进程可以是用户启动的应用程序,也可以是系统自身运行的服务或守护进程。
进程的概念基于操作系统的多任务处理能力,它使得计算机可以同时执行多个任务。每个进程都拥有自己的执行上下文,包括程序计数器(用于记录下一条要执行的指令地址)、寄存器集、内存空间和打开的文件等。
进程之间通过操作系统提供的机制进行通信和同步,例如管道、信号、共享内存、消息队列等。进程可以创建子进程,形成进程树的层次结构。
操作系统通过进程调度算法按照一定的优先级和策略来分配CPU时间片给不同的进程,使得它们能够交替执行,给用户带来同时运行多个任务的错觉。
以下是进程的一些关键概念:
程序:程序是指存储在磁盘上的可执行文件,它包含了代码和静态数据。程序本身只是一个静态实体,没有执行过程。
进程:进程是程序的一个实例,具有自己的执行环境和资源。它由操作系统创建和管理,可以独立地运行和占用系统资源。每个进程都有一个唯一的PID,用于标识和管理进程。
进程控制块(PCB):PCB是操作系统中用于管理进程的数据结构。它包含了进程的状态信息、程序计数器、寄存器内容、进程优先级以及其他与进程相关的信息。操作系统使用PCB来跟踪和管理每个进程。
上下文切换:上下文切换是指当操作系统决定将CPU从一个进程切换到另一个进程时,保存当前进程的状态,并加载新进程的状态。上下文切换涉及将当前进程的寄存器、程序计数器和其他重要信息保存到内存中,然后加载新进程的信息,以便它可以继续执行。
父子进程关系:进程可以通过派生(fork)创建子进程。子进程从父进程继承了一些特性,并且可以执行不同的代码路径。父进程可以通过监视和管理子进程来实现进程间的通信和协作。
总之:
进程是多任务操作系统中最基本的单位,允许多个程序同时运行。操作系统通过并发调度算法来管理和分配系统资源,使得多个进程可以共享和竞争这些资源。进程的概念为操作系统提供了一种有效地组织和控制程序执行的方式。
进程是操作系统中运行的程序的实例,它具有独立的资源和执行上下文,通过操作系统的多任务处理能力实现并发执行和任务管理。?
进程号(Process ID,PID)是操作系统为每个正在运行的进程分配的唯一标识符。每个进程在系统中都有一个独立的进程ID,用于在进程管理和通信中进行标识和操作,是进程在操作系统中的身份证。
进程号是一个非负整数,通常以十进制表示。进程号的范围通常是从1到32767,但在某些系统上可能会有所不同。
每个进程在创建时都会被分配一个唯一的进程号,该进程号在整个系统中是唯一的,没有重复。进程号在系统中的唯一性保证了每个进程的独立性和可识别性。通过进程号,可以在系统中唯一标识一个进程,并对其进行操作,如终止进程、查看进程状态、监控资源使用等。
进程号的分配和管理由操作系统负责,当进程启动时,操作系统会为其分配一个唯一的进程号。进程号可能会随着进程的终止而释放,以便给新的进程使用。
进程号的作用有以下几个方面:
进程标识:通过进程号,可以唯一标识一个正在运行的进程,使操作系统能够定位和管理它。
进程控制:进程号用于操作系统对进程进行控制和管理,如启动、停止、暂停、终止等。
进程间通信:进程号可以用于不同进程之间的通信和协作,例如父子进程之间的通信。
进程状态监控:通过进程号,可以跟踪和监控特定进程的状态和资源使用情况。
在Linux中,有多个命令可以查看正在运行的进程。以下是一些常用的命令和选项:
`ps`命令用于显示当前系统中的进程快照。常用的选项包括:
a ??显示所有进程
u ??显示有效的使用者
x ??显示无终端控制的进程
- USER? ? ?进程的拥有者
- PID? ? ? ? ?进程号
- %CPU? ? CPU的使用率
- %MEM? ?内存的使用率
- VSZ? ? ? ?进程使用的虚拟内存量
- RSS? ? ? ?该进程占用的固定内存量
- TTY? ? ? ? 终端
- STAT? ? ? 状态位常见的状态字符
- START? ?开始时间
- TIME? ? ? 执行命令花费的时间
- COMMAND? ? 命令名
-e? 显示所有进程
-f? 全格式显示
- UID? ? ? ? 进程的拥有者
- PID? ? ? ? 进程号
- PPID? ? ?父进程号
- C? ? ? ? ? ?CPU使用率
- STIME ??命令开始时间
- TTY? ? ? ?终端
- TIME? ? ?执行命令花费时间
- CMD ????命令名字
可以根据进程名查询进程号?:
ps -ef|grep postgres
可以查找僵尸进程:
ps aux | grep zombie
注意:
僵尸进程通常只是系统中的临时存在,因为它们不会持续消耗资源。通常,重点是找到导致僵尸进程产生的问题,并解决其根本原因。这可能涉及修复父进程的错误处理代码,确保及时正确地回收子进程资源。?
-e
?选项表示显示所有进程,包括用户和系统进程。
--forest
?选项表示以树状结构显示进程。它会按照父子进程的关系将进程进行分组,并缩进显示。
- PID? ? ? ? 进程号
- TTY? ? ? ?终端
- TIME? ? ?执行命令花费时间
- CMD ????命令名字
`top`命令以交互方式实时显示系统资源的使用情况和运行中的进程。它提供了一个动态更新的进程列表,以及按CPU或内存使用率排序进程的功能。按下键盘上的 `q` 键可退出 `top`。
23:00:44 up 1:12
:这表示系统已经运行了1小时12分钟,当前时间为23:00:44。
2 users
:当前有2个用户登录到系统中。
load average: 0.00, 0.01, 0.02
:这是系统的平均负载情况。分别代表最近1分钟、5分钟和15分钟的平均负载值。在此示例中,负载值较低,表示系统目前没有太大的负荷。
Tasks: 107 total
:共有107个任务(进程)。
1 running
:其中有1个正在运行的任务(进程)。
106 sleeping
:有106个任务(进程)正在休眠状态。
0 stopped
:没有停止的任务(进程)。
0 zombie
:没有僵尸进程。
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
:这是关于 CPU 使用情况的统计数据,包括用户空间使用(us),系统内核空间使用(sy),空闲(id),等待 I/O 的时间(wa)等。
KiB Mem : 1862812 total, 1517268 free, 187480 used, 158064 buff/cache
:这是关于内存使用情况的统计数据,包括总内存量、空闲内存、已使用内存和缓存内存。
KiB Swap: 4194300 total, 4194300 free, 0 used. 1513148 avail Mem
:这是关于交换空间(Swap)使用情况的统计数据,包括总交换空间、空闲交换空间和可用交换空间。接下来是进程列表,每行表示一个进程。在本例中,以PID 296为例,它的用户(USER)是root,优先级(PR)为20,无调整优先级(NI),虚拟内存(VIRT)、常驻内存(RES)和共享内存(SHR)的使用情况,状态(S)为 S(休眠或睡眠),CPU 使用率(%CPU)为0.3%,内存使用率(%MEM)为0.0%,已运行时间(TIME+)为0:03.25,命令(COMMAND)是xfsaild/sda3。
?在
top
命令的输出中,对0.0 hi, 0.0 si, 0.0 st
的解释:
hi
:表示硬中断(Hardware Interrupts)的占用情况。硬中断是由硬件设备(如磁盘、网卡等)发出的信号,通知操作系统需要进行处理。这个字段显示了硬中断所占用的 CPU 时间。
si
:表示软中断(Software Interrupts)的占用情况。软中断是由操作系统内核发出的信号,通常用于执行系统级别的任务和处理外部事件。这个字段显示了软中断所占用的 CPU 时间。
st
:表示偷取时间(Steal Time)。当运行虚拟机时,如果物理主机的 CPU 资源不足,就会出现 CPU 被抢占的情况,即虚拟机无法正常使用分配给它的 CPU 时间。这个字段显示了被偷取的 CPU 时间。在这些字段中,显示的数值为百分比。如果它们的值为
0.0
,则表示当前没有或仅有微弱的硬中断、软中断或被偷取时间。这通常是一个好的指标,代表 CPU 在可用状态下,并且没有其他任务占用太多的处理时间。详解进程列表:
- PID:进程的ID,是唯一标识一个进程的数字。
- USER:进程的所属用户,表示进程属于哪个用户。
- PR:进程的优先级,数值越小优先级越高。
- NI:进程的优先级调整值,负数表示较高优先级,正数表示较低优先级。
- VIRT:进程使用的虚拟内存大小,包括进程的代码、数据和堆栈等。
- RES:进程使用的物理内存大小,表示进程实际占用的物理内存。
- SHR:进程使用的共享内存大小,表示进程与其他进程共享的内存。
- S:进程的状态,包括R(运行)、S(睡眠)、D(不可中断的睡眠)、Z(僵尸)等。
- %CPU:进程使用的CPU占比,表示进程在当前时间片内使用CPU的时间比例。
- %MEM:进程使用的内存占比,表示进程占用系统总内存的比例。
- TIME+:进程的累计CPU使用时间,表示进程已经使用CPU的总时间。
- COMMAND:进程的命令行,表示进程是通过哪个命令启动的。
`htop` 是 `top` 的增强版,提供了更美观和交互性更好的界面。它显示的信息更为详细,并允许通过键盘快捷键进行操作,如杀死进程、筛选进程等。
`pstree`命令以树形结构显示当前运行的进程及其关系。这对于理解进程之间的父子关系非常有用。
`pgrep` 命令以给定条件搜索正在运行的进程,并返回匹配的进程ID。
备注:
在Linux中,
ps
命令是静态查看进程的命令,而top
和htop
命令是动态查看进程的命令。
ps
命令用于显示当前系统中的进程快照。它提供了一次性的进程列表,显示当前运行的进程及其详细信息。ps
命令只会输出一次结果,并不会实时更新进程信息。
top
和htop
命令则是动态地查看正在运行的进程。它们以交互方式实时显示系统资源的使用情况和进程状态。这两个命令会持续更新并显示当前的进程列表,可以实时查看进程的CPU、内存和其他资源使用情况。因此,如果你需要查看当前系统中的进程列表一次性的快照,可以使用
ps
命令。如果你需要实时监视系统资源和进程的状态,并随时查看最新的进程信息,可以使用
top
或者htop
命令。
进程可以处于不同的状态,每个状态表示了进程当前的运行情况和状态变化。以下是 Linux 中常见的进程状态:
运行(Running):进程正在执行或准备执行。
等待(Waiting):进程被挂起,等待某个事件的发生,例如等待输入、等待系统资源或等待其他进程完成。
停止(Stopped):进程被暂停执行并进入停止状态,可以通过发送信号(如 SIGSTOP 或 SIGTSTP)来实现。
退出(Exited):进程已经正常终止并退出。
僵尸(Zombie):进程已经终止,但其父进程尚未处理完该进程的退出状态,使得进程成为僵尸进程。僵尸进程将占用系统资源,直到父进程获取其退出状态。
前台(Foreground):进程在前台运行,并且接收来自用户的输入。
后台(Background):进程在后台运行,不接收来自用户的输入。
停滞(Dormant):进程处于休眠状态,等待某些条件的发生才会恢复执行。
跟踪(Traced):进程正在被调试器跟踪。
每个进程都有一个优先级(priority)值,它决定了进程在系统中的调度顺序。Linux 使用了一个动态优先级范围,将优先级值分配给进程。以下是常见的 Linux 进程优先级:
实时优先级(Real-time priority):实时优先级用于实时进程,这些进程需要以可预测和确定性的方式响应系统事件。实时优先级范围从0到99,值越小表示优先级越高。
静态优先级(Static priority):静态优先级适用于普通的用户进程,它们使用默认的优先级规则进行调度。静态优先级范围从100到139,值越小表示优先级越高。
动态优先级(Dynamic priority):动态优先级根据进程的行为和资源利用情况进行动态调整。它指示了进程相对于其他进程的调度优先级,并且可能随时间变化。动态优先级范围从100到139,与静态优先级相同。
在 Linux 中,可以使用 nice
命令来设置进程的优先级。较低的数值表示更高的优先级。例如,nice -n 10 command
将以较低的优先级运行 command
。renice
命令用于更改正在运行的进程的优先级。
注意:
修改进程的优先级需要超级用户权限(root 或使用
sudo
)。
要查看进程的优先级,可以使用 ps
命令或者 top
命令。以下是两种方法:
ps
命令:运行以下命令来查看进程列表及其优先级:
ps -eo pid,ni,cmd
在输出中,ni
列显示了进程的动态优先级(nice 值)。较小的数值表示更高的优先级。
运行 ps -l
命令,可以获得更详细的进程信息,并且可以方便地查看进程的状态、资源使用情况和相关属性。?
该命令用于显示进程的详细信息和格式化输出。该命令将以长列表(long format)的方式显示进程的信息,以下是列注释:
F:进程的标志位,表示进程状态。
UID:进程的用户 ID,即启动该进程的用户。
PID:进程的 ID,唯一标识一个进程。
PPID:父进程的 ID,表示创建当前进程的父进程。
PRI:进程的动态优先级(priority)。
NI:进程的 NICE 值,用于调整进程的静态优先级。
SZ:进程使用的物理内存大小(以页面为单位)。
RSS:进程使用的实际物理内存大小(以 KB 为单位)。
WCHAN:进程在等待的事件或条件。
S:进程的状态,如 S 表示睡眠(sleeping)、R 表示运行(running)、Z 表示僵尸(zombie)。
TTY:与进程关联的终端设备。
TIME:进程已经使用的 CPU 时间。
CMD:进程的命令行。
备注:
进程的 PRI(Priority)默认值和 NICE 值的取值范围在不同的 Linux 系统中可能会有所不同。以下是一般情况下的默认值和取值范围:
PRI(Priority)默认值:它表示进程的相对调度优先级。默认情况下,大多数进程的 PRI 默认值是 0。这意味着它们具有普通的优先级。
NICE 值的取值范围:NICE 值的范围通常是 -20 到 +19,其中负数表示更高的优先级,而正数表示较低的优先级。较小的负数表示更高的优先级。在这个范围内,数值越小,进程的优先级就越高。较小的 NICE 值表示更高的优先级。超过 0 的 NICE 值(如 5)表示更低优先级,而小于 0 的 NICE 值(如 -15)表示更高优先级。
在某些系统中,只有特权用户(root)可以设置负的 NICE 值。非特权用户只能将 NICE 值设置为 0 或者正值。
top
命令:运行以下命令来打开实时进程监视器 top
,并按下 Shift + P
键按照 CPU 使用率进行排序。
top
?在 top
的进程列表中,你可以找到 NI
列,它显示了进程的动态优先级。
有几个命令可以用来终止进程,以下是常用的终止进程的命令:?
kill
命令用于向进程发送信号以请求其终止。默认情况下,使用 kill
命令发送的信号是 TERM(终止)信号。而 kill 命令用于输出特定的信号给指定进程号(PID)的进程并根据该信号完成指定的行为,其中可能的信号有进程挂起、进程等待、进程终止等。
例如,要终止进程 ID 1234 的进程,可以运行以下命令:
kill 1234
如果需要查看当前系统中支持的信号类型以及它们的编号,可以执行以下命令:
kill -l
每个信号都有一个唯一的编号和一个与之对应的名称。这些信号用于与进程进行交互,例如发送信号请求终止进程、中断程序的执行、重新加载配置等。
通过运行 kill -l
命令,你可以快速查看当前系统所支持的信号列表,并了解每个信号的标识符。这对于了解进程管理和与进程通信的操作非常有用。
注意:
kill -l
命令只是用于列出信号列表,并不会实际发送任何信号给进程。要向进程发送信号,你需要使用kill
命令并指定相应的信号编号或名称。
例如 :
通过执行kill -SIGTERM PID
将发送 SIGTERM 信号给指定的进程 ID(PID)以请求其正常终止。
通过执行 kill -9 <PID>
,可以向指定的进程发送 SIGKILL 信号,强制终止该进程。?
其中SIGKILL 是 Linux 中的一个预定义信号,编号为 9。它是一种不能被忽略或捕获的信号,它会立即终止目标进程,无论进程当前的状态如何。使用
kill -9
命令相当于对进程施加了“武力终止”。注意:
由于 SIGKILL 是一种非常强制的终止方式,它不会给进程执行清理操作的机会。进程在收到 SIGKILL 后将立即被终止,可能导致未完成的操作和数据丢失。因此,建议在正常情况下首先尝试使用其他信号(例如 SIGTERM)来请求进程的终止,以便进程有机会进行适当的清理和处理。
需要谨慎使用
kill -9
命令,只在必要时才使用,因为-9是强制杀死进程,没有挽回余地,谨慎使用可以避免意外的数据损坏或其他不可预见的后果。
killall
命令也根据进程名称来终止匹配的进程,但与 pkill
不同,它只接受精确的进程名称而不支持模式匹配。
例如,要终止所有名为 "myprocess" 的进程,可以运行以下命令:
killall myprocess
pkill
命令根据进程名称或其他属性来终止匹配的进程。
例如,要终止名为 "myprocess" 的进程,可以运行以下命令:
pkill myprocess
注意:
终止进程可能影响系统的稳定性和正在进行的任务,在进行任何进程终止操作时,请谨慎使用,并确保你知道终止哪个进程以及它可能产生的影响。