1. 进程相关概念
a. 应用程序被用户提请给内核,并得以执行便变成了进程,进程只是被调入内存的应用程序的一个副本。
b. 进程都具有统一的数据结构称为task struct用于存储进程的元数据信息,如进程的名称、PID、优先级等,也就是ps 命令看到的那些进程属性字段,应用程序被提请给内核变为进程后,该应用程序对应进程的父进程就会复制一份自己的task struct,给
2. 进程内存管理
a. CPU中指令分为普通指令和特权指令,用户空间的应用进程就都可以执行普通指令,特权指令只能被内核执行
b. 用户空间
c. 内核空间
3. 进程优先级
Ø 对于进程数量来说CPU计算资源是有限的,如果没有一套有效的资源分配机制进程就会出现争抢资源的现象,为了确保进程高效稳定有序的运行,操作系统设计了140个队列并将进程分别放入这140个队列之间,通通调度策略为队列中的进程分配CPU资源,使得所有进程能够按系统规定的制度有序运行。这里的资源分配机制有两个重要的术语:队列和调度策略
Ø 进程优先级 :Linux操作系统为提供了140个队列来调度进程使用CPU资源,队列就是我们常说的进程优先级,进程优先级的取值范围是0-139,值越小优先级越高,优先级按取值范围还分为实时优先级和非实时优先级
Ø 进程优先级调整 :
ü 严格来讲优先级对用户来说是不可以修改的,用户只能通过nice值来干预静态优先级
ü 实时优先级:能过内核动太调整也称为动态优先级,取值范围0-99,用户不可以过通nice值调整,但可以通过其它命令调整。
ü 非实时优先级:用户可以过程nice值来干预非实时优先级也称为静态优先级,取值范围100-139。
ü nice值:nice值的取值范围是:-20到19,分别对应非实时优先级的100-139,因此nice越小优先级越高。仅管理员可以调低nice值,普通用户不能调低nice值。
□ 调整原理:一个进程启动默认nice值为0,对应优先级为120,调整后的优先级=当前优先级+nice值,因此用户以指定nice值启动进程就可以达到调整优先级的效果。
□ nice进程具备继承性,子进程继承父进程
ü 调整优先级:
ü nice以指定nice值启动进程:nice -n -5 ping 192.168.39.2
ü renice修改已运行进程的优先级:renice -n -5 `pidof ping`
Ø 调度策略:操作系统如何为队列内的进程分配CPU资源,操作系统提供了5种调度策略来管理队列内的进程,通过命令chrt可以查看和修改每个进程进的调度策略
ü 实时进程调度策略:SCHED_FIFO(先进先出调度算法)、SCHED_RR(默认策略,以时间片轮询调度,一个时间片为100ms)
ü 非实时进程调度策略:SCHED_OTHER, SCHED_IDLE,SCHED_BATCH
4. 命令选项风格:
Ø Unix/Posix风格
ü 命令后的选项,可以分组,便必须以连字符开头,如ps -aux。
ü 选项无需加参数的,可以组合在一起,如:sed -n -r 可以写成 sed -nr
Ø BSD风格,即命令后的选项,不可以与连字符同用,多个选项可以分组输写
Ø GNU风格
ü 即长选项,命令后的参数,可以分组,但必须以双横线开头,如:ps --help。
ü 命令行选项以两个连字符'--'开头,后跟选项名称,选项后面使用空格或者等号 紧接着取值
5. 查看进程树
a. pstree -p显示进程名后附加PID
b. pstree -u显示进程名后附加用户名
c. {}代表线程
6. 基于程序名查询进程编号
a. pidof 进程名
7. 进程查询工具ps命令
Ø BSD风格选项
ü ps 不加任何选项则仅显示当前登录会话shell环境下的进程列表
ü ps a 选项包括所有终端中的进程
ü ps x 选项包括不链接终端的进程(显⽰当前⽤户所运⾏的所有进程,包括前台和后台守护进程)
ü ps u 选项显示进程所有者的信息
ü f 选项显示进程树,相当于 --forest
ü k|--sort 属性 对属性排序,属性前加- 表示倒序
ü o 基于进程struck数据结构中的属性字段 定制显示的字段信息
ü L 显示支持的进程属性字段列表 (该选项下列出的进程属性字段可以供o选项字制显示输出)
ü 实例:利用o选项字制显示字段,并结合k选项基于指定字段排序,如基于%mem字段排序
ü ps o pid,%cpu,%mem,size k %mem
ü
Ø UNIX风格
ü -C cmdlist 指定命令,多个命令用,分隔
ü -L 显示线程
ü -e 显示所有进程,相当于-A
ü -f 显示完整格式程序信息
ü -F 显示更完整格式的进程信息
ü -H 以进程层级格式显示进程相关信息
ü -u userlist 指定有效的用户ID或名称
ü -U userlist 指定真正的用户ID或名称
ü -g gid或groupname 指定有效的gid或组名称
ü -G gid或groupname 指定真正的gid或组名称
ü -p pid 显示指pid的进程
ü --ppid pid 显示属于pid的子进程
ü -t ttylist 指定tty,相当于 t
ü -M 显示SELinux信息,相当于Z
Ø PS命令输出字段
ü USER :进程执行用户
ü PID:进程ID
ü %CPU:CPU利用率
ü %MEM:内存利用率
ü VSZ:内核承诺分配给进程的虚似存内存(KB)
ü RSS:进程占用的真正物理内存(KB)
ü TTY:终端号 ?号与终端无关的
ü STAT:进程状态
ü START:进程启动到PS命令查询时所使用的时间
ü TIME:进程实际占用CPU运行的时间(获取的时间分)
ü COMMAND:进程执行的命令行
ü EUESR:进程生效用户effect user(例:passwd被设置了SUID权限,则在进程发起者执行的进程实际生效用户上下文件为passwd文件所属组的)
ü RUSER:进程的发起者real user
Ø STAT进程状态
ü R 处理运行状态,正在被CPU执行或在可执行队列中的进程处于该状态
ü S 处于睡眠状态(Sleep可中断睡眠)等待事件或信号触发唤醒,S状态进程task_struct结构被放入对应事件的等待队列中,一旦事件触发则会被唤醒
ü D 处于深度睡眠状态(Deep sleep不可中断睡眠)
ü T 暂停状态或跟踪状态,
ü Z 僵死状态,
ü X 死亡状态,
ü Z: zombie
ü +: 前台进程
ü l: 多线程进程
ü L:内存分页并带锁
ü N:低优先级进程
ü <: 高优先级进程
ü s: session leader,会话(子进程)发起者
8. 进程的信号干预:
Ø kill可以向进程发送信息,干预进程的运行状态
Ø 常用信号,kill -l可以查看系统支持的所有信号,Linux*有64种信号,信号功能介绍:man 7 signal查看帮助,kill -l {1..64} 查看对应信号名称
ü 1号SIGHUP:无须关闭进程而让进程重新读取配置文件Systemctl reload选项就是服务进程发送HUP信号使进程重新加载配置文件
ü 2号SIGINT:interrupt中止,打断正在运行的进程,相当于Ctrl+c
ü 3号SIGQUIT 相当于ctrl+\ ,不是真正结进程,发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件
ü 9号SIGKILL:强制杀死运行中的进程,不管理进程是否完成读写操作,会丢失进程数据,打开的文件可能会被损坏。一般应对僵死态或死亡态的进程
ü 15号SIGTERM:终止正在运行的进程,会给进程转储缓存数据的机会。如果kill不加任何信号则默认会发送第15号信号。
ü 18号SIGCONT:唤醒后台休眠的进程继续运行,此时在后台运行,在进程所有的终端会话下使用fg命令可以恢复到前台运行。bg命令就是向进程发送18号信号
ü 19SIGSTOP:将正在运行的进程转入后台休眠,相当于Ctrl+z ,Stopped暂停
Ø 进程前后台切换
ü Ctrl+z将前台运行的进程转入后台休眠(可以看到会提示[#]+ Stopped,#表示任务号,可以通过fg、bg发前18号信号唤醒任务),在进程所有的终端会话下使用fg命令可以恢复到前台运行。相当于向后进程发送第19号信号SIGSTOP
ü fg将后台任务转到前台:jobs查看后台休眠及运行任务,使用fg加上任务编号即可前后台任务放到前台运行,相当于向后台进程发送第18号信号SIGCONT
ü bg将前台任务转到后台:bg即可以将前台任务转到后台运行,也可以唤醒后台休眠的任务,相当于向进程发前第18号信号SIGCONT
ü Ctrl+c 中止前台运行的任务
ü Ctrl+d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF
ü Ctrl+\ 发送 SIGQUIT 信号给前台进程查并不执行并生成 core 文件,如ping命令想看
Ø 信号的表示方式:
ü 信号的数字标识;例:1,2,3,
ü 信号的完整名称,以SIG后加信号名称简写,例:SIGHUP,SIGINT,QUIT
ü 信号的简写名称;例:HUP,INT,QUIT
Ø 基于进程名杀死所有进程
ü killall 进程名:例:killall httpd
Ø 基于模式搜索进程
ü pgrep:
ü 语法:pgrep [options] pattern
ü 选项:
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
ü 实例: ü pkill
Ø 向进程发送信号
ü 语法:kill -s [信号] pid 注:-s可以省略,而直接用-加上信号再指定PID即可。
ü 例:四种不同的发送信号的方法
Ø kill -9 `pidof ping`
Ø kill -HUP `pidof ping`
Ø kill -SIGHUP `pidof ping`
Ø kill -s 9 `pidof ping`