linux 进程管理
理论
(1)程序与进程
程序:指令+参数通过逻辑控制运行起来,完成某项特定任务。
静态的,封闭的。
进程:程序运行起来的结果。
操作系统运行的基本单位。
有生命周期(产生---->死亡)
进程有运行状态(running,sleepping,等待,僵死)
并发性,交互性(管道)----共享内存,队列(kafka)。
程序和进程不是以一一对应。
(2)子进程和父进程
子进程继承父进程的特性:安全性的身份认证;过去和当前的文件描述符,端口等资源特权;环境变量;程序代码。
父进程------->fork()----->子进程
子进 ------>exec()------>运行程序
子进程-------->exit()------->退出
(3)进程和线程
对于linux而言,不严格区分,对于进程和线程都将拥有独立的一套完整资源集(内存---->虚拟内存,CPU------>时间片)。
自学:协程;对比一下进程,线程协程
管理工具
ps
[ ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 init [5]
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端
STAT: 进程状态 man ps (/STATE)
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
Ss s进程的领导者,父进程
S< <优先级较高的进程
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名
pstree:子进程与父进程关系
pgrep: 查看进程号
pgrep sshd,
pgrep -o sshd,
pgrep -n sshd,
pgrep -l sshd
killall:
直接更进程名
killall sshd
kill ;
后面更进程号
kill 38438
pkill;
可以跟终端,指定用户
pkill -t pts/0
pkill -u username
killall,kill,pkill 都可发送信号
top:
[ ~]# top
top - 09:26:33 up 21:27, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 101 total, 1 running, 99 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999696 total, 157452 free, 111628 used, 730616 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 681084 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29114 nginx 20 0 48492 2168 816 S 0.3 0.2 0:00.31 nginx
29129 root 20 0 157632 2128 1528 R 0.3 0.2 0:01.51 top
1 root 20 0 45924 6228 3864 S 0.0 0.6 0:04.40 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:01.42 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:01.31 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
参考:
https://www.cnblogs.com/sbaicl/articles/2752068.html
https://blog.csdn.net/yjclsx/article/details/81508455
htop:
(4)进程的前后台
前台一次只能运行一个进程
ping www.baidu.com >/dev/null 2>&1
后台就可以运行多个进程
若果程序有输出,输出内容任然会到终端上
把一个进程放到后台执行
ping www.baidu.com >/dev/null 2>&1 &
(5)进程状态
sleep --(S)可中断睡眠
--(D)不可中断睡眠
running --(ready)
--(内核)
--(用户)
stop
zombie ---(Z):资源已清理
---(X):资源没清理
进程状态间的切换 (*****)
运行 ------------------------- 就绪 ----------------------------- 等待
(在CPU上运算) (资源已分配,等待CPU空闲) (事件未触发)
------时间片耗尽---------> <-------------事件触发-----------
<-----进程调运或者系统调运--
-----------------------------等待事件发生------------------------>
(6)进程优先级
答案1 :7(0-6) -----(错)
0-6:系统运行级别:0--(关机) 1--(单用户) 2--(无网络的多用户) 3--(多用户) 4--(预留) 5--(图形化) 6--(重启)
答案2 :40 (-20,+19)------(错)
nice值--->相对优先级,(优先级度量)
答案3 :40 (0-39) -------(错)
top命令的PR值: 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
答案4:
0-139 (140)
0-99 (100)系统进程优先级
100-139 (40)用户优先级
0------------------------------------------------99----------------------------139--------------->
----------------------------------------100----->--------------------------40-------------------->
------------------------------------------------->nice
(7)nice调整
r ----》PID---》回车----》nice值---》回车
[ ~]# ps axo command,pid,nice |grep sleep
sleep 600 28132 -5
grep --color=auto sleep 28141 0
[ ~]# renice -20 28132
28132 (进程 ID) 旧优先级为 -5,新优先级为 -20
[ ~]# ps axo command,pid,nice |grep sleep
sleep 600 28132 -20
grep --color=auto sleep 28145 0
(8)作业控制
对于shell不会对进程做控制,对进程控制需要kill,killall,pkill,top --发信号。
shell是对作业控制
在终端上执行一条语句,就是一个作业。
好多个进程完成一项任务,就是一个作业。
在Shell前台一次只能运行一个作业,后台可运行多个。
前台作业放后台: &,ctrl+Z(挂起)
例如:sleep 600 &
sleep 600 ctrl+Z
把后台作业调到前台运行,fg
例如:fg 作业号
把后天停止的作业运行起来,bg
例如:bg 作业号
把后台作业终止,kill %
例如: kill %作业号
把后台作业进程杀死,kill -9 % (kill可加信号)
例如:kill -9 %作业号
https://www.cnblogs.com/anttech/p/10597638.html
(9)/proc,/sys 文件系统
伪文件系统。
https://www.cnblogs.com/anttech/p/10597671.html