进程管理
同步和异步
同步(Synchronous)
- 定义:
- 在同步操作中,任务执行的顺序是固定的,后一个任务必须等待前一个任务完成后才能开始。
- 特点:
- 阻塞:在同步操作中,调用者会被阻塞,直到操作完成。这意味着程序会在当前任务上停留,无法执行其他任务。
- 易于理解:因为执行顺序是线性的,容易跟踪和调试。
异步(Asynchronous)
-
定义:
- 在异步操作中,任务的执行不依赖于其他任务的完成,调用者可以在发起请求后继续执行其他操作。
-
特点:
- 非阻塞:调用者不会被阻塞,可以继续执行其他代码。通常会使用回调函数或事件机制来处理结果。
- 更高的效率:可以在等待 I/O 操作(如网络请求或文件读取)时执行其他计算任务,提高资源利用率。
ps
[root@localhost ~]# ps aux|more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER:拥有该进程的用户。
PID:进程 ID。
%CPU:CPU 使用百分比。
%MEM:内存使用百分比。
VSZ:虚拟内存大小。
RSS:常驻内存集大小(实际使用的内存)。
TTY:与进程关联的终端。
STAT:进程状态。
START:进程开始时间。
TIME:总 CPU 时间使用量。
COMMAND:启动该进程的命令
ps aux --sort=-%mem|more 按照内存排序
ps aux --sort=-%cpu|more 按照cpu排序
pmap
用于显示进程的内存映射情况。它可以提供指定进程的虚拟内存使用情况,包括各个内存段的地址、大小、权限等信息。
pmap <PID>
top
top - 07:04:59 up 8:04, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 3.0 sy, 0.0 ni, 93.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3710.0 total, 2610.7 free, 607.3 used, 491.9 buff/cache
MiB Swap: 4032.0 total, 4032.0 free, 0.0 used. 2868.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
系统摘要信息
- 07:04:59:当前时间。
- up 8:04:系统已经运行了 8 小时 4 分钟。
- 2 users:当前有 2 个用户登录。
- load average: 0.00, 0.00, 0.00:系统的负载平均值,分别是最近 1 分钟、5 分钟和 15 分钟的负载。0.00 表示系统负载非常低。
任务信息
- Tasks: 220 total:总共有 220 个进程。
- 1 running:当前有 1 个进程正在运行。
- 219 sleeping:有 219 个进程处于休眠状态。
- 0 stopped:没有停止的进程。
- 0 zombie:没有僵尸进程。
CPU 使用情况
-
%Cpu(s)
:CPU 使用的详细信息:
-
3.0 us:用户进程占用的 CPU 百分比(用户空间)
表示用户空间(user space)进程占用的 CPU 百分比。这些进程是由用户启动的,不涉及内核的直接管理。高用户空间 CPU 使用率通常表明用户应用程序正在积极运行。
-
3.0 sy:系统进程占用的 CPU 百分比(内核空间)。
表示内核空间(system space)进程占用的 CPU 百分比。内核进程是操作系统核心组件,负责管理系统资源(如文件系统、进程管理等)。较高的系统 CPU 使用率可能表示系统正处理大量的 I/O 操作或其他内核级任务。
-
0.0 ni:用户进程以非负优先级运行占用的 CPU 百分比。
表示以非负优先级(nice value 大于或等于 0)运行的用户进程占用的 CPU 百分比。`nice` 值是用来调整进程的优先级,较高的 `nice` 值意味着较低的优先级。此值为 0 表示没有进程在以非负优先级运行。
-
93.9 id:空闲的 CPU 百分比。
-
0.0 wa:等待 I/O 的 CPU 百分比。
表示等待 I/O 操作的 CPU 百分比。这个值表明 CPU 有多少时间在等待 I/O 操作(如磁盘读写)完成。较高的 I/O 等待时间可能表示磁盘或网络 I/O 是瓶颈。
-
0.0 hi、0.0 si、0.0 st:分别表示硬件中断、软件中断和虚拟机偷取的 CPU 百分比。
1.硬件中断是来自硬件设备(如键盘、鼠标、网络等)的信号,CPU 需要暂时停止当前的任务去处理这些信号。 当你按下键盘上的某个键时,键盘硬件会生成一个中断信号,通知 CPU 有新的输入 CPU 接收到这个中断信号后,会暂停当前正在执行的任务,保存其状态,然后转到键盘中断处理程序(Interrupt Service Routine, ISR)。 处理程序会读取按下的键的代码(通常称为扫描码),并将其传递给操作系统。 处理完成后,CPU 会恢复之前的任务,继续执行。 2.软件中断通常由操作系统内部产生,用于处理特定的任务或请求。 程序调用 read(): 假设一个程序需要从文件中读取数据,它会执行类似于 bytes_read = read(file_descriptor, buffer, size); 的代码。这行代码实际上请求操作系统来执行读取操作。 生成软件中断: 当程序执行到这条指令时,它会触发一个软件中断(通常是通过特定的指令,如 int 0x80 在旧的 Linux 系统中,或使用系统调用的库函数在现代系统中)。 操作系统接收到软件中断后,会暂停当前程序的执行,并保存其上下文(例如寄存器状态)。 操作系统的内核会找到与 read() 系统调用相对应的处理程序。这通常是一个内核级的函数,负责处理文件读取请求。 内核中的 read() 处理程序会执行实际的读取操作。这可能涉及从磁盘或其他存储设备获取数据。 数据被读取到指定的缓冲区中。 读取完成后,内核会把读取到的字节数返回给用户程序。 随后,内核会恢复用户程序的执行状态,将控制权返回给它,程序可以继续执行接下来的代码。 3.在虚拟化环境中,主机的虚拟机可能会“偷取”某些 CPU 资源。如果这个值很高,可能表示主机资源不足,影响了虚拟机的性能。
-
内存使用情况
- MiB Mem:内存的详细信息:
- 3710.0 total:总内存为 3710 MB。
- 2610.7 free:当前可用内存为 2610.7 MB。
- 607.3 used:已使用内存为 607.3 MB。
- 491.9 buff/cache:用于缓冲区和缓存的内存。
- MiB Swap:交换空间的详细信息:
- 4032.0 total:总交换空间为 4032 MB。
- 4032.0 free:当前可用的交换空间为 4032 MB(表示没有使用交换空间)。
- 0.0 used:已使用的交换空间为 0 MB。
- 2868.0 avail Mem:可用内存(包括缓冲区和缓存的内存)为 2868 MB。
进程信息
- PID:进程 ID。
- USER:拥有该进程的用户。
- PR:进程优先级。
- NI:进程的 nice 值。
- VIRT:进程使用的虚拟内存。
- RES:进程使用的常驻内存。
- SHR:进程共享的内存。
- S:进程状态(例如 R 表示运行中,S 表示睡眠)。
- %CPU:进程使用的 CPU 百分比。
- %MEM:进程使用的内存百分比。
- TIME+:进程使用的总 CPU 时间。
- COMMAND:启动进程的命令。
load average
负载值的定义:
- 在 Linux 系统中,负载值表示在特定时间段内,正在运行或等待运行的进程的数量。它不仅包括正在使用 CPU 的进程,还包括那些等待 CPU 资源的进程。
负载值的取值范围:
- 负载值是一个非负数,理论上没有上限,但负载过高通常会导致系统性能下降。
负载值的具体解释
- 小于 1:
- 说明系统负载轻,CPU 资源充足。此时,平均每个 CPU 核心都有足够的时间来处理其任务。例如,在一个单核心系统中,负载为 0.5 表示 CPU 只有一半的时间被占用,还有一半的时间是空闲的。
- 等于 1:
- 系统负载达到了其能力的边界。每个运行的进程都能在适当的时间内获得 CPU 资源,但没有冗余的处理能力。此时,用户可能会感受到性能的波动。
- 大于 1(以单核 CPU 为例):
- 如果负载大于 1,表示有多个进程在争夺 CPU 资源。例如,负载为 2 表示有两个进程在等待 CPU 资源,这可能会导致某些进程的响应时间增加。
- 举例:在单核系统中,负载为 2 意味着系统正在处理的任务数量是 CPU 能够处理的两倍,因此会有一部分任务在等待,这可能导致系统变慢。
- 多核 CPU 的影响:
- 在多核系统中,负载值需要结合 CPU 核心数量进行评估。例如,在一个 4 核 CPU 系统中:
- 负载值为 4 表示系统处于满负荷状态,但 CPU 仍然可以处理所有任务。
- 负载值为 5 表示有一个任务在等待,可能会影响性能。
- 负载值为 8 则表示有很多进程在等待 CPU 资源,系统可能变得非常缓慢。
- 在多核系统中,负载值需要结合 CPU 核心数量进行评估。例如,在一个 4 核 CPU 系统中:
瞬时高负载:短时间内的高负载(如 10-15 秒)可能是正常的,尤其是在进行大量计算或I/O操作时,但如果持续存在,应该考虑进行性能优化或资源扩展。
僵尸进程
(Zombie Process)是指已经完成执行但仍然存在于进程表中的进程。它的状态是“僵尸”,因为它的父进程尚未读取它的退出状态信息
僵尸进程的形成
-
进程生命周期:
- 当一个进程执行完毕后,它会发送一个退出状态给其父进程。这一状态包含了进程的执行结果和资源使用情况。
- 此时,进程不会立即从进程表中删除,而是变为僵尸状态,等待父进程使用
wait()
或waitpid()
函数读取退出状态。
父进程未处理:
- 如果父进程没有在子进程结束后调用
wait()
,那么子进程会保持在僵尸状态,继续占用一个进程表项。
僵尸进程的特征
- 状态:僵尸进程的状态一般会显示为
Z
,表示它是一个僵尸状态。 - 资源占用:僵尸进程不占用 CPU 资源,因为它已经完成了执行,但仍然占用一个进程表项。
- 父进程:僵尸进程依赖于其父进程来清理。如果父进程终止而没有收集子进程的信息,这些僵尸进程会被
init
(进程 ID 为 1 的进程)收养,init
会定期清理这些僵尸进程。
僵尸进程的影响
- 进程表占用:尽管僵尸进程不消耗 CPU 资源,但它们仍然占用进程表中的条目。系统的进程表有大小限制,如果有过多的僵尸进程,可能导致无法创建新进程。
- 系统稳定性:在某些情况下,僵尸进程可能会表明程序设计上的缺陷,导致系统不稳定
解决方法:
- 终止父进程:如果僵尸进程的父进程存在,可以通过重启或修复父进程的代码,使其调用
wait()
,从而清理僵尸进程。 - 杀死父进程:如果父进程无法处理,可以杀死父进程,此时系统会将僵尸进程交给
init
进程,后者会清理它们。
dd if
dd if=<输入文件> of=<输出文件> [其他选项]
bs=<字节数>:设置块大小,指定每次读取和写入的字节数。
count=<块数>:指定要复制的块的数量。
复制文件:
将文件 input.txt
复制到 output.txt
:
dd if=input.txt of=output.txt
创建一个空文件:
创建一个大小为 1MB 的空文件:
dd if=/dev/zero of=empty_file bs=1M count=1
从磁盘创建镜像:
将整个磁盘 /dev/sda
备份到镜像文件 disk.img
:
dd if=/dev/sda of=disk.img bs=4M
恢复磁盘镜像:
将之前创建的镜像 disk.img
恢复到磁盘 /dev/sda
:
dd if=disk.img of=/dev/sda bs=4M
显示进度:
在复制过程中显示进度信息:
dd if=input.txt of=output.txt status=progress
信号管理机制
pid
查找程序的 PID:
pidof bash
查找所有与 python
相关的进程:
pidof -c python
使用 ps
命令结合 -u
选项可以查看特定用户的进程。
ps -u <用户名>
使用 pgrep
的 -G
选项可以根据组名查找进程:
pgrep -G <组名>
kill
kill
是一个用于发送信号给进程的命令行工具,常用于终止或管理正在运行的进程。尽管名称是 "kill",它不仅可以用来结束进程,还可以用于其他目的,例如暂停进程、继续运行等。
kill [选项] <进程ID>
-s <信号> 或 --signal <信号>:指定要发送的信号。默认情况下,kill 发送 SIGTERM(信号 15)。
-l:列出所有可用的信号及其名称。
-n <信号编号>:根据信号编号发送信号。例如,kill -n 9 <PID> 发送 SIGKILL 信号。
-p:只打印进程的 PID,而不发送信号。
信号名 | 信号编号 | 描述 |
---|---|---|
SIGTERM |
15 | 请求终止进程(默认信号)。 |
SIGKILL |
9 | 强制终止进程,无法被捕获或忽略。 |
SIGINT |
2 | 中断进程,通常是 Ctrl+C 发送给前台进程。 |
SIGSTOP |
19 | 暂停进程,无法被捕获或忽略。 |
SIGCONT |
18 | 继续一个被暂停的进程。 |
SIGHUP |
1 | 通常用于通知进程其控制终端已关闭。 |
kill
命令通常需要 PID。如果要通过进程名杀死进程,可以结合 pkill
命令:
pkill process_name
进程优先级
[root@localhost ~]# ps -axo comm,user,nice|more
查看进程优先级
改变进程优先级
用户创建进程优先级都为0
系统进程优先级都为-20
数字越小优先级越高
renice 10 pid 将已经运行的进程优先级改为10
nice -n -15 vim /tmp/passwd 将进程优先级设置为-15(未运行)
job任务控制
/test.sh & 将一个进程放入后台运行
ctrl +z 将前台任务暂停
fg %任务号 将后台进程恢复到前台
bg %任务号 用于将一个已停止的进程(通常是前台进程)放到后台继续运行。
一个例子
调整优先级
- 设置该程序md5sum /dev/zero优先级为-10,让其运行
- 执行sha1sum /dev/zerotop & 放入后台运行,调整该程序优先级为-20
- 查看这两个程序运行的情况
- 结束这两个程序
(nice -n -10 md5sum /dev/zero & sha1sum /dev/zero & sleep 1; renice -n -20 $(pgrep -f sha1sum))
nice -n -10 md5sum /dev/zero & sha1sum /dev/zero & #这两条命令之间不用加分号或者&&可以同时执行
ps aux | grep -E 'md5sum|sha1sum'|grep -v grep |awk '{print $2}'|xargs kill #结束这两个程序
标签:负载,优先级,僵尸,管理,内存,进程,CPU
From: https://www.cnblogs.com/cloudwangsa/p/18563744