Linux 下的进程状态

文章目录

一、运行状态

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

运行队列

每个 CPU 都会维护一个自己的运行队列(一个CPU,一个运行队列)。

运行状态和运行队列

二、睡眠状态

S状态

  • S状态(sleeping):可中断睡眠(浅度睡眠)状态。
  • 操作系统在资源紧缺时,可以直接杀死该状态的进程。
cpp 复制代码
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 号进程(操作系统)领养)。

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

相关推荐
NJCloud4 分钟前
TiDB 集群部署与 MySQL 兼容性适配实战
linux·运维·数据库·mysql·tidb
2401_868534786 分钟前
UNIX常用命令英文全称与中文解释整理
linux·运维
FL16238631291 小时前
室内易燃物识别易燃评估室内易燃程度识别分割数据集labelme格式1015张85类别
java·服务器·前端
阿祖zu1 小时前
开源项目-让本地 Codex 临时接管远程 Linux 服务,实现快速运维
linux·gpt·agent
Android系统攻城狮3 小时前
Linux PipeWire深度解析之pw_factory_create_object调用流程与实战(七十二)
linux·音频进阶·pipewire音频进阶
lsh曙光3 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
START_GAME3 小时前
MSSQL$SQL2016
java·服务器·前端
lengjingzju4 小时前
编译与调试完全指南—第14章 系统配置与调优
linux
ly76894 小时前
Docker 从入门到实践:镜像、容器、Dockerfile 与 Docker Compose 详解
运维·docker·容器
大鹏的NLP博客5 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译