【Linux】进程周边002之进程状态

 

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.什么是状态? 

1.1运行

 1.2阻塞

1.3阻塞挂起

2.Linux下具体的进程状态

2.1运行状态-R

2.2可中断睡眠状态-浅度睡眠状态-S

2.3不可中断睡眠状态-深度睡眠状态-D

2.4停止状态-T

2.5死亡状态-X

2.6僵尸状态-Z

2.6.1僵尸进程的危害

2.7孤儿进程


前言

本篇文章博主将会讲解进程状态,之前我们讲到进程是有生命的,所以他在整个生命期间必然会有状态的变化。那么具体而言什么是状态呢?Linux中包含有那些状态呢?


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.什么是状态? 

所谓的状态其实就是task_struct中的一个整型变量。


状态决定了什么?你的后续动作!而Linux中可能会存在多个进程都要根据它的状态执行后续动作,此时就需要排队了。

1.1运行

一个CPU,一个运行队列,也就是说这些进程都需要在CPU这里进行排队,逐个执行。

而排队的是进程么?

其实不是,排队的是进程的PCB(面试时不是你在排队,而是你的简历信息在排队)。

在PCB中存在着多个节点成员,这些节点成员的存在就是为了“先描述再组织”中的组织而存在的。这也就实现了一个task_struct可以被链入多种数据结构中从而进程可以在不改变原有队列的同时,实现在各种各样的软硬件资源提供的队列中排队的操作。


但是就算进程放在了CPU上,也不是一直会运行的。在操作系统管理进程有时间片的概念,一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在Linux上为5ms-800ms),用户不会感觉到。

就好比我们的电脑,某个进程卡死了,而其他进程照常运行的原因就是这。 


 1.2阻塞

当进程在等待软硬件资源的时候(比如等待键盘输入),资源如果没有就绪。

此时task_struct就会被设置为阻塞状态,并链入等待的资源提供的等待队列

没错,这里的等待队列类似于CPU运行队列。

比如:


状态的变迁,引起的是PCB会被操作系统变迁到不同的队列当中。


1.3阻塞挂起

挂起状态的前提是计算机资源已经比较吃紧了。

阻塞挂起:因为等待某种软硬件资源就绪,进程对应PCB由运行队列转至资源下的等待队列时,考虑到内存空间紧张,操作系统会将因为等待而暂时无法运行的进程对应的代码和数据先由内存转移到磁盘中,此时进程即为挂起状态,等到该进程可以被运行时再将对应的代码和数据由磁盘转移回内存中。

当计算机资源比较吃紧时,操作系统一定要确保自身不会因为资源的紧张而崩溃,所以就会将一些等待资源(阻塞)的进程的代码和数据交换到磁盘的swap分区中,这个过程称为唤出。

当需要调度此进程时,就会将磁盘的swap分区中保存的内容换回到内存中,这个过程称为唤入。

注意:交换的是进程的代码和数据,不是PCB!!如果PCB被交换出内存了,那操作系统如何管理呢?

所以当某个进程的代码和数据不在内存中,而被换出到磁盘上时,该进程就为挂起状态。

以上的挂起都为阻塞挂起状态。


思考:swap分区是越大越好么?

磁盘本质是输入输出设备,每次唤入唤出其实都是非常低效的操作,如果swap分区设置的过大,那么操作系统就会十分依赖它,导致出现更多低效IO,这本身就是一种牺牲效率来确保操作系统能够正常运行的行为。

所以swap分区不宜设置的过大,一般为内存大小或内存大小的一半,具体要看不同的操作系统。


2.Linux下具体的进程状态

首先我们来看一下Linux操作系统源码中定义的状态都有哪些:

/*
* 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 *task_state_array[] = {"R (running)",       /*  0*/"S (sleeping)",      /*  1*/"D (disk sleep)",    /*  2*/"T (stopped)",       /*  4*/"t (tracing stop)",  /*  8*/"Z (zombie)",        /* 16*/"X (dead)"           /* 32*/
};

接下来我们逐个介绍以上状态。 

2.1运行状态-R

运行状态(running)并不意味着进程一定处于运行当中,运行状态表明一个进程要么在运行中,要么在运行队列里。

2.2可中断睡眠状态-浅度睡眠状态-S

浅度睡眠状态(sleeping)意味着该进程正在等待某件事情的完成,处于浅度睡眠状态的进程随时可以被唤醒,也可以被杀掉(这里的睡眠有时候也可叫做可中断睡眠(interruptible sleep))。

等同于状态概念中的阻塞状态。        

我们来写段代码测试下:

 首先我们讲程序运行起来,查看一下进程的状态:

为什么是睡眠状态呢?

  • 首先我们知道CPU的运行速度非常快,那他执行printf这段代码的速度也是非常快的,但是printf会调用输出设备,这个过程就会处于阻塞状态(因为CPU的速度远高于输出设备),另外sleep函数也是会处于睡眠状态,所以虽然该进程大部分时间都是处于睡眠状态,而不是运行状态

处于S+状态时,该进程可用ctrl+c结束。

"+"代表是前台运行,无"+"代表后台运行,后台运行时可在命令行继续输入指令并执行,但无法用ctrl+c结束,需要用kill -9 pid杀死。想要后台运行某个程序就在后面加"&",如:./test &


2.3不可中断睡眠状态-深度睡眠状态-D

深度睡眠状态/不可中断睡眠状态/磁盘休眠状态,顾名思义,在这个状态的进程不会被杀掉,哪怕是操作系统也不行,通常会等待IO的结束。

例如,某一进程要求对磁盘进行写入操作,那么在磁盘进行写入期间,该进程就处于深度睡眠状态,是不会被杀掉的,因为该进程需要等待磁盘的回复(是否写入成功)以做出相应的应答。

如果在这个过程中,操作系统能够杀死该进程,那么就有可能丢失数据。

该状态也属于阻塞状态。


2.4停止状态-T

Linux中,操作系统为了防止一些进程做某种危险操作,可能会将进程设置为暂停状态。

我们可以利用SIGSTOP信号使进程进入暂停状态(stopped),发送SIGCONT信号可以让处于暂停状态的进程继续运行。

该状态也属于阻塞状态。 


2.5死亡状态-X

死亡状态只是一个返回状态,当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了,所以你不会在任务列表当中看到死亡状态,死亡状态是一个瞬时过程,我们很难查看到。


2.6僵尸状态-Z

僵尸状态就是在等待退出信息被读取时所处的状态。

在这一状态的进程我们称之为僵尸进程

利用代码进行观察:


为什么要有僵尸状态?

  • 创建进程是希望这个进程给用户完成工作的,子进程必须有结果数据保存在自己的PCB中,在该子进程死亡之前,必须要有父进程读取这些结果数据,读取成功后,子进程才能死亡。

2.6.1僵尸进程的危害

  • 僵尸进程的退出状态必须一直维持下去,因为它要告诉其父进程相应的退出信息。可是父进程一直不读取,那么子进程也就一直处于僵尸状态。
  • 僵尸进程的退出信息被保存在task_struct(PCB)中,僵尸状态一直不退出,那么PCB就一直需要进行维护。
  • 若是一个父进程创建了很多子进程,但都不进行回收,那么就会造成资源浪费,因为数据结构对象本身就要占用内存。
  • 僵尸进程申请的资源无法进行回收,那么僵尸进程越多,实际可用的资源就越少,也就是说,僵尸进程会导致内存泄漏。

2.7孤儿进程

孤儿进程与僵尸进程的情况刚好相反,当子进程的父进程先于子进程退出,那么将来子进程进入僵尸状态时就没有父进程对其进行处理,此时该子进程就称之为孤儿进程。

当出现孤儿进程时,该进程会被1号进程领养(可以认为是操作系统),此后当孤儿进程成为僵尸进程时就由1号进程对其进行读取。


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

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

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

相关文章

Python中的魔力编程:掌握面向对象之道

Python中的面向对象编程 背景: ​ 最近在看一些代码的时候,对类中的一些内置方法不是很懂,因此出一篇文章来细说一下,希望大家看完后对Python中类有一个清楚的认识。 基础铺垫: ​ 面向对象的三个特点:…

深入探索 Spring Boot:简化开发,加速部署的全方位利器

目录 导言 1. 自动配置(Auto-Configuration) 2. 起步依赖(Starter Dependencies) 3. 嵌入式 Web 服务器 4. Actuator 5. 外部化配置 6. 简化的安全性配置 7. Spring Boot CLI 8. Spring Boot DevTools 导言 在当今软件开…

java基础之抽象的概念(全网最详细)

一.抽象的概念 如下图所示: 如上图所示,一个父类为图形,计算图形的面积方法,那么就会有疑问,计算哪个图形的面积呢?所以这个计算图形的面积方法就称为抽象方法; 二.抽象方法和抽象类的格式 …

3、Kafka 线上集群部署方案怎么做?

文章目录 1、操作系统的选择1.1、I/O 模型的使用1.2、数据网络传输效率1.3、社区支持度 2、磁盘的选择3、磁盘容量的规划3.1、举例思考本问题:3.2、计算一下:3.3、规划磁盘容量时你需要考虑下面这几个元素: 4、带宽规划4.1、计算 总结 1、操作…

电商淘宝爬虫API与淘宝官方开放平台API的区别以及如何选择适合自己的API接口

随着数字化时代的到来,数据已经成为企业竞争力的重要因素。为了获取数据,企业或个人常常需要使用API接口。常见的API接口包括爬虫API和官方开放平台API。本文将详细介绍这两种API接口的区别以及如何选择适合自己的API接口。 一、爬虫API与官方开放平台A…

如何使用GaussDB创建外表(FOREIGN TABLE)

目录 一、前言 二、创建外表的特点 二、GaussDB创建外表访问外部数据库表(示例) 1、创建外表 2、FAQ:CREATE USER MAPPING错误 三、GaussDB创建外表映射数据文件(示例) 1、创建数据文件 2、创建外表 3、FAQ&a…

C++基础知识

目录 前言: 命名空间 命名空间的定义 命名空间的使用 c输入与输出 缺省参数 函数重载 引用 引用的特性 常引用 引用的使用场景 引用做参数 引用做返回值 引用与指针的区别 内联函数 内联函数的特性 前言: C 语言是结构化和模块化的语言&…

谈谈MYSQL主从复制原理

目录 概述 要点binlog日志 主从复制过程 总结 概述 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式。从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行&#xff0…

Volatility3内存取证工具安装及入门在Linux下的安装教程

1-1. Volatility3简介 Volatility 是一个完全开源的工具,用于从内存 (RAM) 样本中提取数字工件。支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证。 针对竞赛这块(CTF、技能大赛等)基本上都…

瑞萨RZ/G2L核心板Linux Log目录文件详解

为了排除系统问题,监控系统健康状况以及了解系统与应用程序的交互方式,我们需要了解各log文件的作用,以G2L中yocto文件系统为例,在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下: 1. 文件详情 下图…

Ubuntu系统部署Inis博客并使用内网穿透发布到公网随时随地远程访问

目录 前言 推荐 1. Inis博客网站搭建 1.1. Inis博客网站下载和安装 1.2 Inis博客网站测试 1.3 cpolar的安装和注册 2. 本地网页发布 2.1 Cpolar临时数据隧道 2.2 Cpolar稳定隧道(云端设置) 2.3.Cpolar稳定隧道(本地设置)…

鸿蒙原生应用/元服务开发-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、说明 AbilityConstant提供Ability相关的枚举,包括设置初次启动原因、上次退出原因、迁移结果、窗口类型等。本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口…

matlab 最小二乘拟合平面(拉格朗日乘子法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。博客长期更新,爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y &#

机器视觉系统选型-条形光源分类及应用场景

标准面光源 从平坦发光面照射漫射光 机械零件尺寸测量电子元件、IC的外形检测边缘缺陷检测服装纺织、食品包装检测 中孔面光源 从相机的同轴方向照射漫射光 金属零件缺陷检测金属外壳检测大面积电子元件的字符识别 平行面光源 照射平行度较高的漫射光玻璃瓶直径测量螺钉牙轮…

Android studio 离线配置gradle

Gradle Distributions Gradle Distributions 查看gradle 文件夹下 gradle-wrapper.properties文件中的distributionUrl 版本号 然后在上边网站下载对应需要的gradle对应版本 下载后复制到 gradle wrapper文件下,同时修改 distributionUrl 指向本地文件 然后同步就…

迷你型洗衣机好用吗?口碑好的四款小型洗衣机推荐

随着人们的生活水平的提升,越来越多小伙伴来开始追求更高的生活水平,一些智能化的小家电就被发明出来,而且内衣洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多,所以我们对内衣裤的清洗频次会高于普通衣服,…

轻量封装WebGPU渲染系统示例<47>- 多种光源(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MultiLightsShading.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export class MultiLightsShading {private mRscene…

STM32 DAC+串口

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、DAC是什么?二、STM32 DAC1.什么型号有DAC2. 简介3. 主要特点4. DAC框图5. DAC 电压范围和引脚 三、程序步骤总结 前言 提示:这里可…

Runtime

Runtime 概念: Runtime是一套底层纯C语言API,OC代码最终都会被编译器转化为运行时代码,通过消息机制决定函数调用方式,这也是OC作为动态语言使用的基础。Runtime的最大特征就是实现了OC语言的动态特性。 消息机制原理 在Objec…

代码随想录27期|Python|Day13|栈与队列|239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)

239. 滑动窗口最大值 单调队列 滑动窗口中的队列一直保持出口大,入口小的顺序。(图:代码随想录) 1、每次有新的元素进入(也就是滑动窗口移动后),都需要先和入口的元素比较大小,如果…