在操作系统系统中,进程是一个非常重要的概念。

一、Linux中进程的相关知识

1、什么是进程呢?

通俗的来说进程是运行起来的程序。唯一标示进程的是进程描述符(PID),在linux内核中是通过task_struck和task_list来定义和管理进程的。

2、进程的分类

1)根据在linux不同模式下运行分为:

核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)。

用户态:这类进程工作在用户模式下,执行用户指令(Ring 3)。

如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。

2)按照进程的状态可分为:

运行态:running 正在运行的进程

可中断睡眠态:进程处于睡眠状态,但是可以被中断

不可中断的睡眠态:进程处于睡眠状态,但是不可以被中断

停止态:stoped 不会被内核调度

僵死态:zombie产生的原因是进程结束后,它的父进程没有wait它,所导致的。

3)按照操作的密集程度

CPU密集型:进程在运行时,占用CPU时间较多的进程。

I/O密集型:进程在运行时,占用I/O时间较多的进程。

通常情况下,I/O密集型的优先级要高于CPU密集型。

4)按照进程的处理方式

批处理进程:

交互式进程:

实时进程:

3、进程的优先级

进程的有优先级,是用0-139数字来表示的,数字优先级从小到大依次是:0-99,139-100。

优先级分为2类:

实时优先级:0-99,是由内核维护的

静态优先级:100-139,可以使用nice来调整,nice值的取值范围是[-20,19),分别对应100到139。nice默认值是0。

动态优先级:由内核动态维护,动态调整。

二、进程的管理工具

1、pstree命令 查看进程数。 常用用法如下:

wKioL1PLqdyyIb19AAEMNH_9wPY525.jpg


2、ps 命令 查看进程的相关状态。支持SysV和BSD两种风格的选项。

常用选型:

a 与终端相关的进程

x 与终端无关的进程

u 显示运行进程的用户

常用组合选项:ps aux

wKiom1PLsWrBbbpGAAMO4REz0So556.jpg

# 下面分别来说明上图的各个字段的含义  # USER 进程以什么用户身份运行  # PID 进程描述符 具有唯一性  # %CPU 进程运行时所占的cpu百分比  # %MEM 进程运行时内存所占的百分比  # VSZ Virtual memory SiZe 虚拟内存使用大小  # RSS 常驻内存集,所有不能被置换出去的内存集  # STAT 表示内存状态  # 常用的状态有:  # S:可中段睡眠状态  # R:运行态  # D:不可中断睡眠态  # T:停止态  # Z:僵尸态  # s:session leader 所谓进程的领导者  # +:表示是前台进程  # l:多线程进程  # N:低优先级进程  # <:高优先级进程  # TTY 用来表示终端 显示为“?”的说明是与终端无关的进程  # START 进程开始时间  # TIME 进程运行时间  # COMMAND 执行进程的命令 如果命令被 "[]"包围,说明是内核线程

-e 显示所有进程

-f 显示完成格式信息

常组合在一起使用:ps -ef

wKiom1PLtv3AM8G8AAIzFXcrn_M342.jpg

但是有些这种情况下,我们的命令有时候显示不完整

wKioL1PLt_HRegDWAAFNVp3t6Hw292.jpg

此时想要显示完成就要 ps -efww

wKioL1PLuLPhBEpsAAIah-16qRE706.jpg

-F:显示额外信息 

-H:显示进程的层次结构

常用组合方式:ps -eFH

wKiom1PLuWaShIYVAAHLO4AzcZA175.jpg

可能以后我们用到最多的选项:

-o 我们可以自定义显示字段

# 常用的有:  # pid command psr pri ni %cpu %mem rsz vsz等

wKioL1PLvOPC-vh8AAEWrtgKOts189.jpg


3、pgrep,pidof

pgrep 常用选型:

-U 查看指定用户的进程号

-G 查看指定用户组的进程号

-l 显示进程名和进程号

wKioL1PLvhCQMqZ0AAD7aQPiG9s329.jpg

pidof:只显示已启动进程的PID

[root@server ~]# pidof httpd # 没启动的进程不显示  [root@server ~]# pidof man  5283

4、top命令

实时监控系统资源

# 执行top命令后,进入交互式模式

wKiom1PLwTvzUMNsAASsHaYJe14951.jpg

# top中的一些交互式命令:  # l:控制是否显示第一行,负载均衡信息  # t:控制是否显示进程信息由和cpu信息  # m:控制是否显示内存,交换信息  # I 或者 1(数字):是否分别显示cpu每个信息  # M: 按%mem排序显示,从大到小  # k: kill 杀掉进程  # s:修改默认刷新时间 默认是3秒  # 下面解释抬头信息:  top - 21:35:17 up 10:03,  4 users,  load average: 0.00, 0.00, 0.00  #   系统时间   启动时间 登录用户数    负载均衡:1min 5min 15min  # 何为系统负载?在这里指的是等待在进程队列里的平均进程数  # 此出显示的信息 等价于 uptime 命令  Tasks: 165 total,   1 running, 164 sleeping,   0 stopped,   0 zombie  # 进程总数            运行数     睡眠态数        停止态数    僵尸进程数  Cpu(s):  0.0%us,0.0%sy, 0.0%ni, 100.0%id, 0.0%wa, 0.0%hi, 0.0%si,  0.0%st  # 0.0%us:user space:用于运行用户空间的程序所占的cpu百分比   # 0.0%sy:system space:用于运行内核空间的程序所占的cpu百分比     # 0.0%ni:nice值调用时间所占cpu百分百比  # 100.0%id:系统cpu空闲所占百分比  # 0.0%wa:用于等待I/O所占的cpu百分比  # 0.0%hi:硬中断所占cpu百分比  # 0.0%si:软中断所占cpu百分比  # 0.0%st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu  Mem:   1012548k total,   396328k used,   616220k free,    99444k buffers  #       总内存大小     使用的内存大小    剩余内存大小    缓存的大小  Swap:  2097144k total,        0k used,  2097144k free,   144156k cached  #    交换分区总大小        使用的        剩余的            缓冲大小  # 此处显示的信息等价于 free 命令

常用选项:

-d #: 指定刷新时间间隔

-b: 以批次的方式显示top的刷新

-n #: 显示的批次

例如:top -d 4 -b 2 -n 3


4、htop

htop命令是top命令的升级版,无论是在功能上还是在界面显示上,都比top命令更胜一筹。

u: 交互式选择显示指定用户的进程

l: 显示光标所在进程所打开的文件列表

s: 显示光标所在进程执行的系统调用

a: 绑定进程到指定的CPU

#:快速定位光标至PID为#的进程上

下图是htop的界面。这个工具比较强大,用法功能比较多,在这里先做简单介绍。以后笔者会专门写htop的博客。

wKiom1PL1jHCpKO4AATAgaiStJA686.jpg

5、vmstat

wmstat 查看虚拟使用情况

# 常用用法:  # vmstat 显示信息会默认1秒刷新一次,一直显示  # vmstart -n 2 显示信息会2秒刷新一次,一直显示  # vmstat -n 1 4 显示信息会1秒刷新一次,刷新4次  [root@server ~]# vmstat -n 1 1  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----  r b swpd free buff cache si so bi bo in cs us sy id wa st  0 0 0 614392 100468 144776 0 0 2 1 6 5 0 0 100 0 0  # 我们解释一下每个字段的含义:  # procs字段 关于进程的  # r 指运行队列的进程数,如果过长,可能是cpu性能较低  # b 阻塞队列的长度,通常是用于等待I/O的完成。如果太大,说明I/O性能较低  # memory字段 关于内存使用的  # swap 使用的交换内存大小  # free 空余内存大小 它的值=总大小-buff-cache-used  # buff 缓冲大小,目的是为了加速I/O的写操作(一般是磁盘)  # cache 缓存大小,摸底是为了加速I/O的读操作(一般是磁盘)  # swap字段 说明交换内存  # si swapin 指的是数据进入交换内存的速率 单位:KB/s  # so swapout 指的是数据出交换内存的速率 单位:KB/s  # 如果这2个值比较大的时候,会出现抖动现象。建议增加内存  # io字段 I/O的说明  # bi:Block in 从块设备读入内存的速率 KB/s  # bo: block out 保存到块设备的速率 KB/s  # 这就是我们通常说的磁盘的读写性能,可以通过RAID提高。  # system字段 关于系统的  # in: interruppt 中断发生的速率  # cs: 上下文切换的速率(进程调度)  # cpu字段 说明cpu的使用情况  # us:user space:用于运行用户空间的程序所占的cpu百分比  # sy:system space:用于运行内核空间的程序所占的cpu百分比   # id:系统cpu空闲所占百分比  # wa:用于等待I/O所占的cpu百分比,这是由于cpu和i/o速度相差太多所造成的  # st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu的时间百分比

6、nice,renice

调整进程的优先级。 

nice 在进程启动的时候设置优先级。

# 常用参数:  # -n NICE 例如:nice -n 3 httpd  # 一般情况下,nice值是负值的设定一般有管理员来设定。普通用户只能设置nice为正值。  # 如果不指定 -n 参数,默认的nice值是10

renice 重新设置已启动进程的优先级。

# 常用选项是:  # -n NICE 重新设定nice的值   # -p PID  设定进程的PID

7、kill,killall

对于有Linux C编程经验的人来说,我们知道IPC通信方式之一就是通过信号量(signal),那么对于kill和killall命令来说,它们与信号量有着很大的关系,或者说kill,killall命令通过信号量让我们可以手动的向进程传递信号来控制进程。

常见的信号量如下:

[root@server ~]# kill -l  1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP  6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1  11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM  16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP  21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ  26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR  31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3  38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8  43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7  58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2  63) SIGRTMAX-1 64) SIGRTMAX   # 我们常用到的信号是:  # 1 SIGHUP 在不关闭进程的情况下,重读配置文件。ngnix在这方面做得相当的好,甚至可以实现在线升级。  # 2 SIGINT 中断信号 相当于 ctrl + C   # 9 SIGKILL 暴力杀死  # 15 SIFTERM 优雅的关闭 默认是这种情况  # kill用法如下:  # kill [-SIGNAL] PID  # 对于SIGNAL有三种表示:例如:1) -9 -15 -1 -2 2)-SIGKILL -SIGHUP -SIGTERM 3) -HUP -KILL -TERM -INT 等。  #   # killall是杀掉一类进程  # 例如:killall httpd 等价于 kill `pidof httpd`


8、jobs,bg,fg

什么是作业呢?作业就是许多进程一起协同完成一项具体的工作。作业有前台作业和后台作业2种。

使用 & 或者 ctrl + Z可以把一个进程打入后台。

# ping 192.168.0.1 &  # 这样打入后台的运行的作业,退出终端的时候,作业就会终止。  # 使用 nohup 命令可避免这个问题  # nohup ping 192.168.0.1 &  # 可以使用jobs命令查看后台的作业  # 每个作业都有一个作业号来标识作业  # 作业控制命令  # bg [[%]JOB_NUM]: 让送往后台的作业继续在后台运行   # fg [[%]JOB_NUM]: 将后台作业调回前台  # kill %JOB_NUM: 终止指定的作业

9、dstat命令,查看各种状态信息

用法:dstat [-afv] [options..] [delay [count]]

常用参数具体意义
-c显示cpu统计数据,如有多个CPU汇总统计
-d显示disk统计数据,如有多块磁盘则汇总统计
-D DEVICE显示特定磁盘的信息
-g显示page信息(具体什么是page以及他的作用,会在以后内存调优博客中具体说明)
-i显示中断的统计数据
-m显示内存的统计信息
-l显示系统的负载信息
-n显示网络接口的相关属性
-s显示系统属性
-N INTER_FACE_NAME显示特定接口的属性
-s显示交换内存的属性
-p显示进程队列
--ipc显示ipc消息队列、信号量和共享内存的使用状况
-a等价于 -cdngy 显示CPU,磁盘,网卡,page,系统属性
-f以完整格式显示所有信息,
--tcp,--udp显示tcp,udp状态信息

更多参数查看 man 手册。

示例:

wKioL1PPjaLSKNvDAAIC62HqoLo613.jpg

10、查看内存映射

pmap PID 查看对应进程的内存映射,常用的用法是:pman `pidof PROCESS_NAME`。当然这些信息也可以查看 /proc/PID/pmap 文件查看。

wKioL1PPlxuwUs3qAASA-p7eoQo539.jpg

11、glances命令

一款强大的系统监控工具:能实时监控像cpu,meomory,load,swap,Network,mount,disk等信息。

wKiom1PPmBeQvjSkAAUMI3MjxWg937.jpg

其他功能的使用,请使用 h 来获取帮助。由于此工具比较强大,因此这里者简单的介绍,后期会于 htop 工具做专门的介绍。