进程
程序是一堆代码文件,是一个静态的概念。
进程是一个正在运行的程序的副本,是一个动态的概念,一个程序可能对应多个进程。它是操作系统分配资源的最小单位。进程有生命周期。
CPU执行内核指令时称谓“内核模式”或“内核空间”。执行用户代码时称为“用户模式”或“用户空间”,从用户模式切换到内核模式或内核模式切换到用户模式称之为模式切换。
进程可分为运算密集型和IO密集型,运算密集型会消耗大量CPU资源,IO密集型消耗CPU资源比例很小。
进程创建
进程存在父子关系,Linux中,除init/systemd进程外,每个进程都由父进程fork()自身创建,子进程数据由clone()父进程而来。
进程终止
Linux中进程由父进程终止。如果父进程被终止,子进程也会随之被终止。子进程执行时,父进程处于等待状态。
进程优先级
Linux对进程优先级划分为0-139
- 0:很少用
- 1-99:实时优先级,数字越大,优先级越高
- 100-139:静态优先级,数字越小,优先级越高
Nice值
Linux内核:抢占式多任务
Linux对优先级分了Nice值:-20至19,数值越小优先级越高。
对普通用户而言,进程优先级只能在019之间调整。超级用户有权调整更高的优先权值-2019。
Linux将待运行的进程分为140个队列,相同优先级排一队,每一队分为运行队和过期队。
内存被分为一个个Page Frame:页框,用于存储页面数据
MMU:Memory Management Unit 内存管理单元
进程间通信(IPC)
全称Inter Process Communication。分两种情况:
同一主机上:
- signal
- shm:shared memory
- semerphor
不同主机上:
- rpc:remote procedure call 远程过程调用
- socket:套接字
进程类型
-
守护进程:
daemon,在系统引导过程中启动的进程,跟终端无关的进程。
-
前台进程:
用户通过终端启用的进程。
注:也可把前台启动的进程送往后台,以守护模式运行
进程状态
- 运行态:running
- 就绪态:ready
- 睡眠态:sleep
- 可中断睡眠:interruptable 任何时候可调度到CPU运行
- 不可中断睡眠:uninterruptable
- 停止态:stopped 暂停于内存中,但不会被调度,除非手动启动
- 僵死态:zombie
查看进程
ps命令
process state静态获取当前进程信息。直接执行ps显示的是当前用户,当前终端的进程信息。它显示的是PID、当前终端、CPU时间以及可执行文件的名称。
[chirou@duorou ~ ]$ ps
PID TTY TIME CMD
12402 pts/2 00:00:00 ps
14526 pts/2 00:00:00 bash
常用选项:
- aux:a表示显示与终端相关的进程,u显示以用户为中心组织进程状态信息,x显示与终端无关的进程,组合在一起表示显示所有进程和相关信息。
标志 | 信息 |
---|---|
USER | 进程属主 |
PID | 进程ID号 |
%CPU | 运行占据的CPU时间百分比 |
%MEM | 占据内存百分比 |
VSZ(Virtual memory SiZe) | 虚拟内存集 |
RSS(ReSident Size) | 常驻内存集 |
TTY | 表示通过哪个终端启动,问号?表示与终端无关。 |
STAT | 进程状态(详见下表) |
STAR | 运行累计时长 |
TIME | 占用CPU的运算时间 |
COMMAND | 由哪个文件启动的此进程,[]表示内核态进程。 |
STAT信息
STAT标志 | 信息 |
---|---|
D | 不可中断睡眠态,在这个状态的进程通常是等待IO时对方未响应,此时只能等待IO的结束。此刻进程是不可中断的,意思是不响应异步信号,kill -9也无法杀死。 |
R | 运行态(可执行态),并不意味着进程一定在运行中。同一时刻可能有多个进程处在可执行态,这些进程的PCB(进程控制块)被放入对应的CPU的可执行队列中。然后进程调度器从各个可执行队列中分别选择一个进程在CPU上运行。 |
S | 可中断睡眠态,意味着进程在等待事件完成,可以响应异步信号。 |
T | 停止态 |
W | 分页(自2.6.xx内核起无效) |
X | 死掉的进程(不应该被看到),因为会立即被回收。 |
Z | 失效(“僵尸”)进程,终止但未被其父进程获取,也无法被kill -9杀死。 |
对于BSD格式和使用stat关键字时,可能需要额外的字符显示:
标志 | 信息 |
---|---|
< | 优先级较高 |
N | 低优先级 |
L | 将页面锁定到内存中(用于实时和自定义IO) |
s | 包含子进程 |
l(小写L) | 多线程 |
+ | 前台进程 |
|(管道) | 多进程 |
查看ppid(父进程ID):
- -ef选项
[chirou@duorou ~ ]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:38 ? 00:00:02 /usr/lib/systemd/systemd
root 2 0 0 09:38 ? 00:00:00 [kthreadd]
root 4 2 0 09:38 ? 00:00:00 [kworker/0:0H]
-
ps命令可与grep配合使用以查看某个进程
ps aux | grep bash
pstree命令
以树状结构显示进程关系。
- ps UID:显示指定的进程及子进程。
- -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
[chirou@duorou ~ ]$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─2*[abrt-watch-log]
├─abrtd
├─agetty
├─alsactl
├─atd
├─auditd─┬─audispd─┬─sedispatch
│ │ └─{audispd}
│ └─{auditd}
├─avahi-daemon───avahi-daemon
├─chronyd
├─crond
├─cupsd
├─dbus-daemon───{dbus-daemon}
├─dnsmasq───dnsmasq
├─gssproxy───5*[{gssproxy}]
├─ksmtuned───sleep
├─libvirtd───16*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───6*[{polkitd}]
├─rngd
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─smartd
├─sshd─┬─sshd───sshd───bash───pstree
│ └─sshd───sshd───bash───su───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vsftpd
top命令
动态获取进程状态信息。
常用选项:
-d:指定刷新时间,默认3秒。
-p:显示指定的pid
-u:查看指定用户进程
-n:显示批次
top -b -n 2 > top.txt # 将2次top信息写入到文件
-
命令输出第一行:
(按l(小写L)开启或关闭),top(当前时间) up(系统已运行时间), users(登陆用户), load average(平均负载): 1分钟,5分钟,15分钟。
-
第二行:
Tasks(总进程数),running(运行态), sleeping(睡眠态),stopped(停止态),zombie(僵死态)。
-
第三行:
第三行显示CPU信息,若有多核心则有多行(按t显示、关闭或变换格式):%Cpu(s): 0.0 us(用户态占据百分比), 0.0 sy(内核态占据百分比), 0.0 ni(nice值),100.0 id(空闲比例), 0.0 wa(等待I/O完成的时间), 0.0 hi(硬中断所占据的百分比), 0.0 si(软中断所占据的百分比), 0.0 st(被虚拟化技术偷走的时间)
-
第四行:
KiB Mem: 1018256 total(物理内存总空间), 628168 used(已用空间), 390088 free(空闲空间), 896 buff/cache(缓冲/缓存占用空间。)
缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
-
第五行:
第五行:KiB Swap: 839676 total(交换分区总空间), 0 used(使用量), 839676 free(空闲量). 210720 cached Me。
top显示的进程信息
标识 | 含义 |
---|---|
VIRT | 虚拟内存 |
RES | 进程当前使用的内存 |
SHR | 共享内存 |
DATA | 数据占用的内存。如果没有显示,按f键,然后选择DATA项目。 |
top内置命令
内置命令 | 功能 |
---|---|
h | 显示帮助信息 |
s | 修改刷新时间,建议不要修改很小,会过度消耗CPU |
q | 退出,也可用Ctrl+c |
M | 按照内存占用率从大到小排序 |
P | 按照CPU占用率从大到小排序 |
N | 按照PID从大到小排序 |
R | 对排序进行颠倒 |
shift+>/< | 向左/右移动排序字段 |
f | 自定义显示字段,按空格选定 |
k | 给进程发信号 |
r | 调整进程的优先级 |
数字1 | 显示所有CPU信息 |
htop命令
类似top命令,功能更强大带颜色显示(需要添加Fedora-EPEL源安装)。