13.进程管理
开头说过,学习os,就是研究内核和内核上的众多进程。进程管理是内核的6大功能之一。
以mkdir
为例,创建目录需要访问磁盘,而内核才能访问磁盘。mkdir
进程在cpu上运行并通过system call
向内核发出操作磁盘的申请,然后让出cpu,同时保存现场,cpu转给内核。
这一过程其实还是由内核管理的,内核追踪每一个进程的状态信息。
内核数据结构task structure
保存了进程的很多信息,如ppid,pid,下一个该执行的进程。
进程可以分为:
- 终端相关进程
- 终端无关进程
tty 显示?
表示与终端无关。
/proc
/proc
下有很多pid命名的目录,每个目录对应一个进程。
/proc
目录下的文件是内核信息的映射,参数被映射为文件,所以是伪文件系统。例如,cat /proc/mem
会显示错误。
两个重要文件:/proc/cpuinfo
,/proc/meminfo
cat /proc/1/maps
可查看init内存信息
进程空间
80286 cpu之后,为了避免内存中一个程序覆盖另一个程序,把空间分为线性地址和物理地址,把内存分为页面。
MMU:内存管理单元,负责将页面对应到物理页框。是cpu子芯片。
每次转换后都保存到cache(联系lrlu策略)。
TLB(Translation Lookaside Buffer) 转换检测缓冲区是一个MMU,用于改进虚拟地址到物理地址转换速度的缓存。它和系统性能有关。
内核给进程找离散的页面,但进程认为是连续的页面。
学习swap时曾说过,32位系统,每个进程认为自己有4G(1G给内核)。
每个进程空间还有如下组成(由低位开始)
forbidden–只读文本(.text)–initialized data(.data)–uninitialized data(.bss)–heap–memory mapped region for shared lib–stack
[外链图片转存失败(img-VC2RnHU6-1566454615715)(http://r.photo.store.qq.com/psb?/V11kR0B91ocBaQ/vaJh8GePBSLVrwgwIb1M30iXqNOLLLMU9RMYF1LRuvs!/r/dC0BAAAAAAAA)]
进程占用空间有两种:
- Virtual Memory Size(vss):0-stack,表示虚拟内存。
- Resident Set Size(rss):表示相应进程在RAM中占用了多少内存,并不包含在SWAP中占用的虚拟内存。包括共享库占用的内存(只要共享库在内存中);
进程空闲时会进入睡眠状态,分2种:
- interruptible:与io无关,有请求则唤醒。
- uninterruptible:与io有关,外部资源没有被满足。
zombie僵尸进程:进程结束,但没有被父进程回收而释放内存。是内存泄漏的一种表现。
kill命令只能终止进程,而僵尸进程已经终止,所以不能被kill。
ps查看,状态Z+,中括号[]中的进程即僵尸进程,后面还带有。
init(pid=1)是内核生成的第一个用户级进程,是系统中所有其他用户进程的祖先进程,用来管理用户空间进程。pstree可查看。
Linux下有三个特殊的进程:idle进程(PID=0),init进程(PID=1),和kthread(PID=2)
父进程可以回收子进程的资源。
优先级
进程有优先级关系,例如,信号优先处理。
linux进程优先级0-139,越小越优先。
- 0-99:内核调整
- 100-139:用户可控;每个进程都有nice值,区间[-20,19],分别对应100-139,用来调整优先级。普通用户仅能调大nice值,管理员可以任意调整。
优先级高,则获得更多cpu运行时间,优先获得运行机会。
nice值可以用renice
命令调整。
前后台
前台作业:占据命令提示符的。
后台作业:释放命令提示符,在默默完成后续操作。
ctrl+z
挂起任务,即送往后台。
ctrl+z
后任务便暂停,bg
命令可以让后台作业继续运行。
fg
命令:调回前台
CMD &
直接后台运行
bg
和fg
可以指定作业号
bg %JOBID
,百分号用于区分pid,bg和fg不能操作进程,所以可省。如果是kill %JOBID
就不能省了。
jobs
查看后台作业,每个作业都有作业号.
+:表示bg命令的默认操作
-:第2个默认操作
IPC
- 管道及命名管道
- 消息队列
- 共享内存
- 信号量semaphore
- 信号signal
- socket
相关命令
ps,pstree,pgrep,pidof,top,vmstat,free,kill,pkill,bg,fg
ps(process state)
system v风格:选项有-
bsd风格:选项无-
ps默认只显示前台进程
stat进程状态有以下几种
R:运行或就绪
D:不可中断睡眠
S:可中断睡眠
T:停止
Z:僵死
<:高优先级
N:低优先级
+:前台进程组中的进程
l:多线程进程
s:会话进程首进程
bsd风格,常用aux
a:显示所有终端相关进程
u:显示用户
x:显示所有终端无关进程
字段TIME表示运行时长,即真正占有cpu的时长。
COMMAND表示由哪个命令启动,中括号表示内核线程。
system v风格常用-elf
-e | -A:显示所有进程
-F | -f:详细信息
-l:长格式
字段C表示cpu占比
PRI表示优先级
NI表示nice值
PSR表示运行在哪个cpu上
ps -o pid,ni #指定显示字段pid,ni
ps aux | grep "bash"
pgrep
pgrep bash仅显示pid
-U USERNAME
-u euid
表示有效用户,联系suid
pidof
pidof init
显示1
top
全屏动态显示,可用于监控系统。
top -d 1 # 一秒刷新一次
-b # 批处理,成批翻屏输出
-d 1 -b -n 3 # 显示3屏则退出
交互命令
M:根据RES排序
P:根据cpu排序
T:根据累计时间time+排序
l:是否显示平均负载和启动时间
t:是否显示进程和cpu状态
m:是否显示内存相关信息
c:是否完整的命令行CMD信息
q:退出
k:kill
字段
load average(平均负载):过去1min,5min,15min队列畅度
按1可以展开cpu,双核则显示cpu0,cpu1,默认显示平均状态。
us:用户空间
sy:内核空间
id:idle
wa:wait for i/o
hi:硬件中断占据时间
si:软中断占据时间
st:stolen time,被偷走的时间
PR:RT表示实时优先级
VIRT:虚拟内存
RES:常驻内存
SHR:共享库
S:状态
kill
kill -1
kill -SIGKILL
# 可以简写名称,即去掉"SIG":kill -KILL
kill # PID默认为15号信号
killall CMD #杀死所有同名进程,如httpd
renice
#若是已经启动的进程:
renice NI PID #(可以ps axo pid,ni,cmd查询)
#若启动时指定nice值:
nice -n NI CMD
vmstat
查看系统状态
vmstat 1
表示一秒刷新一次
vmstat 1 3
表示一秒刷新一次,显示3次
procs字段
r:运行队列长度
b:阻塞队列长度
memory字段
swpd:交换队列长度
free:空闲内存
swap字段
si:物理->交换
so:交换->物理
单位是页面
io字段
bi:硬盘->内存
bo:内存->硬盘
单位当然是block
system字段
in:中断次数
cs:上下文切换次数
cpu字段
us/sy:用户/内核空间
id:空闲
wa:等待io
st:stolen time
uptime
Tell how long the system has been running.