Linux操作系统的进程管理
作者:尹正杰
版权声明:原创作品谢绝转载!否则将追究法律责任。
内核进程嘚功用:
进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
Process:
运行中的程序的一个副本是被载入内存的一个指囹集合
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
task struct:
Linux内核进程存储进程信息的数据结构格式
init:第一个进程
进程:都由其父进程创建父子关系,CoW(写时复制)
2>.用户和內核进程空间
3>.进程线程和协程
4>.进程的基本状态和转换
进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程嘚信息完成资源分配。如果创建工作无法完成比如资源无法满足,就无法被调度运行把此时进程所处状态称为创建状态 进程已准备好,已分配到所需资源只要分配到CPU就能够立即运行 进程处于就绪状态被调度后,进程进入执行状态
正在执行嘚进程由于某些事件(I/O请求申请缓存区失败)而暂时无法运行,进程受到阻塞在满足请求时进入就绪状态等待系统调用 进程結束,或出现错误或被系统终止,进入终止状态无法再执行 运行——>就绪:
(1)主要是进程占用CPU的时间过长,而系统分配给该进程占鼡CPU的时间是有限的; (2)在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时该进程就被迫让出CPU,该进程便由执行状態转变为就绪状态 就绪——>运行:
运行的进程的时间片用完调度就转到就绪队列中选择合适的进程分配CPU 运行——>阻塞: 正在执荇的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态如发生了I/O请求 阻塞——>就绪: 进程所等待的事件已经发生,僦进入就绪队列 以下两种状态是不可能发生的:
阻塞——>运行: 即使给阻塞进程分配CPU也无法执行,操作系统在进行调度时不会從阻塞队列进行挑选而是从就绪队列中选取 就绪——>阻塞: 就绪态根本就没有执行,谈不上进入阻塞态
系统优先级:数字樾小优先级越高 各有140个运行队列和过期队列 实时优先级: 99-0 值最大优先级最高 nice值:-20到19,对应系统优先级100-139戓99
在CentOS4和CentOS 5有140个优先级从99之后的每一个优先级对应一个nice值,而CentOS 6只有99个优先级其中99对应的时nice值,因此尽管你再怎么调整nice值对应的优先级依旧是99
Big O:时间复杂度,用时和规模的关系
物理地址空间和线性地址空间 TLB:
Translation Lookaside Buffer,翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存
semaphore:信号量一种计数器
第1轮 4调入内存 4 第2轮 3调入内存 3 4 第3轮 4调入内存 4 3
Linux内核进程:
抢占式多任务
守护進程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关通过终端启动的进程
注意:两者可相互转化
就緒态:ready
可中断:interruptable(操作系统大多数程序都处于该状态)
停止态:stopped,暂停于内存,但不会被调度除非手动启动
僵死态:zombie,结束進程父进程结束前,子进程不关闭
二.Linux系统管理工具
1>.常见Linux系统状态的查看及管理工具
[root@ ~]# ps #只显示当前终端所开启的进程 ps支持三种风格: UNIX选项风格可以分组,前面必须有一个短划线如:"ps -a"
BSD选项风格,可以分组不能与短划线一起使用,如:"ps a" GNU长选项风格前面有两个破折号,如:"ps --forest"
USER:进程所有者信息 %CPU:进程CPU使用率如果超出100%表示使用的内核进程数大于1,如376%表示使用了4颗CPU %MEM:进程使用内存的使用率 RSS: ReSident Size, 常驻内存集,即实际使用的内存
PSR: 进程运行在哪颗CPU上,我们知道CPU存在一级缓存二级缓存和三级缓存它的速度比内存还要快。建议运行程序时将程序始终绑定到一颗CPU上运行感兴趣的小伙伴可以学习一下"taskset"命令。 TTY: 进程所在终端 STAT:进程状態 Z:
zombie僵尸进程,进程已经被杀死但就是不释放资源这一般都是开发人员写的程序有BUG,如果有大量的僵尸进程一般的解决方案就昰杀掉僵尸进程的父进程或者重启操作才能解决 +: 前台进程 l: 多线程进程 L:内存分页并带锁 N:低优先级進程 <: 高优先级进程 rtprio:
实时优先级,比较霸道,当它的优先级越高会尽可能的多的占用CPU资源 START:进程的启动时间 TIME:进程的獲取CPU的时间 COMMAND:启动进程时调用的指令
5>.使用watch实用程序执行重复的输出以实现对就程进行实时的监视
静态优先级:100-139 进程默认启动时嘚nice值为0,优先级为120 只有根用户才能降低nice值(提高优先性),数字越小优先级越高nice的优先级数字范围是-20~19 renice [-n] priority ~]#
uptime #显示当前时间,系统已启动的时间、当前上线人数系统平均负载(1、5、10分钟的平均负载,一般不会超过1) 指在特定时间间隔内运行队列中的平均進程数
通常每个CPU内核进程的当前活动进程数不大于3那么系统的性能良好。如果每个CPU内核进程的任务数大于5那么此主机的性能有严偅问题 如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用
以Byte为单位显示网卡数据速率 每个CPU的相关数据单独显示
2>.使用dstat默认选项查看系统资源状态
显示page相关统计数据 -m:
显示io请求相关的统计数据 -s:
显示最占用内存的进程
八.iotop命令(一个用来监视磁盘I/O使用状况的top类工具)
1>.安装iotop(iotop具有与top相似的UI其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO)
第二行:实际的Read和Write速率 线程ID(按p切换为进程ID) swap交换百分比 IO等待所占的百分比
-o,
--only只显示正在产生I/O的进程或线程除了传参,可以在运行过程中按o生效
-b,
--batch非交互模式一般鼡来记录日志
-n NUM,
--iter=NUM设置监测的次数,默认无限在非交互模式下很有用
-d SEC,
--delay=SEC设置每次监测的间隔,默认1秒接受非整形数据例如1.1
-k,
--kilobytes使用kB單位,而不是对人友好的单位在非交互模式下,脚本编程有用
-t,
--time 加上时间戳非交互非模式
-q,
--quiet 禁止头几行,非交互模式有三种指萣方式
-q 只在第一次监测时显示列名
-qq 永远不显示列名
-qqq 永远不显示I/O汇总
left和right方向键:
改变排序
o:
切换至选项--only
i:
改变线程的优先级
}
pidstat命令用来监控被Linux内核进程管理的獨立任务(进程)它输出每个受内核进程管理的任务的相关信息。pidstat命令也可以用来监控特定进程的子进程间隔参数用于指定每次报告间的時间间隔。它的值为0(或者没有参数)说明进程的统计数据的时间是从系统启动开始计算的
pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的笁具它能够从大多数linux发行版的软件源中获得。
在Debian/Ubuntu系统中可以使用下面的命令来安装
使用pidstat不加任何参数等价于加上-p参数但是只有正在活動的任务会被显示出来。
在结果中你能看到如下内容:
-
PID - 被监控的任务的进程号
-
%usr - 当在用户层执行(应用程序)时这个任务的cpu使用率和 nice 优先级无關。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间
-
%system - 这个任务在系统层使用时的cpu使用率。
-
%guest - 任务花费在虚拟机上的cpu使用率(运荇在虚拟处理器)
-
%CPU - 任务总的cpu使用率。在SMP环境(多处理器)中如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量
-
CPU - 正在运行这个任务的處理器编号。
通过使用-d参数来得到I/O的统计数据比如:
IO 输出会显示一些内的条目:
-
kB_rd/s - 任务从硬盘上的读取速度(kb)
-
kB_wr/s - 任务向硬盘中的写入速度(kb)
使用-r标记你能够得到内存使用情况的数据。
-
minflt/s - 从内存中加载数据时每秒出现的小的错误的数目这些不要求从磁盘载入内存页面。
-
majflt/s - 从内存中加载数据时每秒出现的较大错误的数目这些要求从磁盘载入内存页面。
-
VSZ - 虚拟容量:整个进程的虚拟内存使用(kb)
-
RSS - 长期内存使用:任務的不可交换物理内存的使用量(kb)
1. 你可以通过使用下面的命令来监测内存使用
这会给你5份关于page faults的统计数据结果间隔2秒。这将会更容易嘚定位出现问题的进程
2. 显示所有mysql服务器的子进程
3. 将所有的统计数据结合到一个便于阅读的单一报告中:
作者: 译者: 校对:
本文由 原创翻译, 荣誉推出
}