进程线程(六) 深度睡眠 和 浅度睡眠
1、深度睡眠TASK_UNINTERRUPTIBLE和浅度睡眠TASK_INTERRUPTIBLE
浅度睡眠代码模板
2、为什么需要深度睡眠?
深度睡眠是不可避免的
读磁盘的时候,就是深度睡眠。
程序的执行是 边执行边 load 代码段 。这个过程不能被信号打断,否则实现起来是极其复杂的。
下面演示一下深度睡眠 和 浅度睡眠的例子
globalfifohttps://github.com/merlindu/note/tree/master/contents/linux_device_driver/drivers/globalfifo/ch12https://github.com/merlindu/note/tree/master/contents/linux_device_driver/drivers/globalfifo/ch12
浅度睡眠可以被信号打断:
3、D状态的意思是什么?
深度睡眠不可以被信号打断:D+状态。
kill -2 8279 kill -9 8279 是杀不到 深度睡眠的进程,
深度睡眠会增加 load average , 1 分钟,5分钟,15分钟的负载。但是不影响 CPU的使用率。
1分钟变的最快,15分钟变的最慢,5分钟跟着1分钟的变化,15分钟跟着5分钟的变化,类似于股票的日线,周线,月线。
top 命令 load average 是评估什么的呢?
load 其实是指 CPU的 任务队列里的 具有的负载量。
比如,任务队列里有1个满负载的任务,load=1 , 如果有2个满负载的任务,load=2 (不管几个核都是2)。但是如果就1个核的话,load > 1 就说明 负载有点重了。但是如果 load = 2 , 有 4个核,说明负载还算轻松,因为还有两个空闲的核。如果有两个不是满负载的任务,0.3 0.4 这两个任务的负载加起来0.7的负载 ,1个核 就可以很轻松。
但是 load average 只看CPU的话,有些情况下会不准。比如下面的情况,正常质量高的硬件,计算出来的load average应该低,质量差的硬件计算出来的 load average 应该高。
进程 CPU消耗 + IO消耗,同样都是1Ghz 的CPU ,同样的代码,跑起来的结果可能就是不一样。
高速硬盘 80%的时间花费在了CPU上,低速硬盘,绝大部分时间花在了读磁盘上。这样计算的就不准了。
所以就有了下面的补丁,就把等待磁盘IO的时间计算上了
所以,要是 top 显示 load average 高的话,CPU利用率又很低,要么你用了 task_uninterruptible 要么你的磁盘很慢。因为磁盘的睡眠都是task_uninterruptible的。
4、TASK_KILLABLE
但是使用深度睡眠,如果 硬盘坏了,或者 nfs server 挂掉了,用户层的APP就 kill 不掉了,这多让人头疼。深度睡眠 不响应信号,是怕执行用户层的信号处理函数,引起递归操作,逻辑太复杂。
那有没有一种信号,不响应用户层的信号处理函数,直接杀死进程呢?
在 Linux 发展过程中,出现了一种新的状态 TASK_KILLABLE
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
TASK_KILLABLE 本质上是一种深度睡眠,但是是可以被致命信号唤醒的,唤醒之后就是被kill 掉的。TASK_KILLABLE 体现在 ps 命令 也是 D状态。
什么是 fatal_signal 呢?
fatal_sinal 就是包含 信号 9 的信号。
kill -9 可杀死该进程
ctrl + c = kill -2 也可以杀死 该进程。信号2可以被用户空间屏蔽掉,但是信号9不可以被屏蔽。
所以 kill -2 也能杀死 task_killable 的进程。这里可以参考下内核代码 kernel/signal.c
如果在用户空间,将信号2的 处理函数修改了(本来是杀掉进程) ,sig_fatal() 中 SIG_DEF(default) 就不成立了,这样 kill -2 就无法杀死此进程了。
但是一般来说 SIG_KILLABLE 用在磁盘IO 当中,一般情况下,是使用 TASK_INTERRUPTIBLE
进程线程(六) 深度睡眠 和 浅度睡眠相关推荐
- SYD8801低功耗【深度睡眠模式】【浅度睡眠模式】【进入睡眠模式后要等待硬件进入睡眠】【内部上拉电阻对功耗的影响】【测试低功耗步骤】
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...
- linux之进程线程信号全解
一.linux进程全解 1.程序的开始结束及预处理atexit函数 main函数由谁调用:其实在裸机程序中c语言运行前是需要一段引导的汇编代码为c语言运行准备环境的如栈,只是在使用编译器开发过程中我们 ...
- linux 编程 调度,Linux的进程线程及调度
搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...
- 《趣谈Linux》总结三:进程/线程
8 进程管理 有了系统调用,就可以开始创建进程了 8.1 通过写代码使用系统调用创建一个进程 在 Linux 上写程序和编译程序,也需要一系列的开发套件,就像 IDEA 一样: 运行下面的命令,就可以 ...
- Linux查看进程线程个数
1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...
- 进程/线程同步的方式和机制,进程间通信
一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式 临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别 1.临界区: ...
- Linux系列之查看进程线程的方法
在window系统查看系统进程,我们一般会使用Ctrl+Shift+Esc打开系统进程监控页面,但是在Linux系统查看进程一般使用top命令或者ps命令,但是如果要查看线程怎么查看?其实也可以使用这 ...
- XV6源代码阅读-进程线程
文章目录 Exercise1 源代码阅读 Exercise2 带着问题阅读 参考文献 Exercise1 源代码阅读 基本头文件:types.h param.h memlayout.h defs.h ...
- Map集合 File类 递归 序列化 常用类 进程线程 死锁
一.Map集合 将键映射到值得对象,键得值不能重复,一个键可以对应最少一个值. Map接口下的封装好得实现类 –|HashMap –|TreeMap 1.Map接口下的方法 增://将指定得值与该映射 ...
最新文章
- CVPR2021 | PAConv:一种位置自适应卷积,点云分类、分割任务表现SOTA
- solr系列之solr-5.5.5 window单机版默认Jetty安装
- cf 11A Increasing Sequence(水,)
- 《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.3 第2阶段:数据准备...
- 计算机网络 ip协议是,计算机网络知识:TCP/IP协议
- python奖励多少钱_关于python的问题,好的高奖励!
- python子类继承父类属性实例_python – 从子类内的父类访问属性
- 两列数据找出相同项自动对应_关于数据核对的6个超级技巧,用过的人都说好...
- DayDayUp:2021年的自我总结
- nodejs通过later实现定时执行任务
- linux菜鸟要飞-根目录
- 通用计算机实习周记,实习周记100篇通用版|绘图员实习周记范文
- 计算机二级access难不难,计算机二级access难吗
- Kotlin学习:标准函数(Standard.kt),run()、with()...
- 通过脚手架安装Ant+react+umi+dva项目(一)
- 使用python和tableau对数据进行抓取及可视化
- 沧海一声笑(最好版):也论智能的生成
- QT 在注释中遇到意外的文件结束
- 郑州大学计算机在职博士招生简章,郑州大学医学在职博士招生简章
- 密码极客经济学博士揭秘,2020年哪个区块链项目最值期待?
热门文章
- 面试官:为何Redis使用跳表而非红黑树实现SortedSet?
- 【pandas】--DataFrame数据筛选(二)
- python和c++实现 不改变长宽比缩放图片
- 2022年财务顾问FA行业研究报告
- 邓俊辉 数据结构与算法C++版 第十三章 串 ADT
- touch.pageX/touch.screenX/touch.clientX的区别
- 前后端分离页面500错误,控制台不打印错误日志的错误定位
- bartender打印错误
- OSChina 周六乱弹 —— 给你看个小仙女
- 记:解决 Weditor 页面元素坐标定位不到、不准确的问题