一.理解进程和线程
1.1 什么是进程
它表示一个正在执行的程序实例。在操作系统中,进程是系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间、代码、数据和系统资源,如打开的文件、使用的硬件设备等。
进程的主要特点包括:
- 独立性:每个进程都有自己独立的地址空间,互不影响。
- 并发性:多个进程可以在同一时间间隔内并发执行,提高资源利用率。
- 动态性:进程是动态产生、动态消亡的。
- 结构性:进程由程序、数据和进程控制块(PCB)组成。
在操作系统中,进程可以通过多种状态进行转换,如就绪、运行、阻塞等。进程的创建、调度、同步、通信和终止等都是由操作系统负责管理的。
1.2 什么是线程
1. 线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。
2. 一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源
3. 每个线程有自己独立的栈空间和程序计数器
4. 线程之间可以并发执行,提高程序的执行效率
5. 当进程是多任务,cpu是多核心,多任务应该同时被每个核心处理,每个核心处理的任务叫线程
二 进程状态
进程状态码 | 含义 | |
R(TAKS_RUNNING) | 可执行态(running,ready) | ![]() |
S(TASK_INTRRUPTABLE) | 可唤醒休眠 | ![]() |
D(TASK_UNINTRRUPTABLE) | 不可唤醒休眠 | |
T(TASK_STOP) | 暂停状态 | ![]() |
Z(TASK_zombie) | 僵死态 | ![]() |
三 进程查看的方法
3.1 在图形中查看进程
gnome-system-monitor | 打开图形中的进程管理工具 |
3.2 常用进程查看命令的使用
-
ps
ps | 进程查看 | ![]() |
ps a | 与终端相关的进程(当用户登陆系统后产生的进程都是带终端的) | ![]() |
ps x | 与终端无关相关的进程 | ![]() |
ps u | 用户信息归类的查看方式 | ![]() |
ps f | 进程层级关系 | ![]() |
ps o comm nice pri pcpu ppid stat,user,group | 显示指定参数 | ![]() |
ps -e | 显示所有进程 | ![]() |
ps -f | 显示信息的完整格式 | ![]() |
ps -H | 显示进程的层级结构 | ![]() |
ps -o | 显示指定参数 | ![]() |
ps --sort= | 根据参数进行排序 | ![]() |
ps --sort=- | 根据参数进行倒序 | ![]() |
指定参数pid comm nice pri pcpu ppid stat user group:
-
PID:进程标识符(Process ID),是系统为每个进程分配的一个唯一编号,用于标识进程。
-
COMM:进程名称,通常是启动进程的命令名。
-
NICE:进程的优先级,值范围从-20到19,值越低表示优先级越高,进程获得的CPU时间越多。
-
PRI:进程的实时优先级,值越低表示优先级越高。
-
PCPU:进程占用的CPU百分比,表示进程消耗的CPU资源。
-
PPID:父进程标识符(Parent Process ID),表示创建该进程的父进程的PID。
-
STAT:进程状态,可以是以下状态之一或组合:
- R:运行中(Running)
- S:睡眠中(Sleeping)
- D:不可中断睡眠(Uninterruptible Sleep)
- T:已停止(Traced or Stopped)
- Z:僵尸进程(Zombie)
- W:分页(Paging)
- X:死进程(Dead)
- <: 高优先级(High Priority)
- N:低优先级(Low Priority)
- L:内存锁(Locked Memory)
- s:会话首进程(Session Leader)
- l:多线程(Multi-threaded)
- +:前台进程组(Foreground Process Group)
-
USER:运行进程的用户名。
-
GROUP:运行进程的用户组名。
拓展:
ps -t | 显示当前shell进程所使用的终端名称 | ![]() |
-
ps ax
ps ax | 显示 PID 进程id TTY 进程用到的终端 STAT 进程状态 TIME 进程占用cpu时长 COMMAND 进程名称 | ![]() |
混合参数:
-
ps aux
显示信息:
USER 进程所有人
PID 进程id
%CPU 进程使用cpu的用量
%MEM 进程所用到的内存用量
VSZ 进程使用的虚拟内存大小
RSS 进程常驻内存中的数据大小
TTY 进程用到的终端
STAT 进程状态
START 进程运行时长
TIME 进程占用cpu时长
COMMAND 进程名称
-
pgrep ——进程过滤
-u uid | 显示指定用户进程 | ![]() |
-U user | 显示指定用户进程 | ![]() |
-t tty | 显示指定终端进程 | ![]() |
-l | 显示进程PID和名称 可以是完整的进程名称或部分名称 | ![]() |
-a | 显示进程的 PID 和完整的命令行 | ![]() |
-P | 进程的子进程 | ![]() |
-
pidof ——查看正在运行的进程的pid
-
top ——动态进程查看
top命令的参数:
-d | 指定刷新频率(top -d 0.2) | ![]() |
-b | 以批次方式显示(直接将信息输出到标准输出) | ![]() |
-n | 指定显示的批次数量(命令只更新几次就退出) | ![]() |
-
top内部指令
P | cpu排序 | ![]() |
M | 内存排序 | ![]() |
T | 累计占用cpu时间排序 | ![]() |
l | 关闭/开启uptime信息 | ![]() |
t | 关闭/开启cpu&task | ![]() |
s | 指定刷新频率 | ![]() |
k | 终止进程 | ![]() |
u | 查看指定用户进程 | ![]() |
-
top中的内容显示信息
13:45:02 | 系统时间 |
up 6 min | 运行时长 |
2 users | 系统中有两个用户登陆 |
load average: 0.05, 0.26, 0.17 | 这三个数字分别表示过去1分钟、5分钟和15分钟内的系统平均负载
|
Tasks: | |
346 total | 任务总量 |
2 running | 正在运行 |
344 sleeping | 休眠数量 |
0 stopped | 被暂停数量 |
0 zombie | 僵尸进程数量 |
Cpu(s): | |
0.4 us | 用户空间 |
0.3 sy | 内核空间 |
0.0 ni | nice值调整时间 |
99.0 id | 空闲时间 |
0.0 wa | 等待io时间 |
0.2 hi | 处理硬件中断时间 |
0.1 si | 处理软件中断时间 |
0.0 st | 被偷走的时间(vm使用时间) |
MiB Mem : | |
5699.6 total | 总量 |
3855.7 free | 空闲 |
1383.9 used | 占用 |
718.9 buff/cache | 缓存 |
MiB Swap: | 交换分区用量 |
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
SHR | 共享内存大小,单位kb |
S | 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
四 进程的前后台调用
ctrl + z | 把占用shell的进程打入后台挂起 | ![]() |
bg | 把后台挂起的进程运行起来 | ![]() |
fg | 把后台进程调回前台 | ![]() |
命令& | 运行进程在后台 | ![]() |
jobs | 查看当前shell中在后台的所有工作 | ![]() |
五 进程的优先级
5.1 进程优先级定义
1. 进程优先级(Process Priority)是 Linux 内核用于决定 CPU 资源分配的关键指标
2. 优先级越高的进程越有可能被 CPU 优先调度执行
5.2 优先级种类
1. 静态优先级:由用户或管理员在进程启动时或运行中手动设置,范围为 -20 (最高优先级)到 19 (最低优先级),数值越小优先级越高。
2. 动态优先级:由内核根据进程的运行状态(如 CPU 使用时间、睡眠时长等)自动调整,以平衡系统资源分配。
5.3 静态优先级的调整方法
优先级范围值:0--139
内核自控优先级范围:0-99
用户可控优先级:100-139
nice -n -5 cat | 指定优先级打开进程 | ![]() |
renice -n 18 pid | 更改优先级 | ![]() |
- 进程状态字符详解
S | sleeping |
< | 优先级高 |
s | 顶级进程 |
T | stop |
N | 优先级低 |
R | running |
+ | 运行在前台 |
六 进程信号的使用
6.1 进程信号的定义
在 Linux 系统中,进程信号(Process Signal)是一种软件中断机制,用于在进程之间传递异步通知。它 为系统提供了一种处理异常情况、实现进程间通信的简单方式。信号可以由系统内核、其他进程或者用 户手动发送给目标进程,当进程接收到信号时,会根据信号的类型执行相应的操作,如终止进程、暂停进程、忽略信号等。
6.2 用户可控进程信号
信号名称 | 信号编号 | 默认行为 | 描述 | |
SIGHUP | 1 | 终止进程 | 终端断开连接时发送给与该终端关联的进程,常用于重新加载配置文件 | ![]() |
SIGINT | 2 | 终止进程 | 用户在终端按下 Ctrl+C 时发送给当前前台进程 | ![]() |
SIGQUIT | 3 | 终止进程并生成核心转储文件 | 用户在终端按下 Ctrl+\ 时发送给当前前台进程 | ![]() |
SIGTERM | 15 | 终止进程 | 通常用于请求进程正常终止,是系统默认的终止信号 | ![]() |
SIGKILL | 9 | 强制终止进程 | 不能被捕获、阻塞或忽略,用于强制终止无法正常响应的进程 | ![]() |
SIGCONT | 18 | 继续执行暂停的进程 | 用于恢复被暂停的进程 | ![]() |
SIGSTOP | 19 | 暂停进程 | 不能被捕获、阻塞或忽略,用于暂停进程的执行 | ![]() |
SIGSTOP | 20 | 暂停进程 | 可以被捕获、阻塞或忽略,用于暂停进程的执行 | ![]() |
-
信号特点
可捕获、阻塞和忽略:像 SIGHUP 、 SIGINT 、 SIGTERM 这类信号,进程可以编写相应的信号处理 函数来捕获它们,也可以选择阻塞(暂时不处理)或者忽略这些信号。
不可捕获、阻塞和忽略: SIGKILL 和 SIGSTOP 信号比较特殊,进程无法对其进行捕获、阻塞或忽 略操作,这保证了在必要时可以强制终止或暂停进程
6.3 如何使用进程信号
进程信号控制工具
kill 进程信号 pid | 处理精确指定的进程 | ![]() |
killall 进程信号 进程名字 | 按照进程名称批量处理进程 | ![]() |
pkill 进程信号 进程条件 | 按照条件处理进程 | ![]() |
七 systemd守护进程
7.1 守护进程是什么
1. 守护进程(Daemon)是一种在后台持续运行的特殊进程,它不与终端直接交互,通常在系统启动 时自动启动,并在系统关闭时才停止。
2. 守护进程的设计目的是为系统提供各种服务,例如网络服务(如 HTTP 服务器、FTP 服务器)、日 志服务、定时任务服务等。它们默默地在后台运行,为其他进程和用户提供支持,确保系统的正常 运行。
7.2 守护进程的特点
在后台运行:守护进程不会占用终端,不会受到用户登录或注销的影响,持续在后台执行任务。
生命周期长:一般从系统启动开始运行,直到系统关闭才停止,为系统提供长期稳定的服务。
无控制终端:守护进程没有控制终端,不会接收来自终端的输入,也不会将输出显示在终端上。
自成进程组和会话:守护进程通常会创建自己的进程组和会话,以确保独立于控制终端和其他进 程。
7.3 Systemd 守护进程
1. Systemd 是 Linux 系统中新一代的初始化系统(init system),它旨在替代传统的 SysVinit 和 Upstart 等初始化系统
2. Systemd 提供了一套强大的工具和机制,用于管理系统的启动、服务的管理、资源的分配等。它的 设计目标是提高系统的启动速度、简化服务管理、增强系统的可靠性和可维护性。
7.4 守护进程管理命令systemctl
systemctl命令的用法
start | 开启 | ![]() |
stop | 关闭 | ![]() |
status | 查看状态 | ![]() |
reload | 重新加载 | ![]() |
restart | 重新启动服务 | ![]() |
enable | 设定服务开机启动 | ![]() |
enable --now | 设定服务开机启动并当前开启服务 | ![]() |
disable | 设定服务开启不其动 | ![]() |
list-units | 查看系统所有服务当前状态 | ![]() |
list-unit-files | 查看服务开机状态 | ![]() |
list-dependencies | 列出服务依赖性 | ![]() |
mask | 冻结服务 | ![]() |
unmask | 解锁 | ![]() |
set-default | 设定系统运行模式 | |
multi-user.target | 无图形网络模式 | restart ↓ |
graphical.target | 有图形的网络模式 | restart ↓ |
get-default | 查看系统运行模式 | ![]() |
系统运行模式0-6 | 0 关机 1 单用户模式 2 无图形网络模式 3 无图形网络模式 4 无图形网络模式 5 图形网络模式 6 重启 | |
runlevel | 查看系统运行模式 | ![]() |
init | 更改系统运行模式并立即生效 | Enter ↓ |