Linux内核之进程6: 深度睡眠
  TEZNKK3IfmPf 2023年11月14日 26 0

深度睡眠TASK_UNINTERRUPTIBLE:不可被信号唤醒;

浅度睡眠TASK_INTERRUPTIBLE:唤醒方式,等到需要的资源,响应信号;

深度睡眠场景:

有些场景是不能响应信号的,比如读磁盘过程是不能打断的,NFS也是;

Linux内核之进程6: 深度睡眠

执行程序过程中,可能需要从磁盘读入可执行代码,假如在读磁盘过程中,又有代码需要从磁盘读取,就会造成嵌套睡眠。逻辑做的太复杂,所以读磁盘过程不允许打断,即只等待IO资源可用,不响应任何信号;

应用程序无法屏蔽也无法重载SIGKILL信号,深度睡眠可以不响应SIGKILL kill-9信号;

深度睡眠案例

Linux内核之进程6: 深度睡眠

此时该进程读IO过程,是无法用kill -9杀死的;

一般绝大部分场景,都设置为浅睡眠

Linux内核之进程6: 深度睡眠

ps aux: D+

深度睡眠进程显示D+状态

2.深度睡眠对load average的影响

top load average:
cat

无法杀死,load average变大,CPU依然空闲;

多加一个进程

cat

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

Linux内核之进程6: 深度睡眠

kill -2 pid ? //发现被杀死,什么原因呢

dmesg

Linux内核之进程6: 深度睡眠

git grep "complete_signal"

Linux内核之进程6: 深度睡眠

满足sig_fatal,判断独占signal_pending,符合条件,内核添加一个SIGKILL信号,导致-2变成-9

Linux内核之进程6: 深度睡眠

条件:

Linux内核之进程6: 深度睡眠

#define

(!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进程;

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
TEZNKK3IfmPf