Linux内核之进程6: 深度睡眠
1.深度睡眠特点及存在原因
深度睡眠TASK_UNINTERRUPTIBLE:不可被信号唤醒;
浅度睡眠TASK_INTERRUPTIBLE:唤醒方式,等到需要的资源,响应信号;
深度睡眠场景:
有些场景是不能响应信号的,比如读磁盘过程是不能打断的,NFS也是;
执行程序过程中,可能需要从磁盘读入可执行代码,假如在读磁盘过程中,又有代码需要从磁盘读取,就会造成嵌套睡眠。逻辑做的太复杂,所以读磁盘过程不允许打断,即只等待IO资源可用,不响应任何信号;
应用程序无法屏蔽也无法重载SIGKILL信号,深度睡眠可以不响应SIGKILL kill-9信号;
深度睡眠案例
此时该进程读IO过程,是无法用kill -9杀死的;
一般绝大部分场景,都设置为浅睡眠
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
kill -2 pid ? //发现被杀死,什么原因呢
dmesg
git grep "complete_signal"
满足sig_fatal,判断独占signal_pending,符合条件,内核添加一个SIGKILL信号,导致-2变成-9
条件:
#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进程;
Linux内核之进程6: 深度睡眠相关推荐
- 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )
文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...
- 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )
文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...
- 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )
文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...
- 【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )
文章目录 一.task_struct 结构体字段分析 1.files 字段 2.nsproxy 字段 3.信号处理相关字段 4.信号量和共享内存相关字段 在 Linux 内核 中 , " 进 ...
- 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )
文章目录 一.task_struct 结构体字段分析 1.comm 字段 2.进程优先级字段 3.cpus_ptr 字段 4.mm.active_mm 字段 5. fs 字段 在 Linux 内核 中 ...
- 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
文章目录 一.task_struct 结构体字段分析 1.real_parent 字段 2.parent 字段 3.group_leader 字段 4.real_cred 字段 5.cred 字段 在 ...
- 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )
文章目录 一.task_struct 结构体字段分析 1.state 字段 2.stack 字段 3.pid字段 4.tgid 字段 5.pid_links 字段 在 Linux 内核 中 , &qu ...
- 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )
文章目录 一.task_struct 结构体 二.task_struct 结构体代码示例 一.task_struct 结构体 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象 ...
- 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...
最新文章
- Python使用sklearn构建广义线性模型:Tweedie回归(Tweedie regression)实战
- 函数模块:CTVB_COMPARE_TABLES
- Python列表的用法和基本操作
- “神算子”上线!EasyDL时序预测模型零门槛轻松上手
- 计算机扩招的学校,这些985/211学校今年继续扩招!又有一大波学校专业课有变!...
- IOS7实现扫描二维码
- 怎么把python解释器配置在pycharm中_在PyCharm中配置项目(三):配置Python解释器...
- Kali Linux 和 渗透测试
- eclipse打开文件所在目录
- 指针和引用的相同与不同
- 网络爬虫-2018个人总结
- 重心法选址迭代matlab,配送中心重心法选址的研究
- 神奇的大脑 神经网络
- setw和width
- android6自定义锁屏,Android
- 【软件工具篇02】使用Anki克服遗忘曲线
- Web前端面试指导 四十 CSS3有哪些新特性
- sap 修改主机名过程
- Mac OS X 10.8.3搭建Android工程源码的编译环境(解决找不到GCC、GIT、PYTHON的问题)...
- 前端知识补充说明(一)之HTTP/浏览器等基础原理部分
热门文章
- 用户运营4大策略体系搭建:增长框架+用户建模+场景化分层+数据运营
- anroid获取ping值
- 支付宝小程序沙箱支付提示(系统繁忙,请稍后再试)
- 密码协议(二)仲裁协议
- Jlink 使用 RTT 输出调试信息总结
- 键盘哪个键是锁定计算机,笔记本键盘锁定键在哪_笔记本电脑的“键盘锁”是哪一个键-win7之家...
- 37岁,感觉上班太累,可做这5个生意,年轻人看不上,但却挺赚钱
- Tc27x的MTCR与MFCR指令
- Unresolveable build extension: Plugin...or one of its dependencies could not be resolved: Failed to
- ArcGIS API for JavaScript实现坐标定位