Linux进程状态

news2024/11/25 18:43:59

目录

一、普适操作系统的进程状态

1.什么是进程状态

2.三种重要的进程状态

(1)运行状态

(2)阻塞状态

(3)挂起状态

二、Linux源代码中的进程状态

三、Linux进程状态

1.运行状态

2.睡眠状态(S)

3.磁盘休眠状态(D)

4.暂停状态(T)

5.追踪暂停状态(t)

6.僵尸状态(Z)

7.死亡状态(X)

四、两种特殊进程

1.僵尸进程

2.孤儿进程


一、普适操作系统的进程状态

1.什么是进程状态

前面说过,一个程序被加载到内存变成进程后,操作系统为每一个进程创建PCB,利用进程的数据对其进行管理。而进程状态,在本质上就是PCB内部的一个整形变量,不同的整形值就对应不同的进程状态,不同的进程状态也指示了操作系统对进程的不同管理方式。

如果站在操作系统这个学科的角度,进程状态会有很多,最常见的有:运行、挂起、阻塞、就绪、等待、死亡等等。

2.三种重要的进程状态

这么多的状态中最重要三种是:运行状态、阻塞状态和挂起状态。

(1)运行状态

操作系统为了合理分配CPU以及各种硬件资源,保证各个进程的正常运行。操作系统会为CPU创建一个进程队列,也为每一个硬件都创建一个等待队列。

而某一个进程处于运行状态本质上就是操作系统将该进程对应的PCB放入CPU的运行队列中,然后再将PCB中维护进程状态的变量修改为相应的值。

PCB里面有进程的各种属性值,以及对应的代码的地址。所以CPU从运行队列中找到PCB取出数据后,可以根据数据得到进程的各种属性值和指令,然后执行相应代码。进程处于运行状态并不意味着该进程此时一定正在被运行,只要该进程处于CPU的运行队列中即可。

注意:CPU是处理数据的速度在纳秒级,运算速度非常快,所以只要进程处于CPU的运行队列中,我们就可以认为该进程正在被运行。

(2)阻塞状态

CPU处理数据的速度极快,是我们计算机中的各种硬件处理数据的万倍,而且一个磁盘或者一个网卡同时只能为一个进程服务,但是在计算机中需要使用这些硬件资源的进程会有很多。

如果在硬件为一个进程服务时,有其他运行中的进程也需要使用该硬件资源,操作系统就会将该进程的PCB放入硬件的等待队列中,进程会等待硬件来为自己提供服务。

由于多个进程需要访问某种硬件,进程PCB在硬件等待队列中等待硬件服务自己的状态就被称为阻塞状态。阻塞状态在本质上就是将进程的PCB从CPU的运行队列中,放入硬件的等待队列中,然后将PCB中维护进程状态的变量也会修改为相应的值。当该进程获得对应的硬件资源服务时,再将该进程放回CPU的运行队列中。

注意:并不是只有等待硬件资源的进程才处于阻塞状态,一个进程等待另一个进程就绪、一个进程等待软件资源就绪等也是阻塞状态。

(3)挂起状态

上面我们学习了阻塞状态,处于阻塞状态的进程由于需要等待某种资源,所以它对应的代码和数据在短期内不会被处理(这里的短期指的是对于操作系统而言)。但它们的数据仍储存在内存中,占用存储空间但是执行,相当于浪费了内存资源。而如果当前操作系统处于高IO(大量向内存输入和向外部设备输出数据)的情况下,可用的内存空间不足,操作系统就会选择性的将这些处于阻塞状态的进程对应的代码和数据转移到磁盘中,从而节省出内存空间。

这种由于内存空间不足,操作系统将在等待资源的进程对应的代码数据放到磁盘中以节省内存空间的状态就被称为挂起状态。挂起状态不会移动进程的PCB,只会移动进程对应的代码和数据。

挂起并不是释放进程,因为对应的PCB仍然在硬件的等待队列中,当该进程获得对应的资源服务以后,操作系统仍然可以将该进程对应的代码和数据从磁盘加载到内存中来继续运行,其本质是对内存数据的唤入唤出。

所以说,阻塞不一定挂起,但挂起一定阻塞。

二、Linux源代码中的进程状态

为了认识正在运行的进程,我们需要知道进程的不同状态。一个进程可以有几个状态,在Linux内核里就已经定义好了(进程有时候也叫做任务)。下面的状态在kernel源代码里定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

 R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠

(interruptible sleep))。

D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程,进程就被暂停了。这个被暂停的进程也可以通过发送 SIGCONT 信号让进程继续运行。

t追踪状态(tracing stop):“跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作,比如在gdb中对被跟踪的进程添加一个断点。

Z僵尸状态(zombie):在一个进程执行完毕时,需要有另一个进程来回收该进程执行完毕后的属性数据然后,如果这个回收数据的进程没有来得及回收进程的数据,这个执行完毕的进程就处于僵尸状态。

X死亡状态(dead):这个状态只是一个返回状态,表明进程资源已经被回收,你不会在任务列表里看到这个状态。

三、Linux进程状态

1.运行状态

就像我们在银行柜台前排队一样,CPU也有一个运行队列,当一个进程的PCB被加载进这个运行队列时这个程序就处在运行状态,但是处于运行状态不代表它此时就一定在执行。

下面是一个不断加一的代码,将它编译并执行

查看进程时我们可以看到./test进程处于R+状态,也就是前台运行状态

2.睡眠状态(S)

我们在原来的代码上加上打印

运行并查看进程,此时进程的状态就是睡眠状态。由于硬件的读写速度和CPU差了万倍,所以在大部分时间里这个进程都在等待屏幕这个外设,进程也就处于睡眠状态。

3.磁盘休眠状态(D)

这是一个很特殊的状态,如果一个进程中,有大量的数据需要存放到磁盘上,这个进程的PCB同样会被操作系统放在磁盘的等待队列中。但是因为数据量非常大,磁盘的读写速度又很慢,所以PCB需要等待很长的时间才能等到磁盘的应答信号。

如果此时,内存中又加载进来很多进程时,内存空间就会很吃紧。此时操作系统为了维护计算机的正常运行,就会将一些长时间处于睡眠状态的进程直接杀掉。这种向磁盘传送大量数据的进程就很有可能会被杀掉。

当磁盘准备好为这个进程存储数据时,它就会向内存中原本的进程发送应答信号,但是此时这个进程已经被操作系统杀掉了,所以就无法接收信号也无法给出相应的指示。磁盘没有收到指示后只能将这些数据弃用,如此一来就会导致巨量的数据丢失。如果这些数据是在服务器上的客户数据,就会导致很大的损失。

所以操作系统设置了深度睡眠状态,相当于一块免死金牌,一旦D状态进程加载进来,我们用Ctrl+c和kill -9都不能杀死它,甚至操作系统内部也不能杀死它,也就只有断电可以杀死这个进程了。

我们如果不去做服务器开发就会很难接触到这个状态,演示的高IO可能回导致机器的崩溃,在这里也就不演示了。

4.暂停状态(T)

顾名思义,当进程运行到一半被暂停时就处于这个状态。

我们再次运行上面的那段代码,这个进程处于睡眠状态。我们用kill -19暂停它,再次观察就会发现进程状态变成了T,进程被暂停了。

使用kill -18指令继续执行后,暂停状态的进程又变成了睡眠状态,T又变成了S,进程继续运行

5.追踪暂停状态(t)

一个被暂停的进程同时被另一个进程追踪,这个进程就处于追踪暂停状态。

将上面的程序重新编译,生成带有调试信息的Debug版本。

在10行处添加一个断点,然后执行代码,此时程序在执行到第10行的时候就会停下来,此时这个进程就处于追踪停止状态,对应下图的小写t。此时gdb也在运行,在追踪这个进程的运行,在等待用户的下一步指示。

现在这个被调试进程被暂停且被gdb跟踪,它的状态是追踪暂停状态。

6.僵尸状态(Z)

僵尸状态也叫僵死状态,它是在进程在死亡状态之前的状态。当一个进程运行完毕、出现问题或者被杀掉以后,它所占用的内存资源和退出状态没有被它的父进程回收,此时这个进程的状态就称为僵尸状态。

下面的讲解中我会详细讲解僵尸进程,就不再这里过多赘述。

7.死亡状态(X)

当一个进程执行结束或者是被操作系统杀掉,它的PCB被操作系统删除,并且对应加载到磁盘上的二进制代码也被删除,此时这个进程就处于死亡状态了。

当一个进程占有内存的所有资源被回收以后,这个进程就处于死亡状态。进程的死亡状态是看不到的,因为只有在回收完成的那一刻才会出现,PCB不存在也就搜索不到这个进程,所以也无法演示。

四、两种特殊进程

1.僵尸进程

当一个进程运行完毕时,它所占用的内存资源和执行的退出状态需要被它的父进程回收。如果父进程没有回收这些东西,这个进程就是僵尸进程。如果父进程长时间不回收进程数据,那么这个进程将长期处于僵尸状态,其PCB和代码依旧存储在内存中,占用空间但是不会被执行。

我们写一个代码:

父子进程同时运行,我杀掉子进程,子进程就停止运行了,但此时父进程还在忙着执行自己的代码,也就回收不了子进程的空间与返回状态,所以此时子进程就处于僵尸状态了,注意下面大写Z。

进程的占用的内存与退出结果对操作系统而言十分重要,不管成功还是失败子进程都要告诉它的父进程自己的任务完成得怎么样了。但是如果父进程一直不读取这些数据,那子进程既不执行也占用空间,也就会一直处于Z状态。

只要进程没有死亡进程基本信息就不会被清除,所以保存数据的PCB就会继续被操作系统维护。

如果一个父进程创建了很多子进程,子进程执行完毕后就是不回收,进程的PCB和执行完毕或者因错误终止的代码就会一直储存在内存中,就会造成内存资源的浪费。这很类似于我们C/C++中的内存泄漏问题。

2.孤儿进程

孤儿进程是指操作系统中父进程先于子进程退出,父进程死亡,子进程就没有了父进程,这时的子进程就会变成孤儿进程。但是父进程的死亡不代表孤儿进程就永远没有了父进程,每一个孤儿进程都会在第一时间被操作系统的一号进程领养。

我们用相同的代码,这次我们杀死父进程

杀死父进程,查看进程状态

 我们可以发现子进程(pid:6374)的父进程pid变为了1,也就是说子进程会被1号进程收养,并在子进程执行完毕后回收它的空间和执行返回值。

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

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

相关文章

AI加速(九): 深度理解吞吐量和延时

前文回顾: AI加速(二)| 计算机存储和计算的分离 AI加速(三)| 每条指令都是流水线的工人 AI加速(四)| 衣柜般的分层存储设计 AI加速(五)| 一个例子看懂流水——从指令到…

Java多线程之Thread和Runnable以及Callable接口多线程的简单实现(适合小白入门,十分简单)

Java多线程之Thread和Runnable一、介绍1、程序2、进程3、线程4、整体思路5、注意二、Thread1、思路流程2、样例代码3、多线程下载图片三、Runnable1、思路流程2、样例代码3、多线程下载图片四、Callable接口(仅作了解)1、具体流程2、优点3、样例五、两者…

视频编解码 — SVC可伸缩性

目录 SVC分层 时域SVC 空域SVC 在一对多的情况下,根据每个接收端的带宽不同,灵活调整发送码率 SVC分层 第0层,最底层,可以独立进行编解码,不依赖第1,第2层第1层,依赖于第0层第2层&#xff…

Linux中的/proc文件系统详解(C/C++代码实现)

Linux /proc这个特殊的目录包含有关Linux系统的所有详细信息,包括其内核、进程和配置参数。通过研究/proc目录,可以了解Linux命令的工作原理,甚至可以执行一些管理任务。 走进Linux的/proc目录 今天,我们将查看/proc目录并熟悉它…

最新版 苹果 IOS AppStore证书申请全流程 包括p12文件

第一步 登陆开发者网站并进入证书管理页。 辅助工具网站地址:http://www.applicationloader.net/ 第二步 添加【Certificates】证书。在这里插入图片描述 第三步 进入添加页后,根据需求选择。 第四步 选择好环境之后,这里需要选择一个…

GitHub上传本地程序操作的问题解决汇总

1、新建远程仓库 2、提交本地程序到GitHub 完整命令汇总,这些命令的顺序已解决目前Git提交所遇到的下面问题 存在的问题展示部分没贴出来,可以先按命令顺序走一遍流程。 git init //把这个目录变成Git可以管理的仓库git checkout -b main //切换至main默…

如何零基础自学 Python ?听我娓娓道来

如何零基础自学 Python ? 前言 今天这篇文章是对初学者的一篇学习资料分享与总结! 简单介绍下笔者的自学之路 起初学习 Python 是在 2020 年,那时临近毕业,由于面临着找工作的不确定性,便学习了相关的网络安全知识&…

计组作业笔记【 总线 】

系统总线按传输内容不同分为数据总线,地址总线,控制总线。 片内总线与系统总线是并列关系,与通信总线一同作为总线按功能的分类。 所以选B 总线复用是指一种信号线在不同时间传输不同的信息。 所以该题选A。 当某设备正获得了总线控制权时…

系统安装技能测试

系统安装技能测试 目录 系统安装技能测试 一、制作PE U盘 安装完成之后查看U盘是否有PE 使用制作好的U盘进入PE界面 二、使用虚拟机进入PE界面 虚拟机成功进入PE主界面 三、PE界面进行分区操作 在PE模式下,使用ISO进行系统安装 四、PE系统备份 五、使用PXE进行网克…

Springboot毕业设计毕设作品,微信校园疫情防控小程序设计与实现

功能清单 【后台管理员功能】 关于我们设置:设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信…

基于51单片机GPS定位系统设LCD12864显示(程序+原理图+PCB+论文)

资料编号:202 功能介绍: (1).定位功能 GPS通过接收卫星信号,可以准确地定出其所在的位置,位置误差小于10米。利用GPS,在12864上面显示当前位置。 (2).查询时间功能 GPS还可以接收卫星发下来的时间信息,…

【openEuler系列】配置本地yum源

个人名片: 对人间的热爱与歌颂,可抵岁月冗长🌞 Github👨🏻‍💻:念舒_C.ying CSDN主页✏️:念舒_C.ying 个人博客🌏 :念舒_C.ying 【openEuler系列】配置本地y…

漏洞深度分析|Apache Fineract 远程代码执行漏洞

项目介绍 Apache Fineract 是一个开源的系统,用于核心银行系统平台化建设。为创业者、金融机构和服务提供商提供了一个可靠、健壮的、可负担得起的金融服务解决方案。 项目地址 https://github.com/apache/fineract 漏洞概述 Apache Fineract 在 1.8.1 之前的版…

NR DCI Format介绍

NR DCI(下行控制信息)与LTE中的DCI类似,均是承载上/下行数据信道的调度信息(如PDSCH/PUSCH)。 如下表,摘自38212 7.3.1节。其中0-0/0-1承载上行数据信道PUSCH的调度信息。1-0/1-1承载下行数据信道PDSCH的调度信息,加扰…

QT断点调试[通俗易懂]

QT设置断点调试: 1、知道哪里可能出问题2、完全不清楚自己程序bug在哪3、跳过肯定不会出错的地方 前言: 这个东西难道大家不都应该会吗??? 本人用Qt Creator编写Qt的,~ 当然是有大佬用记事本写Qt的hhhh,每个人用IDE或者编辑器…

Python中__init__.py的作用介绍

一、文件__init__.py作用:package / module 的标志 下图的serrors包含这个文件时候,Python会将其当做一个模块(module)来处理,进而可以使用from serrors import xx方式导入serrors包中的文件或模块。 如图所示&#x…

Linux的IO(初阶)

Linux的IO(初阶) 文章目录Linux的IO(初阶)1.C语言文件IO1.1 C语言文件的(复习)1.2 相对路径与绝对路径(复习)1.3 C语言中文件操作函数(复习)1.4 C语言文件写入方式(复习)1.5 三个默认打开的流1.6 FILE类型的理解2.Linux系统文件IO2.1 打开文件的系统接口函数:open2.…

2023年,学测试还有前途吗?

最近因为疫情等各种原因,大厂裁员,失业等等频频受到关注。 不解释,确实存在,各行各业都很难,但是,说软件测试行业没有前途,我还真不认同(不是为培训机构说好话,大环境不…

面向对象编程 上 (1)

目录 学习面向对象内容的三条主线 面向过程与面向对象 面向过程(POP) 与 面向对象(OOP) 面向对象的三大特征 例子:人把大象装进冰箱 面向对象的思想概述 类和对象 面向对象的思想概述 Java类及类的成员 类的语法格式 创建Java自定义类 对象的创建和使用 类…

2022最新的护眼灯怎么选?护眼台灯到底有用吗

众所周知,人眼能看到各种事物,都是由于光线照射到物体身上,然后反射进入人眼成像,但是如果光线不合理或者不合适,那么进入人眼的光线就会对造成巨大的伤害。所以护眼灯到底有没有用,就在于其发出的光线能不…