【Linux】进程状态详解

news/2025/2/12 3:41:36/

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本篇导航

  • 0. 五状态进程模型
  • 1. 运行 >> R (running)
  • 2. 浅度睡眠 >> S (sleeping)
  • 3. 深度睡眠 >> D (disk sleep)
  • 4. 暂停 >> T (stopped)
  • 5. 僵尸 >> Z (zombie)
  • 6. 进程优先级

在这里插入图片描述

0. 五状态进程模型

这是操作系统中的五种状态.其中新建状态和退出状态不是很重要,所以通用的为三状态模型也就是:就绪态,阻塞态,运行态

  • 就绪态:需要CPU的进程已经完成了资源调度,在等待分配到CPU
  • 运行态:在CPU上运行的进程所处的状态
  • 阻塞态:因缺少某种资源(例如IO资源,磁盘读写)正在等待的进程

image-20231105230151777

操作系统中这三个状态是理论的,在实际应用中的操作系统围绕这三个状态的核心状态延伸出了许多状态.接下来来看看Linux操作系统中的各种状态.

  1. 运行 “R (running)”
  2. 浅度睡眠 “S (sleeping)”
  3. 深度睡眠 “D (disk sleep)”
  4. 暂停 “T (stopped)”
  5. 僵尸 “Z (zombie)”
  6. 死亡 “X (dead)”

1. 运行 >> R (running)

顾名思义,为正在占用CPU运行的进程.也为操作系统中的运行态

我们写一个这样的程序,让该进程陷入死循环,更方便观察.

#include <stdio.h>
int main()
{int cnt = 0;while(1){cnt++;}return 0;
}
gcc -o proce proce.c

运行起来后,我们用观察进程的ps指令看看

ps -ajx | head -1 && ps -ajx | grep porce

可以观察到如下情况:

image-20231105232021997

其中STAT表示该进程的运行状态为R

但这里并不是时时刻刻CPU都在运行这个进程的.CPU当中有一个 时间片 的概念,操作系统也维护了一个 运行队列,将所有R状态的进程都放在运行队列上.当一个时间片过后,就执行 进程切换(将进程从CPU上拿下来,换一个在运行队列当中的进程上去).

这是一个并行的过程:在物理上是分段进行,在逻辑上是同时发生

4a00b4c200024fd770aa18fd0e50da4

2. 浅度睡眠 >> S (sleeping)

为操作系统中的阻塞态,因在等待某种资源而无法被CPU调度

将上方的程序进行修改,加入一个printf即可观察.因为CPU运行比IO快很多很多,所以需要IO的进程大多时间都在等待IO.可以观察到S状态

#include <stdio.h>
#include <unistd.h>
int main()
{    int cnt = 0;    while(1)    {        printf("hello\n");sleep(1);}    return 0;
}

image-20231105234438109

printf()实际上是封装了系统调用,能访问硬件资源.在进程中每个硬件资源都维护了一个等待队列.

447731e52ec7482c0a1e5714cbdc4dd

需要访问硬件资源的进程,大多时候都处在等待队列中.(因为CPU一下就处理完了)

3. 深度睡眠 >> D (disk sleep)

为操作系统中的阻塞态,因在等待磁盘资源而无法被CPU调度

设想一个这样的场景:

进程给磁盘发送了一个写入的指令,磁盘正在工作.此时进程正在等待磁盘给反馈信号(是否完成作业).突然操作系统内内存不足,需要释放一部分处在阻塞态的进程,这时若释放这种进程.那么磁盘写入丢失了怎么办呢?

所以引入了一个特殊的阻塞态,该状态无法被操作系统调度.仅能根据磁盘反馈的信号做出相应动作(重写 or 停止).不响应任何其他请求

4. 暂停 >> T (stopped)

为操作系统中的阻塞态,这是一种主动让进程停止的状态.

例如我们之前使用的gdb调试.程序运行到我们打的断点时,都相当于给进程发送了一个暂停信号.重新运行的时候再次发送一个继续信号.

我们输入

kill -l

查看kill所有信号

image-20231106100318358

其中18号命令 SIGCONT为继续信号, SIGSTOP为停止信号.

我们运行之前能在屏幕上输出Hello的进程.对其发送停止信号

kill -18 843951

image-20231106100816680

可以直观的看到,提示进程843951被暂停了.我们再使用18号指令让进程继续运行

kill -18 843951

image-20231106101516859

5. 僵尸 >> Z (zombie)

其为处于退出态的前一种状态

一个人在路上跑步,突然间猝死了.警察来先调查原因,将原因告知家属,再通知处理尸体

虽然例子有点抽象.但很形象.进程发出结束信号时,需要先将自己的结束状态告诉家属(父进程)是否正常结束等…

此时进程处在的就是僵尸状态.

编写以下代码创建一个进程,子进程比父进程更快回收.可以清楚的观察到僵尸

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id == 0){int cnt = 10;while(cnt--){printf("i am a child process my pid %d\n",getpid());}exit(0);}int cnt = 20;while(cnt--){printf("i am a father process my pid %d\n",getpid());}return 0;
}

image-20231106103451282

当子进程先退出后处在僵尸状态,会等待父进程进行回收.父进程结束后,会自动回收子进程一起带走.

那如果父进程比子进程先结束呢?

上次我们说到 所有进程的父进程都是bash.所以一个进程成为了孤儿进程(父进程比子进程早结束),此时就会将自己的父进程转为bash.

6. 进程优先级

因为资源是有限的,进程是多个的.所以注定进程间具有优先级的概念.

ps -alx | head -1 && ps -alx | grep porce

image-20231106104450230

其中PRI与NI就是进程优先级与NICE值.

有这样的计算公式: **PRI(新)=PRI(旧)+NICE **

其中PRI旧永远都是从80开始,值越小优先级越大,NICE取值范围为[-20,19]

可以在ROOT权限下使用top命令调整NICE值,进而改变某进程的优先级

具体的为:先运行top,然后输入r即可调整

在运行队列中,会维护两个优先级队列,一个为等待队列,一个为当前正在运行的队列.

struct runqueue{bitmap isempty;task_struct **run;task_struct **wait;task_struct *running[140];task_struct *waiting[140];
};

r即可调整

在运行队列中,会维护两个优先级队列,一个为等待队列,一个为当前正在运行的队列.

struct runqueue{bitmap isempty;task_struct **run;task_struct **wait;task_struct *running[140];task_struct *waiting[140];
};

其中run指针指向当前正在运行的队列,其按优先级进行分级.依次从下往上运行.
在此过程中,若有新的进程加入运行队列,则会被放在等待队列中.
当运行队列运行完毕时,则将run指针与wait指针互换.原运行队列变为等待队列,等待队列变为运行队列.

image-20230905164632777


http://www.ppmy.cn/news/1201406.html

相关文章

pytorch复现_UNet

什么是UNet U-Net由收缩路径和扩张路径组成。收缩路径是一系列卷积层和汇集层&#xff0c;其中要素地图的分辨率逐渐降低。扩展路径是一系列上采样层和卷积层&#xff0c;其中特征地图的分辨率逐渐增加。 在扩展路径中的每一步&#xff0c;来自收缩路径的对应特征地图与当前特征…

useContext本身并不能直接向下传递方法,

useContext本身并不能直接向下传递方法&#xff0c;但可以通过将其包装在自定义 hook 中来实现。 例如&#xff0c;假设你有一个 context 叫做 MyContext&#xff0c;其中包含一个函数叫做 myFunction。你可以创建一个新的 hook 来暴露这个函数&#xff1a; jsx import { use…

【微服务】一体化智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

基于点云的深度学习方法综述

基于点云的深度学习方法综述_点云深度学习_视觉先锋的博客-CSDN博客 我们生活在一个三维世界里&#xff0c;自从1888年相机问世以来&#xff0c;三维世界的视觉信息就通过相机被映射到二维图象上。但是二维图像的缺点也是显而易见的&#xff0c;那就是缺少深度信息以及真实世界…

ifream标签中的子页面,操作父页面的元素

问题描述&#xff1a;子页面内容发生变化时&#xff0c;导航栏不会跟切换 解决办法&#xff1a; window.parent.document.getElementById demo html1 <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesh…

Linux Vim撤销和恢复撤销快捷键

使用 Vim 编辑文件内容时&#xff0c;经常会有如下 2 种需求&#xff1a; 对文件内容做了修改之后&#xff0c;却发现整个修改过程是错误或者没有必要的&#xff0c;想将文件恢复到修改之前的样子。 将文件内容恢复之后&#xff0c;经过仔细考虑&#xff0c;又感觉还是刚才修改…

Mac安装opencvJava踩坑

SpringBoot导入opencv依赖 先将jar包添加到libraries中在resources目录下创建lib文件夹并复制jar包到这里添加如下依赖&#xff0c;并刷新maven <dependency><groupId>org.opencv</groupId><artifactId>opencv</artifactId><version>4.8.0…

清华交叉信息研究院2024届推免拟录取名单

直博生 硕士 分析 清华交叉信息研究院在推免中共录取直博生41人&#xff0c;其中081200计算机科学与技术24人&#xff0c;物理学17人&#xff1b; 共录取硕士生7人&#xff0c;都是081200计算机科学与技术专业 本文由博客一文多发平台 OpenWrite 发布&#xff01;