一、概念:
1、程序与进程:
程序:由指令和数据组成的静态文件,程序是为了达到特定目的,可以被计算机运行并且由命令代码组成的序列;
指令:用于调度CPU工作,使CPU可以处理所需要的数据;
进程:运行中的程序;
2、程序的工作模式:
用户模式:用户态;
内核模式:内核态;
用户无权对硬件进行访问和操作,如果用户运行程序需要访问硬件,需要进行系统调用,通过内核来完成对硬件进行处理操作,此时程序由用户模式转入内核模式;
例如:执行mkdir命令,需要对硬盘进行写操作,此时会由系统调用内核执行代码完成此操作后将执行结果返回给用户;
CPU内部区域分配不同的功能:ring0分配给内核(kernel), ring3分配给用户程序(user program);
3、内存分配:
Linux对内存采用分段、分页机制;物理内存每4k划分为一个页框,页框为物理内存的最小单位;
应用程序运行于自己的地址空间内,这个地址空间称为线性地址空间,所有数据在线性地址空间内部表现为页面的形式存放,而不是分页的数据无法交换至交换分区;
进程访问数据是从线性地址空间访问,内核将线性地址转换为物理地址,使得进程可以访问数据;
MMU:内存管理单元(Memory Management Unit),线性地址与物理地址的对应关系存放于一张表中,这张表在MMU中进行维护;MMU完成线性地址到物理地址的转换;
内核借助于MMU使各个进程认为使用的内核好像是独立状态:内存编造了一个数据结构,如果内存为4G,1G分配给内核使用,3G分配给进程使用;这个数据结构使得每个进程都认为自己独占3G的内存空间;
4、进程调度:
CFS:Completely Fair Scheduler,完全公平调度器;
进程调度:挑选进程到CPU中运行的过程;
时间恒定算法:进程调度采用的O(1)的算法复杂度;
5、进程分类:
CPU密集型:CPU Bound,对于CPU占用率高的进程;
I/O密集型:I/O Bound,等待I/O时间长的进程;
6、进程优先级:
进程优先级的取值范围为0-139,CPU挑选进程是根据进程优先级进行的;
实时优先级:取值范围为0-99,数值越大优先级越高;
静态优先级:取值范围为100-139,数值越小优先级越高;
用户可以通过调整nice值(范围为-20~19)来改变进程的优先级,进程启动时,默认nice值为0,优先级对应为120;
动态优先级:由内核维护,动态调整;
Linux使用抢占式多任务,当时钟信号到达时,高优先级进程可以抢占CPU;
#nice -n # COMMAND:直接启动一个进程,并指定其nice值; #renice-n # -p PID:调整已运行的进程的nice值;
5、进程状态:
运行态:running
睡眠态:sleeping
可中断睡眠:interruptable
不可中断睡眠:uninterruptable,等待外部满足之前无法继续运行;
停止态:stopped,不会被内核调度并运行;
僵死态:zombie
6、子进程:
进程是单线运行的,进程中的指令必须按顺序执行;
子进程:如果父进程有任务无法单独完成,需要启动子进程来执行,此时父进程进入睡眠态,子进程执行完成后结果返回给父进程继续执行;
进程创建机制:每一个进程都是由其父进程fork()自身而来;
7、进程间通信(IPC ,InterProcess Communication):
同一主机:
signal:信号;
shm:共享内存;
semerphor:旗语;
不同主机:
RPC:RemoteProcedure Calling,远程过程调用;
socket:套接字;
8、CPU虚拟化:
将CPU切割为时间片(timeslice);
保存现场:将未执行完成的进程状态保存在状态表;
恢复现场:将状态表中为执行完成的进程调出继续执行;
9、线程:
线程(thread):轻量级进程(LWP,LightWeight Process);比进程更小的可以被单独调度的单位;
线程将进程的指令拆分,分配到不同的CPU上同时运行;Linux中的进程都是轻量级进程,已经相当于线程级别;
二、进程管理工具:
ps,pstree,pgrep,pidof,top,htop,pmap,vmstat,dstat,kill,job,glance
1、pstree:
查看当前进城树:
2、ps:
显示进程状态的命令:当前快照式、一次性显示:
ps存在众多版本,在CentOS 6下支持两种风格:
SysV:选项带“-“;
BSD:选项不带“-“;
常用选项:
a:与终端相关的进程; x:与终端无关的进程; u:显示用户 aux:常用组合选项;
上图字段含义:
USER:进程的发起用户; PID:进程的ID; %CPU:CPU占用率%; %MEM:内存的占用率%; VSZ:Virtual memory SiZe;虚拟内存空间大小,即线性地址空间大小; RSS: 常驻内存集;不能被交换到交换分区空间中的数据; TTY:终端; STAT:进程状态: R:running,运行态; S:可中断睡眠态; D:不可中断睡眠态; T:stopped,停止态; Z:zombie,僵死态; s:session leader; +:前台进程; l:多线程进程; N:低优先级进程; <:高优先级进程; START:进程启动时间; TIME:进程执行已用时间; COMMAND(CMD):包含在方括号中的进程表示为内核线程;
#ps �ef:常用命令组合; -e:显示所有进程; -f:显示完整格式的信息
ps �eFH:常用命令组合; -F: 显示额外信息; -H:显示进程的层次结构;
o:自定义要显示的信息; #psaxo pid,command,psr,pri,ni ni: nice值 pri: 优优级 psr: 运行的CPU
3、pgrep:
显示指定进程的进程号;
常用选项:
-U UID:仅显示由指定用户启动的进程; -G GID:仅显示与指定组相关的进程; -t term...:仅显示与指定终端相关的进程; -l:同时显示进程号和程序名;
4、pidof:
显示指定命令所启动的进程的ID:
#pidof COMMAND
5、top:
实时监控进程:
监控界面为交互式界面,可使用一下命令对显示内容进行控制:
M:内存百分比; P:CPU百分比; T:累积占用的CPU时间;
l:显示或不显示负载信息:
t:显示或不显示进程及CPU相关的信息:
1:数字,分别显示各CPU的相关信息:
us:user space,用户运行程序占用CPU的百分比; sy:system,用于运行内核占用CPU的百分比; ni::nice,用户进程空间所改变过优先级的进程占用CPU的百分比 id::idle,空闲CPU百分比; wa:wait io,等待I/O花费时间; hi:hardware interrupt,硬中断占用CPU的百分比; si:soft interrupt,软中断占用CPU的百分比; st:stolen,被偷走的(虚拟机)CPU百分比;
m:显示或不显示物理内存和交换内存的相关信息;
Mem:物理内存; Swap:交换分区; buffers:缓冲区,用于减少进程之间的等待时间; cached:CPU与内存之间的高速缓存,用于减少CPU的等待时间;
q:退出; k:终止指定进程; s:修改刷新时间间隔;
常用选项:
-d #:指定刷新时间间隔; -b:以批次的方式显示top的刷新; -n #:显示的批次; -p PID:监控指定进程
htop:top增强版,需要erpl源安装;
u: 交互式选择显示指定用户的进程; l: 显示光标所在进程所打开的文件列表; s: 显示光标所在进程执行的系统调用; a: 绑定进程到指定的CPU; #:快速定位光标至PID为#的进程上; F1:获取帮助;
6、vmstat:
显示虚拟内存统计信息:
procs: r: 运行队列的长度; b: 被阻塞(等待IO完成)队列的长度; memory: swpd:从物理内存交换至swap中的数据量; free:空间物理内存; buffer: cache: swap: si:swap in,数据进入swap中的数据速率,单位kb/s; so:swap out,数据离开swap中的数据速率; io: bi:block in,从块设备读入的数据速率,单位kb/s; bo:block out,保存至块设备的数据速率; system: in:interrupt,中断速率; cs:context switch,进程切换速率; cpu: us,sy,id,wa,st
常用选项:
-s:显示内存统计数据;
7、dstat:
显示系统资源统计信息:
常用选项:
-c:显示CPU统计数据; -d:显示disk统计数据; -D DISK:只显示指定disk的统计数据; -g:显示page的统计数据 -i:显示中断的统计数据 -m:显示内存的统计数据 -l:显示系统负载的统计数据 -n:显示网络接口相关 -N INTERFACE:仅显示指定的网络接口的数据 -s:显示交换内存 -p:进程队列 --ipc:显示ipc消息队列、信号量和共享内存的使用状况 -y:系统状态数据 -a:默认模式,也相当于dstat; -f:以完整格式显示所有信息; -v:相当于vmstat;
网络连接状态统计:
--tcp: --udp: --raw: --unix:
三、进程间通信:
通过信号(signal),借助于kill命令;基于kill命令向其它的进程发信号;
显示常用信号:
#kill �l:显示常用信号; #man 7 signal:查看各信号作用;
常用信号:
每个信号都可以使用三种方式之一在Kill进行调用:
数字代称:1,2,9,15
信号完整名称:SIGHUP,SIGINT,SIGKILL,SIGTERM
信号简称:HUP,INT,KILL,TERM
常用信号含义:
1)SIGHUP:让程序重读配置文件需无须重新启动;
2)SIGINT:interrupt,打断正在运行中的程序;
9)SIGKILL:
15)SIGTERM:
信号调用格式:
#kill[-SIGNAL] PID:-9=-SIGKILL #killall [-SIGNAL] COMMAND:终止所有进程;
四、作业控制:
前台作业:通过终端启动,并在终止之前一直占据着终端;
后台作业:作业启动之后即运行于后台,释放前台;
交互式模式:手动启动的非守护进程类的程序,一般都运行于前台;
1、将作业运行于后台:
运行中的作业:Ctrl+z;送往后台后,作业处于STOPPED状态
尚未启动作业:COMMAND &;
此类由手动方式控制的作业,与终端相关作业会被终止;如果把作业送往后台,且与终端无关:
#nohup COMMAND &
2、查看当前作业:
#jobs
3、作业控制命令:
#fg [[%]JOBNUM]:将指定的作业调回前台; #bg [[%]JOBNUM]:让送往后台的作业在后台继续运行; #kill %JOBNUM::终止指定的作业;
本文出自 “小马的学习记录” 博客,请务必保留此出处http://masachencer.blog.51cto.com/8683770/1671955