当前位置: 首页 > news >正文

Linux 下的进程状态

文章目录

  • 一、运行状态
    • 运行队列
    • 运行状态和运行队列
  • 二、睡眠状态
    • S状态
    • D状态
      • D状态产生的原因
  • 三、暂停状态
    • T状态
    • t 状态
  • 四、僵尸状态
    • 为什么有僵尸状态
    • 孤儿进程

一、运行状态

R状态:进程已经准备好随时被调度了。

运行队列

每个 CPU 都会维护一个自己的运行队列(一个CPU,一个运行队列)。
在这里插入图片描述

运行状态和运行队列

在这里插入图片描述

二、睡眠状态

S状态

  • S状态(sleeping):可中断睡眠(浅度睡眠)状态。
  • 操作系统在资源紧缺时,可以直接杀死该状态的进程。
int main()
{whilie(1){printf("hello process");}
}
  1. printf 是从外设上取数据,循环打印时,不一定每次要打印时,外设都已经准备好了,因为 CPU 比外设速度快的多,所以CPU会等待外设。
  2. 我们在运行该程序时,发现进程状态是S ,表明大部分时间进程还是在等待的,而不是在运行(可以在某个瞬间看到它是R状态,但概率很低)。

而大部分进程都会与外设有关,会有等待的状态。

D状态

  • D状态disk sleep):不可中断睡眠(深度睡眠)。
  • 操作系统不会杀D状态的进程。

D状态产生的原因

在这里插入图片描述
导致的情况:
数据丢掉啦!!!

那么是谁的错呢?

  1. 对于操作系统:
  • 我本身就有管理它们的能力,而且资源紧缺时有权利杀掉进程。
  • 如果紧缺时不杀这个进程,那系统整体就要挂了,那系统中的十几个进程就都要挂了,损失的数据就更多了,所以杀掉该进程是正确的选择。
  1. 对于进程:
    我是受害者,我被操作系统杀死了,跟我没关系。
  2. 对于磁盘:
    我就是一个跑腿的,让我干什么就干什么,跟我没关系。

所以为了避免这种情况,再增加一种状态:
在这里插入图片描述

三、暂停状态

T状态

T状态stopped):暂停状态。

  • 手动暂停,继续进程
    查看 kill 信号:
    在这里插入图片描述
    其中,18 :进程继续,19:进程暂停。
    可以使用 kill 信号进行进程的手动暂停和继续。

  • 自动暂停进程
    有些进程被禁止做某些操作,但如果进程硬要这样干,进程就会被暂停。

t 状态

  • t 状态tracing stop):被追踪的暂停状态。
  • 当进程处于被追踪状态时,进程暂停,等一等追踪我的那个东西。

四、僵尸状态

Z状态zombie):僵尸状态,进程已经执行完毕,但并未获得进程退出的相关信息时的状态。

为什么有僵尸状态

在这里插入图片描述
PCB 的释放:

  • 进程执行完毕后,代码和数据可以直接释放,但PCB要留下,直到里面的退出信息被父进程读取了,然后PCB才能释放。
  • 如果父进程不读取,那僵尸状态会一直存在,task_struct 对象也会一直存在,会占用内存,即内存泄漏。

在这里插入图片描述

一般父进程是不会自动读取子进程的结束信息的,但 bash 会自动读取,所以我们没有手动读取程序的结束信息也没有内存泄露。

孤儿进程

  • 父进程死亡的子进程,就称为孤儿进程
  • 如果父进程先子进程挂掉,那子进程的 PCB 就无法释放了,为了避免这种情况,子进程会被另一个父亲领养(一般是被 1 号进程(操作系统)领养)。

本文到这里就结束了,如果对您有帮助的话,可以给个赞支持一下哦,如果有哪里有错误,欢迎指正。

http://www.lryc.cn/news/421717.html

相关文章:

  • 【设计模式】六大基本原则
  • Selenium网页的滚动
  • 图算法系列1: 图算法的分类有哪些?(上)
  • 零样本学习——从多语言语料库数据中对未学习语言进行语音识别的创新技术
  • ViewStub的原理
  • 十一、Spring AOP
  • 【网络】IP的路径选择——路由控制
  • Unity动画模块 之 2D IK(反向动力学)
  • 关于kickstart自动安装脚本以及dhcp的设置
  • AWS云服务器选择最佳区域
  • Unity Android端截图保存并获取展示
  • linux高级编程——文件IO
  • windows C++-在 C++/WinRT 中使用委托处理事件(下)
  • 【实用工具】Stirling-PDF: 优质开源的PDF处理工具/编辑工具-含入门安装教程
  • opencv 深度图视差图可视化案例
  • Golang | Leetcode Golang题解之第330题按要求补齐数组
  • 算法训练(leetcode)第五十二天 | Bellman_ford 队列优化算法(SPFA)、BF算法判断负回路、BF之单源有限最短路(有负回路)
  • SpringBoot中整合RabbitMQ(测试+部署上线 最完整)
  • 算法板子:线性DP——算出三角形中的最大路径值、求最长上升子序列、求最长公共子序列
  • 【C++】值传递
  • 工业三防平板助力MES系统打造工厂移动式生产管理
  • keepalived+nginx实现的简单高可用故障转移
  • openai api使用
  • 带你走进haproxy的世界
  • STM32--中断使用(超详细!)
  • 【深度学习实践】基于深度学习的图像去雾算法-ChaIR-实践
  • 《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统
  • crm 销售管理系统有哪些?国内外排名前十盘点
  • package-lock.json 要提交到git吗?
  • 算法学习day32