2

博文参考

http://www.178linux.com/48784
http://share.zhbor.com/article/20278.html

clipboard.png

进程管理

init 父进程  新建或结束子进程
顺序
循环
选择   
进程=数据+指令

linux 单内核 进程之间可以共享库 但两个进程同时打开一个文件 在内存是不可以共享的 每个进程都要打开一次 可以有多线程 一个父进程生成一个大线程的内存空间 在线程里在生成n个线程之间可以共享
模式转换 用户进程需要系统操作指令 内核在其切换 内核靠时钟驱动

进程概述

进程

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作
模式切换(理想状态):70%CPU时间用户模式+30%CPU时间内核模式
进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的存在生命周期的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体,运行中的程序的一个副本;被载入到内存的一个指令集合
进程ID:PID号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承
Linux内核存储进程信息的固定数据结构格式:task struct
多个任务的task struck组件的链表:task list

进程内存

Page Frame(页框):用存储页面数据,存储Page 4k
物理地址空间和线性地址空间
物理地址空间:真实内存空间
线性地址空间:进程虚拟占据全部真实内存空间,而实际是用多少内核给分配多少LRU:Least Recently Used 近期最少使用算法,释放内存
MMU:Memory Management Unit(内存管理单元)负责转换线性和物理地址
常驻内存集:不可被交换的内存空间
虚拟内存集:可以被交换的内存空间

进程间通信机制

IPC: Inter Process Communication
同一主机上
signal(信号)
shm: shared memory(分享内存)
semophore:信号量,一种计数器
不同主机上
rpc: remote procedure call(远程过程调用)
socket(套接字): IP和端口号

进程创建

引起创建进程的事件

在多道程序环境中,只有(作为)进程(时)才能在系统中运行。因此,为使程序能运行,就必须为它创建进程。导致一个进程去创建另一个进程的典型事件,可以有以下四类:
1) 用户登录
在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入到就绪队列中。
2)作业调度
在批处理系统中,当作业调度程序按照一定的算法调度到某作业时,便将该作业装入到内存,为它分配必要的资源,并立即为它创建进程,再插入到就绪队列中。
3) 提供服务
当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,例如,用户程序要求进行文件打印,操作系统将为它创建一个打印进程,这样,不仅可以使打印进程与该用户进程并发执行,而且还便于计算出为完成打印任务所花费的时间。
4) 应用请求
在上述三种情况中,都是由系统内核为它创建一个新进程,而这一类事件则是基于应用进程的需求,由它创建一个新的进程,以便使新进程以并发的运行方式完成特定任务。

进程的创建过程

一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语create()按下述步骤创建一个新进程。
1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
2) 为新进程分配资源。为新进程的程序和数据以及用户栈分配必要的内存空间。显然,此时操作系统必须知道新进程所需要的内存大小。
3) 初始化进程控制块。PCB的初始化包括:
①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。
②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。

进程终止

1.引起进程终止的事件
1)正常结束
在任何计算机系统中,都应该有一个表示进程已经运行完成的指示。例如,在批处理系统中,通常在程序的最后安排一条Hold指令或终止的系统调用。当程序运行到Hold指令时,将产生一个中断,去通知OS本进程已经完成。
2)异常结束
在进程运行期间,由于出现某些错误和故障而迫使进程终止。这类异常事件很多,常见的有:越界错误,保护错,非法指令,特权指令错,运行超时,等待超时,算术运算错,I/O故障。
3)外界干预
外界干预并非指在本进程运行中出现了异常事件,而是指进程应外界的请求而终止运行。这些干预有:操作员或操作系统干预,父进程请求,父进程终止。

init:系统的第一个进程

进程:进程之间为父子关系都有其父进程创建(CoW写时复制)
1、系统父进程以fork()方式产生一个一模一样的子进程,这个进程与父进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别码PID
2、然后复制clone()出来的子进程再来运行实际要执行的程序

进程优先

    内核管理: 依据   算法+数据结构
    1)进程调度
    2)优先级
    
系统优先级: 数字越小,优先级越高
0-139( CentOS4,5)
各有140个运行队列和过期队列
0-98, 99( CentOS6)
实时优先级: 99-0:值最大优先级最高
静态优先级:100-139
nice值: -20到19,对应系统优先级100-139或99

clipboard.png
clipboard.png

Big O:时间复杂度,用时和规模的关系
O(1):规模变化但是,耗费时间恒定
O(logn):
O(n)线性:
O(n^2)抛物线:
O(2^n):耗费时间随着规模变大急剧变大

进程状态

Linux内核:抢占式多任务工作模式

进程类型:

1)守护进程(服务): daemon,由内核在系统引导过程中启动的进程, 和终端无关进程
2)前台进程:跟终端相关,通过终端启动的进程(用户进程)
注意:两者可相互转化
进程状态:
运行态: running
就绪态: ready(可以运行但是没运行)
睡眠态:
1)可中断: interruptable
2)不可中断: uninterruptable
数据从磁盘——>内核内存——>进程内存——>进程处理数据
第一阶段为数据装入
第二阶段为数据I/O
停止态: stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态: zombie,结束进程,父进程结束前,子进程不关闭

系统管理工具

根据进程占用资源的多少可以讲进程分为(进程的分类):
CPU-Bound: CPU密集型(对CPU密集型是对cpu占用率高的进程),非交互
IO-Bound: IO密集型(等待I/O时间长的进程),交互

推荐书籍:《Linux内核设计于实现》、《深入理解Linux内核》

Linux系统状态的查看及管理工具: pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

init分类

CentOS5:SysV init
CentOS6:upstart
CentOS7:Systemd

Linux终端类型

控制台:/dev/console
物理终端:
虚拟终端:/dev/tty[1-6]
模拟终端:/dev/pts/#
串行终端:/dev/ttyS#
进程分类
批量处理进程
交互式进程
实时进程

进程管理管理命令

ps, pstree, pidof, pgrep, top, htop, pmap, vmstat, dstat, nice, renice, kill, jobs, killall, fg, bg, nohup。 

pstree

-a  显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c  不使用精简标示法。
-G  使用VT100终端机的列绘图字符。
-h  列出树状图时,特别标明执行的程序。
-H<程序识别码>  此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l  采用长列格式显示树状图。
-n  用程序识别码排序。预设是以程序名称来排序。
-p  显示程序识别码。
-u  显示用户名称。
-U  使用UTF-8列绘图字符。
-V  显示版本信息。

ps

与终端相关进程:a
与终端无关进程:x
R
S
D
T
Z
s
+
1
N
<
u
-e:显示所有进程
-f:显示完整格式列表
-F:显示额外信息
-H:显示进程的层次信息

常用组合

ps aux
ps -ef
ps -eFH
自定义显示信息:-o
ps axo pid,command
[root@mm ~]#ps axo pid,ni
rtprio:实时优先级
ni:nice值
pri:优先级
psr:运行的cpu

clipboard.png

UID/PID/PPID:进程发起者/进程号/父进程号
C:显示cpu利用率 单位:百分比 实验:dd if=/dev/zero of=/dev/null &
STIME:进程的启动时间,指从什么时候启动的进程
TTY:登录者的终端位置,远程登录pts/n,本地登陆ttyn,?系统进程
TIME:进程实际花费cpu运行时间,不是系统时间
CMD:command的缩写,触发此进程的命令

clipboard.png

USER:进程的发起者
PID:进程号
%CPU:进程使用掉的cpu资源百分比
%MEM:进程所占用物理内存百分比
VSZ:进程使用掉的虚拟内存大小,单位kb
RSS:进程占用的固定内存大小,单位kb
TTY:进程在那个终端运行
STAT:进程目前的状态
START:进程被触发的时间
TIME:进程实际使用cpu的时间
COMMAND:触发此进程的命令

进程管理状态

R 运行态:running
就绪态:ready
睡眠态:sleeping
S 可中断睡眠:interruptible
D 不可中断睡眠:uninterruptible
T 停止态:stopped
Z 僵死态:zombie
s:session leader 有子进程
+:前台进程
l:多线程进程
N:低优先级进程
<: 高优先级进程                   

pgrep

-U:用户进程PID
-G:
-u uid:显示生效用户的进程
-U uid:显示用户启动的进程
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名
-p pid:显示进程对应的子进程

pidof

pidof PROGRAM(程序 指令)
显示指定命令启动的进程ID
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。

top

M:内存占用百分比大小排序
P:cpu占用百分比大小排序,默认
T:累计占有时长排序
l:是否显示负载信息
t:是否显示cpu和进程的统计信息
m:是否显示内存和交互分区的信息
q:退出
k:kill,杀掉进程
s:改变top刷新频率
-d #:指定刷新时间间隔
-n #:指定刷新次数
-b:以批次显示top刷新
[root@mm ~]#top -b -n 3

clipboard.png

第一行:
当前的系统时间
系统启动到现在所经过的时间
当前已经登录的系统用户数
系统在1,5,15分钟的平均负载,值越小表示系统越空闲,高于1注意系统负载过高。
第二行:
显示进程总量与进程运行的状态(zombie不为0检查那个进程处于僵死态。干掉)
第三行:
显示cpu整体负载,多核cpu可以按1切换不同的cpu
us:用户运行程序占用cpu百分比
sy:运行内核占用cpu百分比
ni:用户进程空间所改变过优先级的进程占用cpu百分比
id:空闲cpu百分比
wa:等待I/O花费时间
hi:硬键中断占用cpu百分比
si:软键中断占用cpu百分比
st:被虚拟机“偷走”的百分比
第四行:
物理内存使用情况
第五行:
交换分区使用情况
第六行:
默认空白行可以输入命令如下:
P:按占据的cpu百分比大小排序
M:按占据Memory(内存)空间大小排序
T:cpu累积占用时间排序
l:是否显示系统负载
t:是否显示进程摘要与cpu负载信息
1:平均或单独显示cpu的负载状态
m:是否显示内存相关的状态信息
s:修改延时时长
k:终止进程
q:退出
后面部分:
PID:每个进程id
USER:进程所属的使用者
PR:进程优先级

htop

命令行选项:

-d #–delay=DELAY     设置延迟更新时间,单位秒
-u –user=USERNAME   只显示一个给定的用户的进程
-s –sort-key COLUME: 以指定字段进行排序;
-C –no-color        使用一个单色的配色方案
-p –pid=PID,PID…    只显示给定的PIDs
u:选择指定用户的进程
l:显示进程打开的文件列表
s:显示进程执行的系统调用
a:绑定进程到指定的cpu上
#:快速将光标定位之指定的PID进程上    

clipboard.png

htop界面子命令:
交互式命令(INTERACTIVE COMMANDS)

上下键或PgUP, PgDn 选定想要的进程,左右键或Home, End 移动字段,当然也可以直接用鼠标选定进程;
Space 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程
U 取消标记所有进程
s 选择某一进程,按s:用strace追踪进程的系统调用
l 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
I 倒转排序顺序,如果排序是正序的,则反转成倒序的,反之亦然
a (在有多处理器的机器上)设置 CPU affinity: 标记一个进程允许使用哪些CPU
u 显示特定用户进程
M 按Memory 使用排序
P 按CPU 使用排序
T 按Time+ 使用排序
F 跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。这对监视一个进程非常有用:通过这种方式,你可以让一个进程在屏幕上一直可见。使用方向键会停止该功能。
K 显示/隐藏内核线程
H 显示/隐藏用户线程
Ctrl-L 刷新
Numbers PID 查找: 输入PID,光标将移动到相应的进程上

vmstat

[root@mm ~]#vmstat -s 显示内存统计数据
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态; 
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。

clipboard.png

procs
r:运行或等待cpu时间片的进程的个数
b:被阻塞(通常为等待I/O完成)的进程的长度
memory
swpd:从物理内存交互至swap中的数据量
free:未使用的内存大小
buffer:buffer空间大小,通常与缓存写操作相关
cache:cache空间大小,通常与缓存读操作相关
swap
si:swap in 数据进入swap中的数据量,通常是速率。kb/s
so:swap out 数据离开swap中的数据量,通常是速率。kb/s
io:
bi:block in:从块设备读入的数据量,通常是速率,kb/s
bo:block out:保存至块设备中的数据量,通常是速率,kb/s

in:中断发生频率。每秒的中断数
cs:context switch 上下文切换,进程切换,通常是速率,kb/s
cpu:
us:用户空间的使用率
sy:内核空间的使用率
id:空闲
wa:等待的
st:被偷走的

dstat

标准使用格式:
dstat [-afv] [options..] [delay [count]]

直接使用dstat,默认使用的是-cdngy参数,分别显示cpu、disk、net、page、system信息,默认是1s显示一条信息。可以在最后指定显示一条信息的时间间隔,如dstat 5是没5s显示一条,dstat 5 10表示没5s显示一条,一共显示10条。

选项:

-c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。
-C 0,3,total:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息。
-d,–disk:显示磁盘读写数据大小。
-D total,hda:统计指定磁盘或汇总信息
-g:显示页面使用情况。
-i, –int 显示中断统计
-I 5,10 统计系统负载情况,包括1分钟、5分钟、15分钟平均值
-l, –load 显示系统负载情况。
-m –mem:显示内存使用情况。
-n –net:显示网络状态。
-N eth1,total:有多块网卡时,指定要显示的网卡。
-p:显示进程状态。
-r:I/O请求情况。
-s:显示交换分区使用情况。
-S:类似D/N。
-t, –time:显示统计时时间,对分析历史数据非常有用
-T,–epoch:启用时间计时器(秒)
-y, –sys:统计系统信息,包括中断、上下文切换
–tcp:统计tcp信息
–udp:统计udp信息
–unix:统计unix信息
–raw:统计raw信息
–socket:用来显示tcp udp端口状态。
–ipc:报告IPC消息队列和信号量的使用情况
–top-cpu:显示最占用CPU的进程
–top-io: 显示最占用io的进程
–top-mem: 显示最占用内存的进程
–top-latency: 显示延迟最大的进程

通过dstat –list可以查看dstat能使用的所有参数,其中上面internal是dstat本身自带的一些监控参数,下面/usr/share/dstat中是dstat的插件,这些插件可以扩展dstat的功能,如可以监控电源(battery)、mysql等。

kill

向进程发送控制信号,以实现对进程管理
kill 命令:发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程
标准使用格式:
kill [-s signal|-p] [-q sigval] [-a] [–] pid…
kill -l [signal]

选项:

-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。

clipboard.png

常用信号: man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
9) SIGKILL: 杀死正在运行的进程
15) SIGTERM:终止正在运行的进程
18) SIGCONT:继续运行
19) SIGSTOP:后台休眠
指定信号的方法:
(1) 信号的数字标识; 例如:1, 2, 9
(2) 信号完整名称; 例如:SIGHUP
(3) 信号的简写名称; 例如:HUP

只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

clipboard.png
图片.png
killall

killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。
killall(选项)(参数)

选项:

-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。

作业管理

作业控制

Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业: Ctrl+z
注意:送往后台后,作业会转为停止态;
(2) 尚未启动的作业: # COMMAND &
注意:后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系,可以运行以下命令
# nohup COMMAND &
#screen;COMMAND

作业查看

jobs

可实现作业控制的常用命令:
# fg [[%]JOB_NUM]:把指定的后台作业调回前台;
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;
# kill [%JOB_NUM]:终止指定的作业;

clipboard.png

并行提高效率

同时运行多个进程,提高效率
编写脚本
例如:
vi all.sh
f1.sh&
f2.sh&
f3.sh&
或
(f1.sh&);(f2.sh&);(f3.sh&)
或
{ f1.sh& f2.sh& f3.sh& }

进程优先级

进程优先级调整:
静态优先级: 100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)

nice

nice命令以指定的优先级运行命令,这会影响相应进程的调度。
如果不指定命令,程序会显示当前的优先级。优先级的范围是从 -20(最大优先级) 到 19 (最小优先级)。
使用格式:
nice [OPTION] [COMMAND [ARG]…]
选项:
-n, –adjustment=N 对优先级数值加上指定整数N (默认为10)

示例:

clipboard.png

renice

renice命令可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
renice [-n] priority [[-p] pid …] [[-g] pgrp …] [[-u]user …]
参  数:
-n, –adjustment=N 对优先级数值加上指定整数N (默认为10)
-g <程序群组名称>:使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p <程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u <用户名称>:指定用户名称,修改所有隶属于该用户的程序的优先权。

查看Nice值和优先级:
#ps axo pid,comm,ni,priorlty

达龙
250 声望19 粉丝

天才是重复次数最多的人!