进程状态并详解S和D状态

news2025/5/19 10:39:33

#define TASK_RUNNING 0x0000 // 运行或就绪(在运行队列)

#define TASK_INTERRUPTIBLE 0x0001 // 可中断睡眠(S状态)

#define TASK_UNINTERRUPTIBLE 0x0002 // 不可中断睡眠(D状态)

#define __TASK_STOPPED 0x0004 // 暂停(收到 SIGSTOP)

#define __TASK_TRACED 0x0008 // 被调试器追踪

#define EXIT_DEAD 0x0010 // 终止(最终状态)

#define EXIT_ZOMBIE 0x0020 // 僵尸进程

1.运行状态不一定非得是cpu在跑这个进程,只要是在跑或者在运行队列就行

2.浅睡眠状态S,比如sleep导致的,pcb挂到sleep创建的定时器的等待队列

3.深睡眠状态D,比如write时磁盘没准备好导致的,pcb挂到键盘的等待队列,深睡眠一般是进程进行IO时发生的

假如进程处于浅睡眠状态,如sleep,那进程会被挂在sleep创建的定时器的等待队列里,然后每次时钟中断,执行对应中断函数,会更新定时器,一旦等待时间够了,中断函数就会调用wake_up内核函数来唤醒等待进程,弄到运行队列里

假如进程处于D深度睡眠状态,如write时磁盘没准备好,进程会被挂在键盘的等待队列里,磁盘准备好后,键盘会发出硬件中断请求,然后cpu陷入内核,执行对应中断方法,中断函数会调用wake_up内核函数,使进程唤醒

进程在获取锁的时候,如果获取失败会切换到锁的等待队列上,等到其他进程执行完毕,unlock释放锁,unlock里面会调用wake_up内核函数,使锁上的进程切换到运行队列

wake_up内核函数(不是系统调用)

1.将进程的状态变成R

2.将进程切换到运行队列里

下面是详细过程:

1. 浅睡眠(S状态)—— 以 sleep() 为例​

​流程​
  1. ​进程调用 sleep(3)
    • 用户态 sleep() → 内核 nanosleep() 系统调用 → 设置高精度定时器(hrtimer)。
  2. ​加入等待队列​
    • 进程状态设为 TASK_INTERRUPTIBLE(S状态),挂入定时器的等待队列。
  3. ​时钟中断处理​
    • 每次时钟中断(如 tick_sched_timer())检查定时器是否到期。
    • ​到期时​​:调用 wake_up() 将进程移回运行队列,状态改为 TASK_RUNNING

​2. 深睡眠(D状态)—— 以 write() 写入磁盘文件为例​

​流程​
  1. ​进程调用 write()
    • 陷入内核-> 若磁盘写入繁忙,进程设为 ​TASK_UNINTERRUPTIBLE(D状态)​​,挂入磁盘设备的等待队列
  2. ​硬件中断触发​
    • 磁盘准备就绪 → 发送中断请求(IRQ)→ CPU 陷入内核,执行磁盘中断处理程序
  3. ​中断处理唤醒​
    • 中断程序确认写入完成 → 调用 wake_up() 唤醒磁盘等待队列中的进程

3. 锁竞争 —— 以 mutex 为例​

​流程​
  1. ​进程A 抢锁失败​
    • 调用 mutex_lock() → 若锁被占用,进程设为 TASK_UNINTERRUPTIBLE,挂入锁的等待队列。
  2. ​进程B 释放锁​
    • 调用 mutex_unlock() → 检查等待队列 → 调用 wake_up() 唤醒进程A。
  3. ​进程A 重新调度​
    • 被唤醒后状态改为 TASK_RUNNING,参与调度。

理解进程状态S和D的差别,不会被信号打断究竟在说什么

scanf的底层是read,read的时候stdin没数据,read会将进程设为S状态,pcb挂在stdin的等待队列,然后cpu会重新调度其他进程,按下ctrl+c,假如此时cpu运行的是进程B,触发硬件中断,cpu陷入内核,保存寄存器到进程B的内核栈,执行中断函数,会给等待队列中pcb中加入SIGINT信号并检查状态是S那就wake_up唤醒,然后切换到进程B用户态,等到cpu重新调度进程A,从上次read的阻塞点继续执行,会先判断有没有要处理的信号,如果有SIGINT,被忽略那就继续阻塞,如果不忽略,那就read返回EINTR,系统调用read执行完在即将切换回用户态时 ,在这个安全点处理信号SIGINT

假如进程A write时磁盘没有就绪,那就调用schedule()重新调度其他进程,write把进程A设为D状态,挂到磁盘等待队列,ctrl+c键盘硬件中断,执行中断函数,将磁盘等待队列里进程设置SIGINT的信号,然后检查进程状态是D状态,于是不会调用wake_up。直到磁盘准备就绪,发送硬件中断请求,可能在发生中断前cpu正在跑进程B,那么就陷入内核,把寄存器保存到进程B的内核栈,执行中断函数调用wake_up内核函数唤醒进程,然后切换到进程B用户态,等到cpu重新调度进程A,从write的阻塞点继续执行,直接开始写无论信号有没有被设置,write系统调用结束后在切换回用户态前执行SIGINT的执行函数 

不会被信号打断有两点

1.设置信号后不会调用wake_up使进程唤醒

2.重新调度进程从阻塞点开始运行,不会检查信号的设置,而是执行剩余逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<前端小白> 前端网页知识点总结

HTML 标签 1. 标题标签 h1到h6 2. 段落标签 p 3. 换行 br 水平线 hr 4. 加粗 strong 倾斜 em 下划线 ins 删除 del 5. 图像标签 img src-图像的位置 alt- 图片加载失败显示的文字 替换文本 title--- 鼠标放到图片上显示的文字 提示…

历史数据分析——宁波海运

运输服务 运输服务板块简介: 运输服务板块主要是为货物与人员流动提供核心服务的企业的集合,涵盖铁路、公路、航空、海运、物流等细分领域。该板块具有强周期属性,与经济复苏、政策调控、供需关系密切关联,尤其是海运领域。有不少国内股市的铁路、公路等相关的上市公司同…

小结:jvm 类加载过程

类加载过程 是Java虚拟机(JVM)将字节码文件(.class文件)加载到内存中,并转换为运行时数据结构的过程。这个过程可以分为多个步骤,每个步骤都有其特定的任务和目的。根据你提供的信息,以下是类加…

OpenCv高阶(八)——摄像头调用、摄像头OCR

文章目录 前言一、摄像头调用通用方法1、导入必要的库2、创建摄像头接口 二、摄像头OCR1.引入库2、定义函数(1)定义显示opencv显示函数(2)保持宽高比的缩放函数(3)坐标点排序函数(4)…

Java开发经验——阿里巴巴编码规范实践解析3

摘要 本文深入解析了阿里巴巴编码规范中关于错误码的制定与管理原则,强调错误码应便于快速溯源和沟通标准化,避免过于复杂。介绍了错误码的命名与设计示例,推荐采用模块前缀、错误类型码和业务编号的结构。同时,探讨了项目错误信…

MySQL——6、内置函数

内置函数 1、日期函数2、字符串函数3、数学函数4、其他函数 1、日期函数 1.1、获取当前日期: 1.2、获取当前时间: 1.3、获取当前时间戳: 1.4、获取当前日期时间: 1.5、提取出日期: 1.6、给日期添加天数或时间…

低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player

在实时视频流的应用中,RTSP(Real-Time Streaming Protocol)播放器扮演着至关重要的角色,尤其是在视频监控、远程医疗、直播等高实时性需求的场景中。随着行业需求的不断升级,对播放器的低延迟、稳定性、兼容性等方面的…

【交互 / 差分约束】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long;const int N 10510; const int M 200 * 500 10; int h[N], ne[M], e[M], w[M], idx; ll d[N]; int n, m; bool st[N]; int cnt[N];void add(int a, int b, int c) {w[idx] c, e[idx] b…

宝塔面板部署前后端项目SpringBoot+Vue2

这篇博客主要用来记录宝塔部署前端后端项目的过程。因为宝塔部署有点麻烦&#xff0c;至少在我看来挺麻烦的。我还是喜欢原始的ssh连接服务器进行操作。但是公司有项目用到了宝塔&#xff0c;没办法啊&#xff0c;只能摸索记录一下。 我们需要提前准备好后端项目的jar包和前端项…

现代生活健康养生新视角

在科技飞速发展的今天&#xff0c;我们的生活方式发生巨大转变&#xff0c;健康养生也需要新视角。从光线、声音等生活细节入手&#xff0c;能为健康管理开辟新路径。​ 光线与健康密切相关。早晨接触自然光线&#xff0c;可调节生物钟&#xff0c;提升血清素水平&#xff0c;…

多模态大语言模型arxiv论文略读(八十一)

What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文标题&#xff1a;What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文作者&#xff1a;Xu Cao, Bolin Lai, Wenqian Ye, Yunsheng Ma, Joerg Heintz, Jintai …

3.4/Q2,Charls最新文章解读

文章题目&#xff1a;Associations between reversible and potentially reversible cognitive frailty and falls in community-dwelling older adults in China: a longitudinal study DOI&#xff1a;10.1186/s12877-025-05872-2 中文标题&#xff1a;中国社区老年人可逆性和…

通过觅思文档项目实现Obsidian文章浏览器在线访问

觅思文档项目开源地址 觅思文档项目开源地址&#xff1a;https://gitee.com/zmister/MrDoc 觅思文档部署步骤概览 服务器拉取代码&#xff1a; git clone https://gitee.com/zmister/mrdoc-install.git && cd mrdoc-install && chmod x docker-install.sh &a…

5月18总结

一.算法题总结 1. 解题思路&#xff1a;对于这个题&#xff0c;我最开始想到就是二分&#xff0c;但是头痛的是有三个解&#xff0c;如果我在-100到100之间二分&#xff0c;那么只能得出一个解&#xff0c;然后我就想了一下&#xff0c;这个要求精度&#xff0c;那么0.01这么小…

Linux Bash | Capture Output / Recall

注&#xff1a;本文为 “Linux Bash | Capture Output / Recall” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 Automatically Capture Output of the Last Command Into a Variable Using Bash 使用 Bash自动将最后一个命令的输出捕获到…

2025/5/18

继续研究一下大佬的RAG项目。开始我的碎碎念。 RAG可以分成两部分&#xff1a;一个是问答&#xff0c;一个是数据处理。 问答是人提问&#xff0c;然后查数据库&#xff0c;把查的东西用大模型组织成人话&#xff0c;回答人的提问。 数据处理是把当下知识库里的东西&#xf…

基于Quicker构建从截图到公网图像链接获取的自动化流程

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言预备内容转webp程序PicGo设置Quicker设置视频演示总结互动致谢参考 前言 在自建博…

LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项

LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项 第 一 题 - - - 移 除 元 素方 法 一 - - - 双 重 循 环方 法 二 - - - 双 指 针方 法 三 - - - 相 向 双 指 针&#xff08;面 对 面 移 动&#xff09; 第 二 题 - - -…

uniapp自定义日历计划写法(vue2)

文章目录 uniapp自定义日历计划写法(vue2)1、效果2、实现源码前言:我们有时候需要实现的日历找不到相应的插件的时候,往往需要手动去写一个日历,以下就是我遇到这样的问题时,手搓出来的一个解决方案,希望可以帮助到更多的人。创作不易,请多多支持uniapp自定义日历计划写…

Java IO框架

I/O框架 流 流的分类&#xff1a; 按方向&#xff1a; 输入流&#xff1a;将存储设备的内容读入到内存中 输出流&#xff1a;将内存的内容写入到存储设备中 按单位&#xff1a; 字节流&#xff1a;以字节为单位&#xff0c;可以读取所有数据 字符流&#xff1a;以字符为单…