一 进程、线程、程序概念
1、进程(Process)
什么是进程,简单的说,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的。
2、线程(Thread)
一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上运行,必须得分成互不影响的多个执行流,而后每组单独在各自所分配的CPU上运行,这种分化后的执行流且有着比进程更小资源分配单位称之为线程。线程之间可以共享内存空间,当一个文件需要被打开多次时,线程模型可以节省很大的内存空间,但是得避免因资源征用造成死锁问题。并且线程在运行过程当中,如果某一个线程崩溃或是出现意外情况,会影响同个进程内其它线程,比单进程模型稳定性差。
3、程序(Program)
程序由指令和数据组成。
程序是为了达到特定的目的,可以被计算机运行并且由命令代码组成的语句序列。
程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(Executable Image)中,所以,程序是一个静态的实体。
二 进程相关知识
1.虚拟地址空间
在内存中,每个程序的运行都是孤立的,每个程序只知道当前内存空间只运行了自己和内核,而看不到其它的进程。
2.内核模式与用户模式
以32bit系统为例,Linux的虚拟地址空间为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。
3.进程的状态:
运行态:runnnig
睡眠态:sleeping
可中断睡眠:interruptable,随时来请求,随时能唤醒,比如处理完当前请求后暂时还没有更多请求下,这种sleep就是可 中断
不可中断睡眠:uninterruptable,等待外部条件满足之前无法继续运行。
停止态:stopped,不会再被内核调度并运行。
僵死态:zombie,父进程先于子进程结束了,子进程再也不能被停掉的进程。
4.进程的优先级
CPU挑选进程是根据进程的优先级进行的,进程优先级的取值范围为0-139。
实时优先级:0-99,数字越大,优先级越高;(内核控制)
静态优先级:100-139,数字越小,优先级越高。(用户可控制的优先级)
用户可以通过调整nice值来改变进程的优先级。
nice值:-20-19 调整静态优先级
进程启动时,默认nice值为0,优先级对应为120。
动态优先级:由内核维护,动态调整。
Linux使用抢占式多任务:当时钟信号到达时,高优先级进程可以抢占CPU。
5.进程间通信方式(IPC: Inter Process Communication)
同一主机:
singnal:信号。
shm:共享内存。
semerphor:旗语。
不同主机:
rpc:remote procedure calling,远程过程调用。
socket:IP:port,套接字。
6.进程的分类:
CPU-Bound(CPU密集型):对于CPU占用率高的进程。
I/O-Bound(I/O密集型):等待I/O时间长的进程
7.子进程
进程运行是单线运行的,进程中的指令必须顺序执行。
子进程:父进程有无法完成的任务时,启用子进程来执行,此时父进程进入睡眠,子进程执行完成后,返回父进程继续执行。
进程创建机制:每一个进程都是由其父进程fork()自身而来。
8.线程
线程是比进程更小的可以被单独调度的单位。
线程将进程的任务指令拆分,分配到不同的CPU上同时运行。
不过Linux中的进程都是轻量级进程,已经相当于线程的级别了。
三 进程管理相关命令
1.pstree # 显示进程树
pstree -p
2.ps:process state,查看当前进程状态
备注:实际上是查看/proc/ *目录下内核中的状态信息
SYNOPSIS
ps [options]
a:显示所有与终端有关的进程
x:显示所有与终端无关的进程
u:显示运行进程的用户
-e:显示所有进程
-f:显示完整格式的进程信息
o field1, field2,…:自定义要显示的字段列表,以逗号分隔
常用组合:aux、ef、axo
ps -aux
USER:运行该进程的用户
PID:进程的ID号码
%CPU:CPU的占用百分比
%MEM:内存空间占用比率,占用整个内存空间的比例
VSZ:虚拟内存集;占用的虚拟内存大小,真正用来占用的内存
每个内存占用的内存有两种:线性内存空间、物理内存空间
线性内存:会映射到物理内存,在线性内存空间角度看是连续的内存占用
物理内存:实际上是以内存页框保存,可能一个进程占用的不连续的页框
RSS:ResidentSize,常驻内存集,当前进程常驻内存的大小,即不能被交换出去的空间大小
TTY:运行终端
STAT:当前进程的运行状态,BSD样式
R:running,运行态
S:interruptable sleeping,可中断睡眠
D:uninterruptable sleeping,不可中断睡眠
T:Stopped,停止状态
Z:zombie,僵死状态,进程结束后,在被回收之前状态
+:表示一个前台进程,占据命令提示符
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader ,回话主导进程,如shell,其主导其下的进程
START:进程开始时间
TIME:累计运行CPU时间
COMMAND:使用进程、线程
ps -ef
UID:启动进程用户
PID:运行进程号
PPID:父进程的进程号,0在内核启动init之前存在,init启动后终止,存在过渡,一般为swap的进程
C:cpu utilization,CPU的占用百分比
STIME:启动时间
TTY:与其终端相关
TIME:累计运行CPU时间
CMD:启动此进程的命令
ps axo 显示自定义字段列表
o field1, field2,…:自定义要显示的字段列表,以逗号分隔,o要写在后面,因为要带参数
常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:priority,优先级;
rtprio:realtime priority,实时优先级;
3.pgrep,pkill:基于进程名字或者其他属性对相关进程发起查询、发送信号
SYNOPSIS
pgrep [options] [pattern]
-o:仅显示找到的最小(起始)进程号
-n:仅显示找到的最大(结束)进程号
-l:显示进程名称
-P:指定父进程号
-g:指定进程组
-t:指定开启进程的终端
-u:指定进程的有效用户ID
4.pidof:根据进程名获取取其pid;
SYNOPSIS
pidof [-s] [-c] [-x] [-o omitpid] [-o omitpid..] program [program..]
-s:仅显示一个
5.top:- display Linuxprocesses,动态显示进程信息
SYNOPSIS
top [OPTION]
(1)选项:
-d #:指定刷新时间间隔,默认为3秒;
-b:以批次方式显示;
-n #:显示多少批次;
(2)在top显示过程中通过交互式命令指定排序(默认CPU):
P:以占据CPU百分比排序;
M:以占据内存百分比排序;
T:累积占用CPU时间排序;
(3)首部信息关闭
uptime信息:l命令
tasks及cpu信息:t命令
内存信息:m命令
(4)退出命令:q
(5)修改刷新时间间隔:s
(6)终止指定的进程:k
top
这一行的内容表示:
23:11:04:当前系统时间;
up 1:00:服务器连续运行的时长为1小时;
2 users:当前登录系统的用户数;
load average:过去1分钟、5分钟、15分钟的平均负载
1:数字,分别显示各CPU的相关信息;
使用数字1可以查看不同的CPU的信息,下面说明各字段具体的含义:
us:user space,用户运行程序时间百分比;
sy:system,用于运行内核所占用CPU的百分比;
ni:nice,用户进程空间内改变过优先级的进程占用CPU百分比;
id:idle,空闲CPU百分比;
wa:wait io,等待IO花费的时间;
hi:hardware interrupt,硬中断占用CPU的百分比;
si:software interrupt,软中断占用CPU的百分比;
st:stolen,偷走的时间百分比。
各字段含义如下:
Mem:物理内存;
Swap:交换分区;
buffers:缓冲区,用于减少进程之间的等待时间;
cache:CPU与内存之间的高速缓存,用于减少CPU的等时间。
top -p 1727
6.uptime命令:显示系统时间、运行时长及平均负载
去1分钟、5分钟和15分钟的平均负载;等待运行的进程队列的长度;
7.htop命令
这个工具默认没有安装 需要第三方源才可以安装
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install htop
(1)选项:
-d#:指定延迟时间间隔;
-uUserName:仅显示指定用户的进程;
-sCOLUME:以指定字段进行排序;
(2)子命令:
l:显示选定的进程打开的文件列表;
s:跟踪选定的进程的系统调用;
t:以层级关系显示各进程状态;
a:将选定的进程绑定至某指定的CPU核心;
(3) 显示叙述
左上方数据:表示每颗CPU、内存、交换内存的使用率
右上方数据:
Tasks当前的任务数量,用户空间进程
thr:线程数量
running:运行的数量
Load average :过去一分钟、五分钟、十五分钟的平均负载
8.vmstat命令 # 显示虚拟内存统计信息
vmstat
procs:
r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;
b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;
memory:
swpd:交换内存使用总量;
free:空闲的物理内存总量;
buffer:缓冲,与写相关,加速写操作;
cache:缓存,与读相关,加速读操作。
swap
si:数据进入swap中的数据速率(kb/s)
so:数据离开swap的速率(kb/s)
io
bi:从块设备读入数据到系统的速度(kb/s)
bo:保存数据至块设备的速率(kb/s)
system
in:interrupts,中断速率;
cs:contextswitch, 上下文 切换的速率;
cpu
us:user space
sy:system
id:idle
wa:wait
st:stolen
9.dstat命令 #系统资源统计工具
SYNOPSIS
dstat [-afv][options..] [delay [count]]
常用选项:
-c,–cpu:显示cpu相关信息;
-C #,#,…,total 显示第几颗CPU,total总共的
-d,–disk:显示磁盘的相关信息
-D sda,sdb,…,tobal 指明具体的磁盘信息
-g:显示page相关的速率数据;
-m:Memory的相关统计数据
-n:Interface的相关统计数据;
-p:显示process的相关统计数据;
-r:显示io请求的相关的统计数据;
-s:显示swapped的相关统计数据;
–tcp、–udp、–raw 、–socket 网络连接相关
–ipc 进程相关
–top-cpu:显示最占用CPU的进程;
–top-io:最占用io的进程;
–top-mem:最占用内存的进程;
–top-lantency:延迟最大的进程;
dstat
10.kill命令:
kill [-s signal|-SIGNAL] pid… 向进程发信号
kill -l [signal]:显示当前系统可用信号:
常用信号:
1) SIGHUP: 无须关闭进程而让其重读配置文件;
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c;
9) SIGKILL: 杀死正在运行的进程;
15) SIGTERM:终止正在运行的进程;
18) SIGCONT:继续
19) SIGSTOP:停止,将进程送后台,停止状态
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
11.killall
killall [-SIGNAL] program 对所有与program相关的进程发信号
四 系统作业控制命令
1.系统作业job
(1)job种类:
前台作业(foregroud):通过终端启动,且启动后会一直占据终端;
后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端);
(2)让作业运行于后台
1) 运行中的作业:Ctrl+z
送往后台后,作业会转为停止态;相当于发送kill -19 信号
2) 尚未启动的作业: # COMMAND &
此类作业虽然被送往后台,但其依然与终端相关;如果希望把送往后台的作业剥离与终端的关系:
# nohup COMMAND &
(3)查看所有的作业:#jobs命令
+/- 表示优先级;当调用时不加作业号会默认调用+的命令
(4)可实现作业控制的常用命令:
#fg [[%]JOB_NUM]:把指定的作业调回前台;
#bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;
#kill %JOB_NUM:终止指定的作业;
2.调整进程优先级:
可通过nice值调整的优先级范围:100-139;分别对应于:-20, 19。进程启动时,其nice值默认为0,其优先级是120;
注意:仅管理员可调低nice值;
(1)nice命令:
以指定的nice值启动并运行命令:# nice [OPTION] [COMMAND [ARGU]…]
选项:-nNICE
nice -n -5 echo "hello world"
(2)renice命令:
#renice [-n] NICE PID…
renice -10 1589
(3)查看Nice值和优先级:ps axo pid, ni, priority, comm
ps axo pid,ni,command | grep "bash"
原创文章,作者:liangkai,如若转载,请注明出处:http://www.178linux.com/11493