【Linux】进程状态

冉升5个月前行业资讯160

一、进程三状态转换

740871b083bb46afb96c5be22a7981c5.png

·新建态:操作系统已经分配了资源给进程了。

·就绪态:已经具备了执行的所有必有的条件,但是由于各种原因,暂时无法运行,进程进入就绪状态。

·运行状态:当进程处于调度队列当中的时候就处于运行状态。

·阻塞状态:当执行进程时,遇到代码中有scanf的时候,但是又迟迟没有接收到键盘的信息的时候,这时候会出现阻塞状态,当重新接收到键盘信息的时候,这时候会重新回到就绪态,马上到运行态。

·终止态:当一个程序运行完了的时候这个进程就进入终止态。


这一系列状态到底是如何完成的呢?

e785a2dcba864edaa15f5d0405daa8b9.png

操作系统会提供一个运行队列用来运行这些进程,为了后续讲解,首先应该先了解一下下面的概念:


1.并行和并发

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

并行很容易理解,那什么是并发呢?并发中讲到了一个概念就是进程切换,首先我们要知道,很多电脑都是一个CPU的,那只有一个CPU是如何完成如此之多了的进程呢?就拿我们的电脑为例,我们的电脑是如何同时打开多个程序的呢?其实CPU在调度进程的时候,不是一下就把一个代码跑完的,而是以时间片为单位来跑代码的,比如我们写代码的时候,遇到死循环了,或者遇到scanf时我们不输入了,其他程序还是照样能跑,就是这个原因。具体我们拿一个图来说。

5881198206b34316a35b1546b9cf155e (1).png


当上面的运行队列的队首的进程运行完一个时间片之后会被抽离出来然后插入到队列尾运行下一个进程,这样循环往复。并发就是这样循环往复的一个过程。

什么是时间片:时间片就是操作系统分配给系统中每个进程用于执行的时间片段。执行完一个时间片之后立马调到下一个进程执行下一个时间片。

等待的本质:什么是等待,当我们的程序中的代码遇到scanf的时候,这就是一种等待,那么操作系统是如何处理这种状态的呢?

a0c70752d0dc489eacfa41354bf9d112.png

在操作系统的下层有很多硬件设备与操作系统交互,当遇到scanf的时候,如果迟迟得不到键盘的信息,这时候不会连入到运行队列尾,而是连入到struct_device队尾,这里struct_device中存在一个wait_queue用来存储等待的进程。等待对应的硬件准备好后,就可以重新排入到运行队列中了。

所以等待的本质就是将进程的PCB连入到对应的硬件的队列当中。

二.Linux进程状态

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 */
};

上面就是Linux中进程的七种状态。

R状态

我们写一段死循环代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
  int count=0;
  while(1)
  {
    //scanf("%d",&count);
   // printf("hello world,cnt : %d \n",count);
    //sleep(1);
  }
  return 0;
}

ed6e1a0bed9c40ea8aa68e0f1720edfc.png可以看见上面代码是R运行状态。
我们把打印加上:

6fc47c3e1a40406a9b45ffb66872ffa3.png

可以发现状态变成了休眠状态。
为什么呢?
因为我们printf是在内存中写入,如果一直写,当缓冲区会写满,这导致显示器不是常常在线的。

S状态

S状态是可被中断的休眠状态,类似于浅睡眠

D状态

D状态是不可被中断的休眠状态,类似于深睡眠

如何暂停进程

18和19, 18进程继续,19是进程暂停。

可以看见进程被暂停了

可以看见进程处于暂停状态。

进程继续:

4.png可以看见进程状态虽然是S但是后面少了一个+号,这是由前台进程转换为了后台进程,这时我们再在前面用ctrl+c就结束不了进程了,只能用kill来杀死后台进程(后台不能用ctrl+c来杀死

5.png


t状态

当一个进程被追踪时,断点停下就是t状态。

x状态

x状态是死亡状态,当一个进程已经终止并且已经中系统中完全清除。

Z状态

z状态是僵尸状态,与死亡状态不同,z状态是指进程已经终止但父进程还没有还没有读取其退出信息的一种状态。

三.总结

通过对进程状态转换和 Linux 进程状态的分析,我们了解了操作系统如何通过不同的状态管理进程的执行。进程的三种基本状态转换解释了进程从创建到结束的生命周期,而 Linux 系统中常见的 R、S、D 等状态则细化了进程在运行、等待以及阻塞中的具体表现。这些知识不仅帮助我们理解了系统的运行机制,也为解决系统性能调优、进程管理等实际问题提供了理论基础。掌握这些进程状态,对于操作系统调试与开发者都是非常重要的一步。

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        

原文链接:https://blog.csdn.net/2301_79969994/article/details/143097583


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ

相关文章

RabbitMQ 进阶1(发送者和MQ的可靠性)

RabbitMQ 进阶1(发送者和MQ的可靠性)

我们可以通过 MQ 异步调用,来使程序的性能更好和解耦合。但是如果 MQ 的消息没有成功的被对应的程序处理,那么这样不就会造成数据不一致的情况。因此,我们这里必须要尽可能的确保 MQ 消息的可靠性,即...

【网络】NAT、代理服务、内网穿透(2)

【网络】NAT、代理服务、内网穿透(2)

2.代理服务器代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理。(1)正向代理正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并...

【Docker】深入理解 Dockerfile:构建高效 Docker 镜像的指南

【Docker】深入理解 Dockerfile:构建高效 Docker 镜像的指南

Dockerfile 是 Docker 的核心组成部分之一,它定义了如何构建 Docker 镜像。Dockerfile 是一份文本文件,其中包含了构建 Docker 镜像所需的所有命令和参数。通过 D...

【Docker】深入了解 Docker:终极命令指南(下)

【Docker】深入了解 Docker:终极命令指南(下)

5. 网络管理Docker 网络使得容器之间的通信变得简单。以下是管理网络的基本命令:5.1 创建和管理网络命令 说明 示例docker network create <network>...

大数据平台之数据存储

大数据平台之数据存储

1.大数据生态技术数据存储处理: 清洗, 关联, 规范化, 组织建模, 通过数据质量的检测, 数据分析然后提供相应的数据服务离线数仓:实时数仓:以Kafka, cancal/Maxwell/Flink...

Docker:技术架构的演进之路(上)

Docker:技术架构的演进之路(上)

前言一、前言技术架构是指在软件开发和系统构建中,为了满足业务需求和技术要求,对系统的整体结构、组件、接口、数据流以及技术选型等方面进行的详细设计和规划。它是软件开发过程中的重要组成部分,为开发团队提供...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。