什么是进程
已启动的可执行程序的运行实例
进程的组成
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
程序
二进制文件,静态,如/bin/date,/usr/sbin/sshd
进程
程序运行的过程,动态,有生命周期及运行状态
fork:分支
zombie:僵尸(程序没有正常退出)
进程ID(PID),父进程ID(PPID)
所有进程都是第一个系统进程的后代
Centos5或6 PID为1的进程是 init
Centos7 PID为1的进程是 systemd
僵尸进程
专业忽悠语:
一个进程使用fork创建子进程,如果子进程退出,父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程成为僵尸进程。
白话文:
父进程退出了wait,但子进程并没有结束,那么这些子进程的使用的资源,如内存等父进程释放或管理不了了,被称为僵尸进程。
僵尸进程正常情况下是kill不掉的,可以关机结束掉。
进程的属性
进程ID:PID,唯一的数值,用来区分进程
父进程ID:PPID
启动进程的用户ID(UID),所归属的组(GID)
进程的状态:运行R、休眠S、僵尸Z
进程执行的优先级
进程所连接的终端名
进程资源占用:所占用CPU,内存的大小
使用PS命令查看进程
常用参数:
a:显示跟当前终端关联的所有进程
u:居于用户的格式显示(U:显示某用户ID所有的进程)
x:显示所有进程,不以终端机来区分
[root@tzPC ~]# ps -aux | head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 128288 6936 ? Ss 14:43 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 14:43 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? S< 14:43 0:00 [kworker/0:0H] root 5 0.0 0.0 0 0 ? S 14:43 0:00 [kworker/u256:0] root 6 0.0 0.0 0 0 ? S 14:43 0:00 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 14:43 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S 14:43 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? R 14:43 0:00 [rcu_sched] root 10 0.0 0.0 0 0 ? S< 14:43 0:00 [lru-add-drain]
注意:最后一列
[xx]使用方括号括起来的是内核进程,没有括起来的是用户进程。
各参数含义:
USER:启动这些进程的用户
PID:进程的ID
%CPU:占用CPU百分比
%MEM:占用内存百分比
VSZ:进程占用的虚拟内存大小,单位KB,比如预先分配10G内存及虚拟内存,实际占用1G及物理内存
RSS:进程占用物理内存的大小,单位KB
STAT:该程序目前的状态
START:该进程被触发启动时间
TIME:该进程实际使用CPU运行的时间
Linux进程有5中状态
R :正在运行状态;
S :处于休眠状态;
T :该程序停止了;
Z :该程序应该已经终止,但是其父进程已不存在,僵尸进程;
D :不可中断状态,通常为IO进程
5个基本状态后,还可以加一些字母,比如:Ss、R+,其含义如下:
其他状态
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示该进程之下有子进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运作的时间。如果为0:00表示还没有用到1秒钟
COMMAND:该程序的实际指令
以T状态为例:
新开一个终端vim a.txt
回原来的终端ps -aux | grep a.txt会发现为S+,为前台睡眠状态
回到vim a.txt终端,ctrl +z 停止
回到原来的终端会发现状态为T
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
以D状态为例
新开一个终端tar -zcvf usr.tar.gz /usr 打包/usr
返回旧终端ps -aux | grep tar多执行几次会发现从S+变为R+最后成为D+
ps -ef 使用
-e 显示所有进程
-f 显示完整格式输出
[root@tzPC ~]# ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:43 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 14:43 ? 00:00:00 [kthreadd]
root 4 2 0 14:43 ? 00:00:00 [kworker/0:0H]
root 5 2 0 14:43 ? 00:00:01 [kworker/u256:0]
root 6 2 0 14:43 ? 00:00:00 [ksoftirqd/0]
root 7 2 0 14:43 ? 00:00:00 [migration/0]
root 8 2 0 14:43 ? 00:00:00 [rcu_bh]
root 9 2 0 14:43 ? 00:00:01 [rcu_sched]
root 10 2 0 14:43 ? 00:00:00 [lru-add-drain]
root 1573 905 0 14:43 tty1 00:00:00 -bash
root 1597 1 0 14:43 ? 00:00:00 /usr/sbin/sshd -D
root 1702 1597 0 14:48 ? 00:00:00 sshd: root@pts/0
root 1706 1702 0 14:48 pts/0 00:00:00 -bash
root 1920 1597 0 15:24 ? 00:00:00 sshd: root@pts/1
UID: 启动这些进程的用户
PID: 进程的ID
PPID: 父进程的进程号
C: 进程生命周期中的CPU利用率
STIME: 进程启动时的系统时间
TTY: 开始此进程的终端。如果显示 ?表示与终端无关,这种进程一般是内核进程。另外, tty0-tty6 称为虚拟终端,tty0表示当前使用的虚拟终端的别名,tty7表示图形化界面,对虚拟终端操作都会发送到控制终端上,pts/0为伪终端,打开一个terminal就为pts/0,在打开一个terminal就为pts/1;
TIME: 运行进程一共累计占用的CPU时间
CMD: 启动的程序名称
ps -l 的使用
-l 显示长列表
[root@tzPC tz]# ps l F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 4 0 1573 905 20 0 115444 2064 n_tty_ Ss+ tty1 0:00 -bash 4 0 4045 4044 20 0 115448 2080 do_wai Ss pts/2 0:00 /bin/bash 4 0 4057 4045 20 0 149148 5004 poll_s S+ pts/2 0:00 vim a.txt 4 0 51256 1 20 0 110108 856 n_tty_ Ss+ tty3 0:00 /sbin/agetty --noclear tty3 linux 4 0 51259 1 20 0 110108 856 n_tty_ Ss+ tty4 0:00 /sbin/agetty --noclear tty4 linux 4 0 51260 1 20 0 110108 852 n_tty_ Ss+ tty2 0:00 /sbin/agetty --noclear tty2 linux 4 0 53285 53280 20 0 115580 2204 do_wai Ss pts/1 0:00 -bash 0 0 66386 53285 20 0 153248 1488 - R+ pts/1 0:00 ps l
F:内核分配给进程的系统标记
S:进程的状态
PRI:进程的优先级,数值越大优先级越低
NI:谦让度值用来参与决定优先级
ADDR:进程的内存地址
SZ:假如进程被换出,所需交换空间的大小
WCHAN:进程休眠的内核函数地址
参考:https://www.iteye.com/blog/jblzdg-2088269