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 号进程(操作系统)领养)。

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

相关推荐
CodeYp201915 小时前
第14讲:mmap 实现文件 LRU 缓存
linux·lru·mmap
程序开发阿元15 小时前
一台 20G 的 VPS 被日志吃掉一半:我按这个顺序查了二十分钟
linux·ssh
AOI小白新手上路15 小时前
深度学习算力购置方案分析:本地 RTX 4090 服务器 vs 云端租赁
服务器·人工智能·深度学习
.冰块.15 小时前
流量大了自动加 Pod!K8s HPA 扩缩容与 ResourceQuota/LimitRange 资源管控实战
linux·云原生·容器·kubernetes·hpa·quota·limitrange
千桐科技16 小时前
qKnow智能体构建平台专业版 v3.1.5 发布:扩容工作流编排调用能力,上线Text2SQL插件,拓宽数据类智能应用构建边界
服务器·数据库·oracle·qknow
承渊政道16 小时前
Linux网络学习【深入理解多路转接select、poll的代码改写】
linux·ubuntu·select·多路转接·poll
雪落漂泊16 小时前
Linux进程(四)概念:命令行参数和环境变量篇
linux·运维·服务器
方便面不加香菜16 小时前
Docker Container -- 容器命令详解
运维·docker·容器
NextTech_16 小时前
不想学 vim,怎么改服务器上的配置文件?
服务器·编辑器·vim
qq_3775727716 小时前
linux x86 arm loongarch
linux