进程管理
进程概念
程序一般是放置在磁盘中的,通过用户的执行来触发。出发后会被加载到内存中成为一个个体,就是进程。
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合 进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限, 通常从执行进程的用户来继承
存在生命周期
task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的的task struct组成的链表
进程创建: init:第一个进程 父子关系
进程:都由其父进程创建,CoW fork(), clone()
进程:程序在一个数据集上的一次运行过程。是操作系统资源分配的基本单位。
线程:是进程中的一个实体,是被操作系统独立调度和执行的基本单位。一个进程包含一个或多个线程。
作业是向计算机提交任务的任务实体,
而进程是执行实体,是资源分配的基本单位,
线程是处理机调度的基本单位。
进程特征
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
进程的状态和转换
进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。
1)就绪状态(Ready):
进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
2)运行状态(Running):
进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
3)阻塞状态(Blocked):
由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。
进程状态五态模型:
运行状态(Running):当一个进程正在处理机上运行时。
就绪状态(Ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行.
等待状态又称阻塞状态(Blocked):一个进程正在等待某一事件而暂停运行时。如等待某资源,等待输入/输出完成。
创建状态(NEW):一个进程正在被创建,还没被转到就绪状态之前的状态。
结束状态(Exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致。
状态之间转换六种情况
运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
查看进程ps [OPTION]...
支持三种选项:
UNIX选项 如-A -e
BSD选项 如a
GNU选项 如--help
• 选项:默认显示当前终端中的进程
• a 选项包括所有终端中的进程
• x 选项包括不链接终端的进程
• u 选项显示进程所有者的信息
• f 选项显示进程树,相当于 --forest
• k|--sort 属性 对属性排序,属性前加- 表示倒序
• o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
• L 显示支持的属性列表
ps常见选项
-C cmdlist 指定命令,多个命令用,分隔
-L 显示线程
-e: 显示所有进程,相当于-A
-f: 显示完整格式程序信息 -F: 显示更完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称
-U userlist 指定真正的用户ID或名称
-g gid或groupname 指定有效的gid或组名称
-G gid或groupname 指定真正的gid或组名称
-p pid 显示指pid的进程
--ppid pid 显示属于pid的子进程
-M 显示SELinux信息,相当于Z
ps输出属性
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
ps常用组合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps示例
查询你拥有的所有进程: ps -x
显示指定用户名(RUID)或用户ID的进程: ps -fU apache ps -fu 4
显示指定用户名(EUID)或用户ID的进程: ps -fu wang ps -fu 1000
查看以root用户权限(实际和有效ID)运行的每个进程: ps -U root -u root
列出某个组拥有的所有进程(实际组ID:RGID或名称): ps -fG nginx
列出有效组名称(或会话)所拥有的所有进程: ps -fg mysql ps -fG 27
通过进程ID来显示所属的进程: ps -fp 1234
以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程: ps -f --ppid 1234
显示指定PID的多个进程: ps -fp 1204,1239,1263
要按tty显示所属进程: ps -ft pst/0 ps示例
以进程树显示系统中的进程如何相互链接: ps -e --forest
以进程树显示指定的进程 ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd
要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进 程数)列:
ps -fL -C nginx
要列出所有格式说明符: ps L
查看进程的PID,PPID,用户名和命令: ps -eo pid,ppid,user,cmd
使用其PID查找进程名称: ps -p 1244 -o comm=
要以其名称选择特定进程,显示其所有子进程: ps -C sshd,bash
pstree:显示进程树
pidof:查询指定进程的PID
pgrep:搜索指定的进程
- -u uid: effective user,生效者
- -U uid: real user,真正发起运行命令者
- -t terminal: 与指定终端相关的进程
- -l: 显示进程名
- -a: 显示完整格式的进程名
- -P pid: 显示指定进程的子进程
uptime:查看系统的基本负载状态
top:实时监控系统状态工具
交互按键:
- M:按内存使用排序
- P:按CPU使用排序
- l:显示、隐藏top第一行
- t:改变/隐藏CPU的显示方式
- m:改变/隐藏内存的显示方式
- 1:单CPU和总CPU
- s:改变刷新间隔,默认3s
- k:杀死进程
- PID -- signal(15 关闭进程)
- q:退出
- W:将状态保存到~/.roprc
选项:
- -d #:指定时间间隔,秒
- -b:显示所有进程的状态
- -n #:刷新#次自动退出
[root@rhel6 ~]# top -n1 -b top - 03:06:25 up 10:41, 1 user, load average: 0.00, 0.01, 0.05
top - 系统时间 up 启动了多长时间 用户 负载:(1,5,10)分钟的平均负载 Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
总进程数 正在运行进程数 睡眠进程数 停止态进程数 僵尸进程数 Cpu(s): 0.2%us, 0.5%sy, 0.0%ni, 99.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu(s):用户空间使用率 系统空间使用率 nice值 空闲率 等待率 硬中断率 软中断率 被偷走的时间(分配给虚拟机中的进程的时间片) Mem: 1004136k total, 452340k used, 551796k free, 40868k buffers Swap: 2097148k total, 0k used, 2097148k free, 263940k cached
总内存大小 已使用 空闲内存 缓存使用 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19356 1552 1232 S 0.0 0.2 0:00.89 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
htop(epel):top的增强版,界面更友好,支持鼠标点击
iotop:用来监视磁盘I/O使用状况
选项:
- -o:只看产生IO的进程
- -b:非交互式
- -n #:检测#次,默认为一直检测
- -d #:检测间隔#秒
- -p PID:检测指定PID的进程
- -u:检测指定用户产生IO的情况
- -P:仅显示进程,默认显示线程
- -a:显示累计的IO量
- -k:使用KB为单位
- -t:显示时间戳
- -q 只在第一次监测时显示列名
- -qq 永远不显示列名
- -qqq 永远不显示I/O汇总
交互按键:
- left和right方向键:改变排序
- r:反向排序
- o:切换至选项-o
- p:切换至-p选项
- a:切换至-a选项
- q:退出
- i:改变线程的优先级
Total DISK READ: 673.43 M/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
线程ID(按p可切换PID) 优先级 用户 读速度 写速度 swap所占率 IO等待率 进程名 15330 be/4 root 673.43 M/s 0.00 B/s 0.00 % 2.07 % dd if=/dev/sda of=/dev/null 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
nice -n nice值 CMD:指定运行时的nice值
renice -n nice值 CMD:调整运行中进程的nice值
vmstat:查看虚拟内存状态
- -s: 显示内存的统计数据
[root@centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 574860 2080 260516 0 0 105 37 165 179 0 1 99 0 0
- procs
- r:可运行(正运行或等待运行)进程的个数
- b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
- memory
- swpd: 交换内存的使用总量
- free:空闲物理内存总量
- buffer:用于buffer的内存总量
- cache:用于cache的内存总量
- swap
- si:从磁盘交换进内存的数据速率(kb/s)
- so:从内存交换至磁盘的数据速率(kb/s)
- io
- bi:从块设备读入数据到系统的速率(kb/s)
- bo: 保存数据至块设备的速率
- system
- in: interrupts 中断速率,包括时钟
- cs: context switch 进程切换速率
- cpu
- us:花在运行非内核代码上的时间
- sy:花在运行内核代码上的时间
- id:闲置的时间
- wa:等待IO的时间
- st:被虚拟机盗取的时间
iostat:统计CPU和设备IO信息
dstat:系统资源统计工具
- -c: 显示cpu相关信息
- -d: 显示disk相关信息
- -g:显示page相关统计数据
- -m: 显示memory相关统计数据
- -n: 显示network相关统计数据
- -p: 显示process相关统计数据
- -r: 显示io请求相关的统计数据
- -s: 显示swapped相关的统计数据
- --tcp:显示tcp相关统计数据
- --udp:显示udp相关统计数据
- --unix:显示unix-sockets相关统计数据
- --raw:显示raw相关统计数据
- --socket:显示socket相关统计数据
- --ipc:显示ipc相关统计数据
- --top-cpu:显示最占用CPU的进程
- --top-io: 显示最占用io的进程
- --top-mem: 显示最占用内存的进程
- --top-latency: 显示延迟最大的进程
pmap PID:查看进程对应的内存映射 == cat /proc/PID/maps
- -x:显示详细信息
glances(epel):调用远程主机上的系统运行状态信息
[root@centos7 ~]# yum -q -y install glances #安装glances软件包
[root@centos7 ~]# glances -s -B 192.168.0.7 & #启动服务并监听端口
[root@centos7 ~]# glances -c 192.168.0.7 #客户端连接
释放buff/cache空间
echo 1 > /proc/sys/vm/drop_caches
kill:向进程发送控制信号
- -n # PID:向进程发信号
- %作业号:结束作业
- -l:查看所有信号
常用信号:man 7 signal
- 1:SIGHUP 让进程重读配置文件
- 2:SIGINT 终止信号
- 3:SIGQUIT ctrl+\,退出信号
- 9:SIGKILL 强制退出
- 15:SIGTERM 正常退出,kill默认发送15信号
- 18:SIGCONT 继续运行
- 19:SIGSTOP 停止信号
pkill -n #:向进程发送信号,支持模式匹配,用法和pgrep相似
- -u uid: effective user,生效者
- -U uid: real user,真正发起运行命令者
- -t terminal: 与指定终端相关的进程
- -P pid: 显示指定进程的子进程
killall -n # CMD:向进程发送指定信号
jobs:显示当前终端所有的作业
g [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
当我们在执行一个时间比较长的前台任务(如:压缩大文件,编译内核等),如果途中网络中断会导致我们的任务执行中断,此时为了避免这种情况建议采取以下操作:
- nohup CMD &>/dev/null 剥离与终端的关系,如果终端关闭,进程由init(systemd)接管
- screen:使用Ctrl + a,d剥离会话,-r恢复会话