Linux内核之进程6: 深度睡眠
1.深度睡眠特点及存在原因
深度睡眠TASK_UNINTERRUPTIBLE:不可被信号唤醒;
浅度睡眠TASK_INTERRUPTIBLE:唤醒方式,等到需要的资源,响应信号;
深度睡眠场景:
有些场景是不能响应信号的,比如读磁盘过程是不能打断的,NFS也是;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6200Qhw-1598442888845)(media/ba1ccebab90990a212ee71d44bd0b095.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/b8bfbd3d5caee1583c84183b1059b1d9.png#pic_center)
执行程序过程中,可能需要从磁盘读入可执行代码,假如在读磁盘过程中,又有代码需要从磁盘读取,就会造成嵌套睡眠。逻辑做的太复杂,所以读磁盘过程不允许打断,即只等待IO资源可用,不响应任何信号;
应用程序无法屏蔽也无法重载SIGKILL信号,深度睡眠可以不响应SIGKILL kill-9信号;
深度睡眠案例
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6XchhBc-1598442888850)(media/c1c3d675b84e2aa4be76f1e66f385988.png)]](https://i-blog.csdnimg.cn/blog_migrate/4f3cc5d7f002624d049da1f2747fbd6b.png#pic_center)
此时该进程读IO过程,是无法用kill -9杀死的;
一般绝大部分场景,都设置为浅睡眠
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opqUFcE3-1598442888852)(media/9486b203210164bf1606d40fb3912c1f.png)]](https://i-blog.csdnimg.cn/blog_migrate/f49e810a4f30e38b83bac7bec3222fd8.png#pic_center)
ps aux: D+
深度睡眠进程显示D+状态
2.深度睡眠对load average的影响
top load average:
cat /dev/global_fifo
Kill -2 pid
Kill -9 pid
无法杀死,load average变大,CPU依然空闲;
多加一个进程
cat /dev/global_fifo
load average继续变大,CPU依然空闲;
load
average:包括CPU消耗和IO的总预期,此时虽然不消耗CPU,但是等待IO消耗了时间,load
average显示的是随时间变化的平均负载预期;
D状态会增加load average;
对于同一个程序,不同执行环境:
执行性能=APP(消耗CPU)+DISK(I/O消耗);
3.TASK_KILLABLE
只响应致命信号 D状态;
不跳转APP响应信号,不会产生递归睡眠;
__set_current_state(TASK_KILLABLE);
可以响应信号9
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIZQ4CCa-1598442888854)(media/3d68e86238fe063ae17bc97512136611.png)]](https://i-blog.csdnimg.cn/blog_migrate/40cd092b06ef50041fbc2b21f5cf2a78.png#pic_center)
kill -2 pid ? //发现被杀死,什么原因呢
dmesg
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lG9Y1EF-1598442888856)(media/8500b4ed59bb9aee061b415055641aae.png)]](https://i-blog.csdnimg.cn/blog_migrate/3e32b07f027af568f58325e0968e9f3d.png#pic_center)
git grep "complete_signal"
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9CtFDbf-1598442888857)(media/aa4a4cf3f1ee2cd5c3f5d8faa796e23a.png)]](https://i-blog.csdnimg.cn/blog_migrate/f4317e5e768cdf4929be413a8d29d7ab.png#pic_center)
满足sig_fatal,判断独占signal_pending,符合条件,内核添加一个SIGKILL信号,导致-2变成-9
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Td6j1uO-1598442888858)(media/d3e7a98c336cf79479f4beccb9ace563.png)]](https://i-blog.csdnimg.cn/blog_migrate/c7ed3bf58e45062c044916b76eda5966.png#pic_center)
条件:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c9Y6YLx4-1598442888860)(media/bdc19036353f5a541e51368f3f351871.png)]](https://i-blog.csdnimg.cn/blog_migrate/b462247e9f271cc45aa9c4a6da66c165.png#pic_center)
#define sig_fatal(t, signr) \\
(!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \\
(t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL)
满足信号:不忽略,也不是stop,行为缺省。(缺省信号定义基本就是死,Core/Term等)
那么添加SIGKILL信号;
与fatal_signal()必须9信号,不一样;
Ps:如果应用层捕获了2信号,那么就不满足sig_fatal,kill - 2杀不死了;
**综上,**满足sig_fatal,kill -2可以杀TASK_KILLABLE进程;
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)