Linux进程管理原理
Linux的进程管理,就是对硬件各资源进行分配、调度、销毁等工作,其主要部件的管理为:CPU、内存、IO的分配和调度工作。其CPU的指令执行又分为特权指令、普通指令级别,而在linux系统层面将其对应为内核空间、用户空间。系统运行之上的程序通常只能执行普通指令,如果需要管理硬件,与硬件相关的读、写、删除操作(即面向硬件层面的请求),需要向init进程提交请求,再由Init进程发送给内核,由内核调用CPU完成其指令,这个过程被称作为系统调用,也被称为软中断。而系统调用在用户空间的表现形式为各种函数,即程序内部代码调用了其对应的函数模块。从用户模式切换到内核模式,或者从内核模式到用户模式,这个过程就称之为模式切换。当发起一个系统调用,通常被称之为一个软中断
. 当IO或者其他的硬件完成操作,需要将其结果发送给CPU处理时,CPU此时将暂停其他工作,接手其IO的中断请求,这过程被称之为硬中断
.
CPU是将其计算能力划分为以时间为单位的时间片,再将时间片发配给进程使用,以此来完成程序的响应。由于各进程会抢用时间片,以造成其他进程不能正常工作的情况,此时将由内核管理进程的运行状态、优先级、进程的生命周期等工作,此过程被称之为进程调度
。当计算机只有一颗物理CPU时,意味着正在运行的情况只能有一个,多任务处理的情况会面临抢占资源。故需要将多个等待处理的进程状态保存至内存中,Linux内核存储进程的结构体被称之为task struct
,每个task struct都保存了其进程名,存储位置,进程的优先级等信息,多任务的task struct存储被称之为链表结构(task list),即内核把物理内存分成大小为4k的页框,再将页框分配给进程的虚拟内存(vritual size,虚拟内存集)
,让每个进程都工作在虚拟内存集中,从虚拟层面感知自己可用空间为系统的剩余空间。当系统启用时会加载很多的基本库glic或者其他的程序所共同依赖的库文件,都会一次性加载到内存中,这部分被称之为共享内存集(shared size)
,如果每个内存将使用共享内存中的库文件,会在自己的虚拟内存中添加其所需的文件内存地址指针
.而不是把所需要的文件都加载到其进程空间中。
共享内存集又被分为常驻内存和不常驻内存,常驻内存一般是系统调用所需要的库文件,故是不能被交换到交换分区的。当内存负荷比较大的情况下,内核会通过LRU
算法将不常用的内存空间交换到交换分区,如果需要重新使用此进程时,内核又会将其调入到内存中加载被使用。
内存管理中,每个进程又被分优先级。内核将进程划分为280个队列,其中140个队列存放过期队列(被调度过的进程),140个队列存放运行的进程,当下次调用进程的时候,只需要扫描140个运行的进程队列首部即可,以此完成快速调用。其每个队列有其对应的优先级,表示范围为『0-139』。「0-99」是实时优先级,数值越大,优先级越大。「100-139」是静态优先级,其中可通过管理命令调整,使用nice值表示为-20,19,并对应100-139的优先级。其nice值越小表示优先级越高。越高优先级的进程会被优先调用执行。当一个进程正在运行时,此时一个高的优先级进程需要先执行,CPU将暂停正在运行的进程,将CPU的运行状态保存至寄存器,这个过程称之为保存现场。这种进程与进程之间的切换,也被称之为上下文切换。
内存存放数据格式
- 堆(heap)
- 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
- 栈(stack)
- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等
- 代码段
- 数据段
进程间通信机制IPC (inter process communication):
- socket
- D-bus(用于桌面程序和OS通信)
- Dcop(轻量级的,功能较少,一般用于K桌面环境)
- SOAP(用于web服务,使用http其传输协议)
- XML-RPC(用于web服务,使用http其传输协议)
- CORBA(面积对象编程中复杂的IPC解决方案)
进程的类型
- 守护进程:daemon(服务类),在系统引导过程中启动的进程,跟终端无关
- 前台进程:跟终端相关,通过终端启动的进程
进程的状态及其就对的代码
- 运行态:running,正在运行的
-
R
:running
-
- 就绪态:ready,等待运行的
- 睡眠态:
- 可中断的睡眠:interruptable
-
S
: interruptable-sleeping
-
- 不可中断的睡眠 :uninterruptable(其有IO等待)
-
D
:uninterruptable-sleeping
-
- 可中断的睡眠:interruptable
- 停止态:stopped,暂停于内存中,但不会被调度执行,除非手动启动
-
T
: stopped
-
- 僵死态:zombile,僵尸进程
-
Z
: 僵死态
-
进程标识符代码:
-
+
: 前台进程,运行在终端之上,需占用prompt -
l
: 多线程进程 -
N
: 低优先级 -
<
: 高优先级 -
s
: session leader, 可以理解为会话的父进程
查看内核中进程的相关信息
- /proc/PID
- /proc/PID/maps : 进程存放内存映射的位置
进程IO调用的过程:
- 先将数据由内核加载到内核空间,
- 再将内核空间的数据复制一份到进程空间
Centos各版本的守护进程
- Centos 5
- Sys init --> 依赖脚本串行启动,比较慢
- Centos 6
- Sys init --> upstart启动程序,依赖于ubus机制通信,并行启动各进程
- Centos 7
- Systemd --> systemd启动程序,只需要一个init进程,就可以把各服务启动起来,启动速度快
=========
Linux下进程管理各工具
ps命令
工作原理:
- 通过/proc输出状态信息。/proc/PID的目录下,存放了当前进程的各种信息
ps命令
ps
- ps - report a snapshot of the current processes.
- synopsis: ps [options]
- [options]
- 其有三种风格使用方法:
- [options]
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
* `a` : 所有与终端相关的进程
* `x` : 所有与终端无关的进程
* `u` : 以用户为中心来组织状态信息显示,其是以PID进行排序
* `-e` : 显示所有进程
* `-f` : 显示完整格式的进程信息
* `-F` : 显示完整格式
* `-H` : 以层级结构显示进程的相关信息
* `o` : 自定义要显示的字段列表,以逗号分隔
* ps axo pid,cmommand
常用组合:
-
ps aux
[root@zhenping 1]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 59632 7676 ? Ss 21:06 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
-
ps -ef
[root@zhenping 1]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 21:06 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
-
ps -eFH
root@zhenping 1]# ps -eFH UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 0 21:06 ? 00:00:00 [kthreadd]
-
ps -eo
[root@zhenping 1]# ps -eo pid,command,user PID COMMAND USER
-
ps axo
root@zhenping 1]# ps axo pid,command,user,nice PID COMMAND USER NI
ps中常用的命令字段
- pid
- nice
- pri:优先级
- psr:进程当前分配的处理器
- pcup:占用CPU百分比
- stat:进程状态
- command:运行的程序
- tty:终端
- ppid:父进程
- rtprio :realtime priority,实时优先级
ps命令显示中的字段名称含义
- %CPU : 占用CPU的百分比
- %MEM : 占用内存的百分比
- VSZ : virtual size,虚拟内存集(线性内存空间存数据占用的大小)
- RSS : resident size,常驻内存集,不能放到交换内存上,有的时候也会显示为RSZ(rsszie.resident set size)
- STAT : 进程的运行状态
- time : 进程占用CPU的累计时间
- USER : 用户
pgrep命令
功能
- 进程过滤,以实现快递查找进程
pgrep
- pgrep, pkill - look up or signal processes based on name and other attributes
synopsis: pgrep [options] pattern
-
[options]
-u UID
: 显示指定用户的进程-U UID
: read user,由谁启动的进程-t Terminal
: 与指定的终端相关的进程-l
: 显示进程名-a
: 显示完整格式的进程名,进程名和启动的参数-
-p PIDNUM
: 显示此进程的子进程pgerp ssh : 查看进程中有ssh的字符串的进程 pgrep sshd | xargs -i kill -9 {} #将所有sshd进程退出 pgrep sshd | xargs kill -9 #同上
pkill命令
- 用法与pgerp相同
pidof命令
-
取指定进程的进程号
pidof sshd # 显示sshd的进程号 2215 1041
top命令
top - display Linux processes
top中显示名称含义解释
-
第一行(uptime信息,可以使用
l
命令关闭或显示)系统的当前时间、运行时长、登录用户、平均负载(过去1分钟、5分钟、15分钟的平均负载,指每逻辑CPU进程队列长度)
第二行(进程任务)
-
第三行 : (CPU使用情况,可以使用
t
命令关闭或显示)-
us
: 用户空间 -
sy
: 内核空间(一般负载的CPU,us与sy所点的比例为7:3
) -
ni
: nice -
id
: 空闲百分比 -
wa
: 等待IO完成的时间 -
hi
: 硬件中断消耗CPU百分比 -
si
: 软件中断消耗CPU百分比 -
st
: 被偷走的百分比,一般指虚拟机 -
cs
: 上下文切换
-
-
第四行(内存使用信息,可以使用
m
命令关闭或显示)- 总空间
- 空闲空间
- 已使用空间
- 缓冲和缓存的空间(可以被回收再使用,不逄真的占用)
- 真正的系统空间应为:free + buff/cache
-
常用字段说明
VIRT : 虚拟内存集
RES : 常驻内存集
SHR : 共享内存集
-
常用命令
M
: 以内存占用率排序P
: 以CPU占用率排序T
: 以累计占用CPU时间排序q
: 退出top工具k
: 终端指定的进程s
: 更改top的刷新时间,默认为3秒u
: 只显示指定用户的进程-
top启动参数
-d #
: 启动时指定刷新时间间隔,默认为3秒-b
: 以批次方式显示-n #
: 显示多少批次
htop命令
-
[options]
-
-d #
: 指定刷新时间的时间间隔 -
-u USERNAME
:仅显示指定用户的进程 -
-s COLUME
: 以指定字段进程排序
-
-
内置命令
-
s
: 显示进程的系统调用 -
l
: 显示选定的进程打开的文件列表 -
t
: 以层级关系显示各进程的状态 -
a
: 选定进程绑定在指定的CPU上
-
=========
Linux性能查看工具
vmstat命令
vmstat - Report virtual memory statistics
-
synopsis: vmstat [options] [delay [count]]
vmstat 2 : 每两秒钟显示一次 vmstat 2 3 : 每两秒钟显示一次,显示3次
-
[options]
-
-s
: 显示内存各种统计数据
-
各种选项字段说明
-
procs
-
r
: 处于等待运行的进程个数,即每CPU上等待运行的任务长度,实时的,不是其平均值 -
b
: 阻塞的任务队列长度,处于不可中断睡眠态的进程个数,如果这个值太大,说明IO太大
-
-
memory
-
swpd
: 交换内存的使用问题,0表示没有启动交换内存,如果使用量太大,说明服务器内存太小了 -
free
: 空闲的物理内存总量 -
buff
: 用于buffer的内存总量 -
cache
: 用于cache的内存总量
-
-
swap
-
si
: 平均值,数据进入swap中的数据速率(kb/s) -
so
: 平均值,数据离开swap中的数据速率(kb/s)- 注意:si so的活动频繁,速率大,交换内存也使用了,并且有增大的趋势,说明物理机的内存太小了
-
-
io
-
bi
: 从块设备读入数据到内存的速率(kb/s) -
bo
: 从内存到块设备的速率(kb/s)
-
-
system
-
in
: interrups(中断),中断速率,数值太大了,说明CPU太弱 -
cs
: context switch ,上下文切换速率,数值太大了,说明CPU太弱
-
-
CPU
-
us
:用户空间占用的百分比 -
sy
:内核空间 -
id
: idle,空闲的 -
wa
: wait,等待IO完成的 -
st
: stolen,被偷走的时间
-
dstat命令:
dstat - versatile tool for generating system resource statistics
-
dstat [-afv] [options..] [delay [count]]
- [options]
-
-c
: 查看CPU -
-C #,#..,total
:查看指定CPU或总的CPU -
-d
:disk的相关信息 -
-D sda,sdb….total
:磁盘信息 -
-g
: 显示Page相关的统计数率数据 -
-i
: 中断 -
-m
: mem -
-n
;interface的相关统计数据 -
-p
: process的相关统计数据 -
-r
: IO请求相关统计数据 -
-s
: swapped相关统计数据 -
-t
: 输出当前时间 -
—-aio
: 异步同步信息 —-rpc
-
—-lock
: 文件锁的信息 -
—-raw
: 祼套接字的信息 -
-—tcp
:查看tcp连接信息 -
-—udp
: —-raw
—-socket
—-ipc
-
—-top-io
: 显示最占用io的进程 -
—-top-cpu
: 最占用cpu的进程 -
—-top-int
:最大中断的进程 -
—-top-mem
:最占用内存的进程 -
—-top-latency
: 延迟最大的进程
-
- [options]
iostat
iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions
- [options]
-d : 显示磁盘设备
-k : 以block为单位显示的列强制使用K为单位
-
-x : 显示其扩展信息
iostat -x 1 10 : 显示扩展信息,以1秒刷新间隔,显示10次 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.06 0.05 1.07 0.28 12.36 5.81 26.90 0.00 0.91 0.70 1.71 0.74 0.10 说明: rsec/s:每秒读取的扇区数; wsec/:每秒写入的扇区数。 avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好 await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地 系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时 间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之 差值越大,队列时间越长,说明系统出了问题。 svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表 示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太 长,系统上运行的应用程序将变慢。 %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在 处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙 程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即 使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
pmap命令
功能:
- 查看进程内存映射表
synopsis: pmap [option] PID [...]
- [option]
-
-x
: 显示详细格式的信息pmap -x 1 #显示Pid为1的内存映射表详细信息 pma 1 #显示PID为1的内存映射表信息
-
注意:可以 cat /proc/1/maps,也可以查看进程的内存使用情况
glances 命令
- 跨平台的监控工具,其监控计算机的性能信息,可以理解为远程版本的top工具
内建命令
b
: 以Byte为单位显示网卡数据速率d
: 关闭磁盘IO模块m
: 关闭mount模块n
: 关闭network模块t #
: 刷新时间间隔1
: 每个CPU的统计数据单独显示-o {html | csv}
: 以指定格式输出-
-f /path/DIR
: 设定输出文件的位置glances -o HTML -f /root/ : 指定以html格式输出到root目录下
glances的C/S模式
-
服务端:
glances -s -B IPADDR # ipaddr指本机的某地址,用于监听,-s表示为服务端,-B表示指定哪个IP地址
-
客户端:
glances -c IPADDR # -c表示为一个client,IPADDR为服务端的IP地址
kill命令
kill - kill - terminate a process
-
synosis: kill -l
- 信号标识方法有三种:
- 信号的数字标识
- 信号的完整名称
- 信号的简写名称
- 信号标识方法有三种:
-
synopsis: kill [-s signal|-p] [-q sigval] [-a] [--] pid...
常用信号
-
- SIGHUP:无须关闭进程而让其重新读取配置文件
-
- SIGINT: interrupts之义,终止正在运行的进程
9)SIGKILL : 杀死运行中的进程(直接退出)
15)SIGTERM : 终止正在运行的进程(让其保存好数据再退出)
18)SIGCONT : 继续
-
19)SIGTOP : 停止
kill -1 2219 # 让此进程重读配置文件 kill -sigkill 2219
调整进程优先级
- 可通过nice命令调整进程的优先级,优先级的范围为100-139,分别对应 -20,19的阀值,进程启动时nice值为0,其对应的优先级为120,nice数值越小优先级越高
nice命令
nice - run a program with modified scheduling priority
nice [option] [COMMAND][ARGU….]
- [options]
-
-n NICE
: 指定nice值nice -n -5 htop #为115优先级启动htop 注意:nice值只有管理员可调
-
renic命令
renice - alter priority of running processes
renice [-n] NICE PID
- [options]
-
-n NICE
: 指定NICE值renice -n -3 5207 : 调整进程PID为5207的nice值为-3
-
================
Linux上的作业控制
作业的分类
-
前台作业(foregroud)
- 通过终端启动,且启动后会一直占据终端
-
后台作业(backgroud)
- 可以通过终端启动,但启动后立即转入后台运行
如果将作业运行于后台
- ctrl + z
- 此方法会将作业转为停止状态
- COMMAND &
- 此类作业立即送到后台,也会有终端相关,如果终端停止了,作业也会被停止
- nohup COMMAND &
- 此类作业立即送到后台,脱离终端
显示当前系统上的所有作业
jobs 命令
root@zhenping ~]# jobs
[1]- 已停止 vim a.sh
[2]+ 已停止 ping 202.96.209.5
将作业从后台调回到前台
- fg 命令
- fg [[%]] JOB_NUM]]
%
:表示这是一个作业号-
JOB_NUM : 作业号码
fg 1 # 把1号作业调回到前台
- fg [[%]] JOB_NUM]]
将后台作业从停止状态变成运行状态
- bg命令
-
bg [[%]] JOB_NUM]]
[root@zhenping ~]# bg 3 #3号作业从停止转运行状态 [3]+ ping 202.69.209.5 &
-
结束作业
- kill命令
-
kill %job_NUM
[root@zhenping ~]# kill %2 #结束2号作业
-