进程的定义
进程(Process)是操作系统进行资源分配和调度的基本单位,是程序的一次执行过程。 可以将进程理解为一个正在运行的程序的实例。当一个程序(例如一个 .exe 文件)被启动时,操作系统会为其创建一个进程。
进程具有以下关键特性:
• 独立的内存空间:每个进程都拥有自己独立的虚拟地址空间,包括代码段、数据段、堆和栈。这意味着一个进程通常不能直接访问另一个进程的内存数据,保证了进程间的隔离性和安全性。
• 资源拥有者:进程是系统资源(如内存、文件句柄、网络连接、I/O设备等)的拥有者。操作系统将这些资源分配给进程进行管理。
• 执行上下文:进程包含其运行所需的所有信息,如程序计数器(PC)、寄存器状态、堆栈、打开的文件列表、环境变量等。这些信息共同构成了进程的“上下文”。
• 生命周期:进程有明确的生命周期,包括创建(fork/exec)、运行、等待(阻塞)、就绪和终止(退出)等状态。 简单来说,进程 = 程序 + 执行上下文 + 资源
进程与线程的关系
进程和线程的联系
线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
可以把进程想象成一个公司,而线程就是公司里的员工。公司(进程)拥有所有的资源(办公室、设备、资金),而员工(线程)则使用这些资源来完成具体的工作。
1. 核心联系
- 包含关系:一个进程至少包含一个线程(主线程),也可以包含多个线程。这些线程共享该进程的资源。
- 资源共享:同一个进程内的所有线程共享该进程的内存地址空间和资源(如文件描述符、全局变量等)。这使得线程间的通信和数据交换非常高效。
- 并发执行:一个进程内的多个线程可以并发(在单核CPU上)或并行(在多核CPU上)执行,从而提高程序的执行效率,尤其是在处理I/O密集型或需要同时响应多个任务的场景中。
2. 主要区别
特性 | 进程 (Process) | 线程 (Thread) |
---|---|---|
资源拥有 | 拥有独立的资源(内存空间、文件等) | 共享所属进程的资源 |
内存空间 | 独立的地址空间,互不访问 | 共享进程的地址空间,可直接访问彼此的数据 |
创建开销 | 较大(需要分配资源、建立独立空间) | 较小(只需创建栈和寄存器等少量资源) |
通信方式 | 复杂(需使用IPC:管道、消息队列、共享内存等) | 简单(通过共享变量、直接函数调用等) |
独立性 | 独立运行,一个进程崩溃通常不影响其他进程 | 依赖进程,一个线程崩溃可能导致整个进程终止 |
调度单位 | 操作系统调度的基本单位之一 | CPU调度的最小单位 |
切换开销 | 较大(涉及内存空间切换) | 较小(在同一进程内切换,无需切换地址空间) |
3. 举例说明
- 浏览器:一个现代浏览器(如Chrome)通常会为每个标签页(或扩展程序)创建一个独立的进程。这样,一个标签页崩溃不会导致整个浏览器关闭。而在一个标签页内部,可能会有多个线程,比如一个线程负责渲染页面,一个线程负责执行JavaScript,一个线程负责处理网络请求,它们共享该标签页进程的内存和资源。
- 文本编辑器:一个文本编辑器是一个进程。它内部可能有一个线程用于处理用户输入,一个线程用于自动保存,一个线程用于语法检查,这些线程协同工作,但共享编辑器的文档数据。
进程是资源分配的单位,提供了运行环境;线程是CPU调度的单位,是在这个环境里实际干活的“工人”。多线程允许一个进程内的任务并发执行,提高了效率,但也带来了线程同步(如使用锁)等复杂性问题。选择使用多进程还是多线程,需要根据具体的应用场景(如对稳定性、性能、通信复杂度的要求)来权衡。
查看进程的基本命令
ps
对 ps -e | more
命令输出的解释
1. 命令作用
ps -e
: 列出当前系统中所有正在运行的进程(包括前台和后台进程)。| more
: 将输出内容分页显示,方便逐屏查看(按空格键翻页,按q
退出)。
2. 输出列含义
列名 | 含义 |
---|---|
PID | 进程的唯一标识符(Process ID)。 |
TTY | 进程关联的终端设备(? 表示无终端)。 |
TIME | 进程已占用的 CPU 时间(格式:分钟+秒)。 |
CMD | 启动进程的命令名称或路径。 |
3. 关键进程说明
systemd
(PID 1)
系统初始化进程,负责启动和管理系统服务。kthreadd
(PID 2)
内核线程守护进程,动态创建和管理内核线程。ksoftirqd/[CPU编号]
处理软中断(如网络、磁盘 I/O)的内核线程,数字表示 CPU 核心。kworker/[CPU:队列]
执行内核异步任务的线程(如设备驱动操作),H
表示高优先级任务。migration/[CPU]
负责将进程从一个 CPU 核心迁移到另一个核心,优化负载均衡。rcu_*
线程
支持 RCU(Read-Copy Update)机制,用于内核并发同步。watchdog/[CPU]
监控系统响应状态,防止 CPU 挂起。kdevtmpfs
管理tmpfs
临时文件系统的内核线程。khungtaskd
检测并处理长时间无响应的进程。
关于“表名”的解释
,ps -ef | more
命令的输出并非数据库表,而是一个进程状态列表。以下是关键信息说明:
2. ps -ef
输出的列含义
列名 | 含义 |
---|---|
UID | 运行进程的用户 ID(如 root )。 |
PID | 进程唯一标识符(Process ID)。 |
PPID | 父进程的 PID(用于追踪进程层级)。 |
C | 进程的 CPU 使用优先级(nice 值)。 |
STIME | 进程启动时间(格式:HH:MM 或日期)。 |
TTY | 关联的终端设备(? 表示无终端)。 |
TIME | 进程累计占用的 CPU 时间。 |
CMD | 启动进程的命令及其参数。 |
** ps -eLf
输出的列含义**
对 ps -eLf
命令输出的详细解释
您提供的命令输出展示了 Linux 系统中运行进程的详细信息。以下是各列的具体含义和示例行的解释:
1. 列名及含义
列名 | 含义 |
---|---|
UID | 进程所属用户的 ID(如 root )。 |
PID | 进程唯一标识符(Process ID)。 |
PPID | 父进程的 PID(用于追踪进程层级)。 |
LWP | 轻量级进程(线程)的数量。 |
C | 进程的 CPU 使用优先级(nice 值)。 |
NLWP | 进程中的线程数。 |
STIME | 进程启动时间(格式:HH:MM 或日期)。 |
TTY | 关联的终端设备(? 表示无终端)。 |
TIME | 进程累计占用的 CPU 时间。 |
CMD | 启动进程的命令及其参数。 |
2. 示例行解释
以以下行为例:
root 1 0 1 0 1 15:07 ? 00:00:01 /usr/lib/systemd/systemd --switched-root ...
- UID:
root
表示该进程由 root 用户运行。 - PID:
1
是系统第一个进程,通常是systemd
初始化进程。 - PPID:
0
表示没有父进程,是系统的顶级进程。 - LWP:
1
表示该进程只有一个轻量级进程(主线程)。 - C:
0
表示进程的优先级为默认值。 - NLWP:
1
表示该进程有一个线程。 - STIME:
15:07
表示该进程在当天 15:07 启动。 - TTY:
?
表示该进程没有关联的终端。 - TIME:
00:00:01
表示该进程已占用 CPU 1 秒。 - CMD:
/usr/lib/systemd/systemd --switched-root ...
表示启动该进程的命令及其参数。
3. 关键进程说明
systemd
(PID 1)
系统初始化进程,负责启动和管理系统服务。kthreadd
(PID 2)
内核线程守护进程,动态创建和管理内核线程。ksoftirqd/[CPU编号]
处理软中断(如网络、磁盘 I/O)的内核线程,数字表示 CPU 核心。kworker/[CPU:队列]
执行内核异步任务的线程(如设备驱动操作),H
表示高优先级任务。migration/[CPU]
负责将进程从一个 CPU 核心迁移到另一个核心,优化负载均衡。rcu_*
线程
支持 RCU(Read-Copy Update)机制,用于内核并发同步。
top
参数解释
对 top
命令输出的详细解释
您提供的图片显示了 Linux 系统中运行进程的实时监控信息,通过 top
命令获取。以下是各部分的具体含义和示例行的解释:
1. 顶部系统状态行
top - 15:38:59 up 31 min, 2 users, load average: 全网首发 防止截屏 请加微信:171614 3665
- 时间:
15:38:59
表示当前系统时间。 - 运行时长:
up 31 min
表示系统已运行 31 分钟。 - 用户数:
2 users
表示当前有 2 个用户登录。 - 负载平均值:
load average
后面的内容被广告信息覆盖,通常显示过去 1、5、15 分钟的系统负载平均值。
2. 系统资源使用情况
Tasks: 214 total, 1 running, 213 sleeping, 0 stopped, 0 zombie JeffreyBool
%Cpu(s): 12.1 us, 9.1 sy, 0.0 ni, 78.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2042432 total, 721572 free, 574476 used, 746384 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1268200 avail Mem
任务统计:
total
: 总进程数(214)。running
: 正在运行的进程数(1)。sleeping
: 处于睡眠状态的进程数(213)。stopped
: 被停止的进程数(0)。zombie
: 僵尸进程数(0)。
CPU 使用率:
us
: 用户态 CPU 使用率(12.1%)。sy
: 内核态 CPU 使用率(9.1%)。ni
: 用户自定义优先级的 CPU 使用率(0.0%)。id
: 空闲 CPU 百分比(78.8%)。wa
: 等待 I/O 的 CPU 百分比(0.0%)。hi
: 硬中断处理时间百分比(0.0%)。si
: 软中断处理时间百分比(0.0%)。st
: 被虚拟化环境偷走的时间百分比(0.0%)。
内存使用情况:
total
: 总内存大小(2042432 KiB)。free
: 空闲内存大小(721572 KiB)。used
: 已用内存大小(574476 KiB)。buff/cache
: 缓冲区/缓存使用的内存大小(746384 KiB)。
交换分区使用情况:
total
: 总交换分区大小(2097148 KiB)。free
: 空闲交换分区大小(2097148 KiB)。used
: 已用交换分区大小(0 KiB)。avail Mem
: 可用内存大小(1268200 KiB)。
3. 进程列表
列名 | 含义 |
---|---|
PID | 进程唯一标识符(Process ID)。 |
USER | 运行进程的用户名。 |
PR | 进程的优先级(Priority)。 |
NI | 进程的 nice 值(数值越大优先级越低)。 |
VIRT | 进程使用的虚拟内存大小(KiB)。 |
RES | 进程占用的物理内存大小(KiB)。 |
SHR | 进程共享的内存大小(KiB)。 |
S | 进程状态(S =睡眠,R =运行等)。 |
%CPU | 进程占用的 CPU 百分比。 |
%MEM | 进程占用的内存百分比。 |
TIME+ | 进程累计占用的 CPU 时间。 |
COMMAND | 启动进程的命令及其参数。 |
4. 示例行解释
以以下行为例:
4521 root 20 0 197984 4204 3064 S 6.2 0.2 0:01.33 cupsd
- PID:
4521
是该进程的唯一标识符。 - USER:
root
表示该进程由 root 用户运行。 - PR:
20
表示进程的优先级。 - NI:
0
表示进程的 nice 值为默认值。 - VIRT:
197984
表示进程使用的虚拟内存大小为 197984 KiB。 - RES:
4204
表示进程占用的物理内存大小为 4204 KiB。 - SHR:
3064
表示进程共享的内存大小为 3064 KiB。 - S:
S
表示进程处于睡眠状态。 - %CPU:
6.2
表示进程占用的 CPU 百分比为 6.2%。 - %MEM:
0.2
表示进程占用的内存百分比为 0.2%。 - TIME+:
0:01.33
表示进程累计占用的 CPU 时间为 1.33 秒。 - COMMAND:
cupsd
表示启动该进程的命令是cupsd
。