程序和进程
程序
保存在磁盘中的可执行文件 是静态保存的代码
进程
在CPU及内存中运行的程序指令 是动态执行的代码 父/子进程:进程可以创建一个或多个子进程
进程的分类:
跟终端相关的进程
跟终端无关的进程
进程的状态:
1、Stopped 2、Ready 3、Executing 4、Uninterruptible 5、Interruptible 6、Zombie:正常运行了,也结束,但是内存空间无法释放 Uninterruptible sleep: 不可中断的睡眠 Interruptible sleep:可中断睡眠:
进程是由父子关系的,而且有优先级的
进程的优先级:数值越小,优先级越高
100-139:用户可控制 0-99:内核调整的
在计算机的程序设计上,衡量一个程序或算法,面对不同程度的队列时,它的性能如何取决于大O标准
O(1):无论队列是多少,无论x取值多大,y值都是一样;一般而言,不可能有负值 O(n):所需要的时间长度,随着队列的成长,而线性生长 O(logn) O(n^2) O(2^n)
一个进程的优先级越高,将意味着:
1、获得更多的CPU运行时间 2、更优先获得CPU运行的机会
每一个进程都有一个nice值,范围在-20~19,
分别对应于进程优先级的100~139 默认情况下,每个进程的nice值为0 普通用户进程能够调大自己的进程的Nice值
调整nice值:
调整已经启动的进程的nice值:
renice NI PID
在启动时指定nice值:
nice -n NI COMMAND
调度优先级
1.调度优先级决定如何访问CPU 2.优先级被nice值影响 3.nice值的范围:-20--19,默认为0;数值越小,优先级越高
改变调度优先级
1.当开始一个进程前:nice -n 5 command 2.开始进程后:renice 5 PID
只有root才能减少nice值
在/proc目录下,每一个进程都有一个与进程号码对应的目录,
这个目录保存了进程的所有相关属性信息
每一个进程的号码都是唯一
init: 进程号为1
交互式进程管理工具
命令行:top
图形:gnome-system-monitor
ps查看进程
ps 显示某一时刻进程状态信息,静态,以PID排序
ps:Processes Snapshot
默认显示终端的进程
语法:
ps [选项]
常用命令选项:
a:显示当前终端下的所有进程 u:使用以用户为主的格式输出信息 x:显示当前用户在所有终端下的进程 -e:显示系统内所有的进程 -l:使用长格式输出信息 -f:以最完整的的格式输出信息
例子:
ps aux 列出正在运行的所有进程
PID:进程ID %CPU:CPU使用率 %MEM:内存使用率 VSZ:程序在运行时要用到的虚拟内存 RSS:真实内存的大小 TTY:如果出现?,则说明此进程不属于任何终端,是在进入终端前就已经运行的进程 STAT:S表示睡眠 START TIME:持续的时间 COMMAND:由哪个指令产生的进程
常见的STAT状态指示
R:正在运行或就绪 S:处于休眠状态,在需要时可唤醒 D:不可中断的休眠,通常为等待I/O的情况 T:停止状态,被挂起或跟踪的情况 Z:僵尸状态,进程已终止但内存无法释放
ps -elf操作
以长格式显示系统中所有的进程信息
PPID:父进程的PID号
PRI/NI:进程优先级,数值越小优先级越高
F:权限标记,4对应root、1表示仅复制无执行权限
ps的风格分为:
SysV风格:-
BSD风格
BSD风格:
a: 所有与终端有关的进程
u:显示进程是由哪个用户启动的
x: 所有与终端无关的进程
BSD风格中:
<:高优先级进程 N: 低优先级进程 +:前台进程组中的进程 l: 多线程进程 s: 会话进程首进程
SySV风格
-elF -ef -eF
ps -o PROPERTY1,PROPERTY2 //显示指定的属性/字段
ps -o pid,comm,ni
top动态查看进程
top交互式工具
格式:top [-d 刷新秒数] [-U 用户名] #top -d 5 //每5秒刷新一次
top交互操作的按键指令:
?:查看帮助(列出可用的按键指令) P、M:根据 %CPU、%MEM 降序排列 T:根据进程消耗的 TIME 降序排列 k、r:杀死指定的进程、重设进程优先级 q:退出 top 程序
top:
M: 根据驻留内存大小进行降序排列
P:根据CPU使用百分比进行降序排列
T: 根据累计时间进行排序
?:查看帮助(列出可用的按键指令)
l: 是否显示平均负载和启动时间
t: 是否显示进程和CPU状态相关信息
m: 是否显示内存相关信息
c: 是否显示完整的命令行信息
q: 退出top
k: 终止某个进程
r:重设进程优先级
top:
-d: 指定延迟时长,单位是秒 -b: 批模式 //一屏一屏的显示 -n #:在批模式下,共显示多少批 //显示的屏数
pgrep 检索进程信息-根据特定条件
语法:
格式pgrep [选项] 查询条件
选项:
-l PID连同进程名一起输出
-U 检索指定用户的进程
-t 检索指定终端的进程
例子:
2、查询名称含“log”的进程信息 #pgrep -l “log” 2、列出用户zhangsan在tty1终端开启的进程 #pgrep -l -U zhangsan -t tty1
pstree 树状结构
语法:
格式:pstree [选项] [PID或用户名]
选项:
-a 显示完整命令行 -u 列出各进程所属的用户名 -p 列出对应的PID号
例子:
查看从init开始的整个进程树 -显示用户名、PID、完整命令行 #pstree -aup 4、查看指定PID的进程树 #pstree 17928 2、查看指定用户的进程树 #pstree -p zengye
pidof: 根据程序名称,查找其相关进程的ID号;
进程的前后台调度
前台启动
输入正常的命令行
运行期间占用当前终端
后台启动
在命令行末尾添加“&”符号
运行期间不占用当前终端
前台作业:占据了命令提示符
后台作业:启动之后,释放命令提示符,后续的操作在后台完成
前台-->后台:
Ctrl+z: 把正在前台的作业送往后台 COMMAND &:让命令在后台执行
bg:让后台的停止作业继续运行
bg 编号 让程序在后台运行
bg [[%]JOBID]
jobs: 查看后台的所有作业
作业号,不同于进程号 +:命令将默认操作的作业 -:命令将第二个默认操作的作业
fg: 将后台的作业调回前台
fg 编号 把后台进程调到前台 fg [[%]JOBID] //百分号是默认的,
总结:
& 放入后台运行,运行在内存中的进程 ctrl +z 将当前的作业放入后台并暂停运行 jobs 查看后台进程列表 fg 编号 把后台进程调到前台 bg 编号 让程序在后台运行
其他:
%number:使用作业号引用后台作业 %string:使用给定的字符串作为命令行起始字符串引用作业 &?string:引用命令行含有给定字符串的作业 %%:引用当前作业 %+:等价于%%,表示当前作业 %-:引用前一个作业
终止进程
进程间通信(IPC: Inter Process Communication)
方法:
共享内存
信号: Signal
Semaphore:发出信号,打旗语
重要的信号:
1:SIGHUP: 让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效; 2: SIGINT:Ctrl+c: 中断一个进程 9: SIGKILL:杀死一个进程 15: SIGTERM:终止一个进程, 默认信号
Kill -l:显示所有的信号
kill通常向另一个进程发信号
指定一个信号:
信号号码:kill -1 信号名称:kill -SIGKILL 信号名称简写:kill -KILL //省略SIG
信号:
Signals--信号 Signal 15,TERM:正常地结束某个程序,默认 Signal 9, KILL:强制结束,立即终止 Signal 1, HUP:重读配置文件 man 7 signa
发送信号到进程
1.通过PID:kill [signal] pid ...#如果不加任何signal,默认15 2.通过名字:killall [signal] comm ... 3.通过pattern:pkill [-signal] pattern #pattern等同于PID和name
终止进程
kill PID
killall COMMAND(进程名)
killall跟k指定信号的方法一样
kill %JOBID: 终止某作业
pkill命令
杀死符合指定条件的进程
用法与pgrep类似
总结:
ctrl +c 终止当前正在运行的进程 kill -9 [PID] 强制杀掉单个进程 killall 进程名 //杀死该进程名下的所有进程 pkill 进程名 //杀死该进程名下的所有进程