Linux---进程(3)---进程状态
目录
进程排队
进程状态
运行状态
阻塞状态
挂起状态
Linux内核具体进程状态
浅度睡眠状态
运行状态
深度睡眠状态
暂停状态
可被追踪的暂停状态
终止状态
僵尸状态
进程排队
进程不是一直在运行的,进程放在了CPU上,也不是一直运行的。
进程可能在等待某种软硬件资源给它输入输出数据。
当进程被放在被CPU执行时,不是等CPU执行完成之后再将其拿下来,而是在规定的时间内执行,只要时间一到,不管这个进程执行完成还是未完成,都要从CPU上拿下来,让CPU执行其他进程。这个规定的被CPU调度执行的时间被称为时间片。
进程排队,一定是在等待着某种资源。比如等待被CPU执行、等待被内存读取、等待被磁盘读取写入。
为什么要进行进程排队,因为在计算机中,硬件是少数,进程是多数,每个进程要想都被执行,就只好排队了。
我们知道,进程=task_struct(PCB)+可执行程序。进程排队实际上是进程中的task_struct在排队。一个task_struct可以被连接在多种数据结构中。
下面来看一下一个task_struct如何被连接在多种数据结构中?
实际上,在内存中,操作系统对进程的管理是这样的。
在task_struct(PCB)内部对象中,定义一个连接节点,由连接节点之间再互相连接,将进程PCB连接起来。此后,操作系统对进程的管理,就转化为了对维护的这个链表进行管理了。
那么通过这个节点的地址,如何获取该PCB节点的首地址呢?
初始地址是连接节点的地址,利用上述两种方法就可以计算出偏移量,从而拿到PCB首元素地址,访问PCB内部属性。
实际上,每一个硬件单元,操作系统都会为其维护一个队列。队列的底层就是由链表/顺序表维护的。比如,一个CPU就维护一个运行队列(由于CPU主要是运行这些进程,所以就是运行队列)、一个磁盘就维护一个管理队列(磁盘主要是进行写入、读取等对数据做管理,所以就是管理队列)等。
所以,一个PCB可以被连接在多种数据结构当中。对进程的管理就需要复用对链表的增删查改方法。
进程状态
所谓的进程状态,本质就是由整数来代表状态。在task_struct中就是一个整型变量。
#define Run 1 #1代表运行状态
#define Sleep 2 #2代表休眠状态
#define stopped 3 #3代表停止状态
#define dead 4 #4代表死亡状态
状态是用来帮助进程确定后续动作的,Linux中可能会存在多个进程都需要根据自己的状态来执行后续动作,所以进程就需要排队了。
每个硬件都有一个运行队列。
我们了解一下运行、阻塞、挂起状态。
运行状态
只要在运行队列里的进程就是运行状态。由此可知,在运行状态的进程,也不一定是真正运行的,可能还在等待着CPU执行它。
一个进程放在CPU上被执行,有两种情况被从CPU上拿下来去运行队列重新排队,一种是这个进程执行完了,另一种是这个进程的时间片到了。
时间片是操作系统为了效率而设置的。意为进程被放在CPU上被执行的时间。
浅看一下上述过程
阻塞状态
进程可能在等待着某种资源,这种资源可能是软件,也可能是硬件。
比如,CPU现在执行进程,执行到scanf函数了,这个时候计算机就等着我输入了,但是如果我迟迟不输入,那么计算机就一直等着我输入,不管其他进程了?显然不是的。所以,类似于执行到scanf函数时,需要键盘这个硬件来输入数据了,就需要键盘这个资源了,所以这个进程由运行状态转化为阻塞状态,并且该进程的PCB从运行队列中剥离,放到硬件的管理队列中,等这个硬件执行到这个进程时并输入了数据(这个数据由操作系统进行保存),就又将这个进程的状态改为运行状态,连接在运行状态的队列中,等待被CPU执行。等CPU执行到这个进程时,操作系统再拿出来刚刚键盘以及输入的保存好的数据,再由CPU执行。
在这整个过程中,这个进程的切换、从运行队列中剥离、连接在键盘管理的队列中、再获取到键盘执行到这个进程了且输入了数据、再状态切换、连接在运行队列中、CPU执行到这个进程了再把数据拿出来这些都是由操作系统来保证的。
下面来演示一下上述操作。
当进程在进行等待某种软硬件资源的时候,资源如果没有就绪,进程的PCB就只能将自己设置为阻塞状态,再将自己的PCB连接再等待资源所提供的队列中去。
挂起状态
这里我们只了解阻塞挂起状态
当计算机内存资源以及开始很紧张的时候,这个时候,可能我们再申请空间就很大可能会申请失败,甚至更严重时导致操作系统崩溃,在这么危急的时刻,操作系统为了保证自己不崩溃,为了给用户提供良好的服务,操作系统就会将现在不执行的进程/阻塞的进程的代码和数据拷贝(交换)到磁盘上的swap分区中,将内存中的代码和数据的空间释放掉,这样就会腾出来一部分空间,供操作系统度过这危急的时刻,等到需要执行这个进程了,再将代码和数据由磁盘swap分区拷贝至内存,使PCB与其连接,CPU执行即可。
这个过程称为操作系统将代码和数据通过IO交互唤入唤出到磁盘swap分区上。
换出:把数据从内存拷贝到磁盘swap分区。
换入:将数据由磁盘swap分区拷贝到内存中。
注意:PCB不会被唤入唤出。PCB唤出了,操作系统就不知道有这个进程了。另外,创建进程时,首先是PCB被创建出来,然后再是可执行程序(代码和数据)加载到内存。因为操作系统管理进程只管理进程的PCB,先让操作系统创建出PCB是为了让操作系统知道有这个进程了,什么时候调度等一系列操作再由操作系统掌握。
对于磁盘的swap分区,一般容量是内存的0.5-1倍。因为swap分区操作系统都要用完,所以,swap分区的容量如果太大,就会使内存和磁盘之间的交互过于频繁,由于木桶原理,就导致操作系统效率低下。
所以,进程状态的变迁,实际上是将进程的PCB被操作系统变迁到不同的软硬件管理队列中去。
Linux内核具体进程状态
以上有关进程知识都是操作系统理论部分,接下来了解一下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 * 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 僵尸状态*/
};
查询当前进程信息,STAT字段为进程状态字段。
浅度睡眠状态
按道理来说,只要该程序属于运行期间,就是运行状态。
运行状态就是程序运行时的状态,可为什么这个在运行的进程的状态是S+呢?
这是因为云服务器在远端,进程在云服务器上运行,根据冯诺依曼体系结构,结果会通过网卡设备接收->预加载到内存->由CPU处理->内存定期刷新到显示器文件。由于显示器效率比内存效率慢,并且要预加载到内存中来,所以这个进程的调度期间,CPU大部分时间都是在等待代码数据预加载到内存,所以就是睡眠状态了。由于大部分时间在等待资源加载和刷新,所以睡眠状态是阻塞状态的一种。
这种睡眠状态称为浅度睡眠状态,又叫可中断睡眠状态。
前/后台进程
S后面的+表示这是一个前台进程,后面没有+表示这是一个后台进程。
前台进程可被ctrl+c终止掉进程,并且进程执行期间不可执行其他命令。
后台进程不可被ctrl+c终止进程,只能使用kill -9 进程pid终止掉,并且后台进程执行期间可执行其他指令。
一般来说,默认运行都为前台进程。
#指定以前/后台进程来运行可执行程序
./可执行程序 #以前台进程运行该可执行程序
./可执行程序 & #以前台进程运行该可执行程序
运行状态
那如何才是运行状态呢?
此时,不需要打印操作,while循环会一直运行,该进程就成为了运行状态了。
深度睡眠状态
D状态为深度睡眠状态,又叫不可中断睡眠状态。
操作系统在资源紧张的状态下会释放掉进程(可执行程序和PCB都会释放),为了防止操作系统在这种情况下将还没有执行完成的进程释放从而导致用户丢失数据信息。所以,设置D状态,处于D状态的进程不可被操作系统释放掉。D状态进程是等待资源调度,所以D状态也是阻塞状态。
暂停状态
T状态是暂停状态。
kill -l #在Linux中查看信号
kill -19 进程pid #使进程暂停
kill -18 进程pid #使进程继续执行
进程一旦被暂停过,再次启动运行都会转为后台进程。因为前台需要进程占着。
暂停状态等待着再一次被执行,所以暂停状态也是阻塞状态的一种。
可被追踪的暂停状态
t状态为可被追踪的暂停状态。在调试的时候,该进程属于t状态。
处于t状态的进程也是阻塞状态。
终止状态
X状态是终止状态(程序死亡状态),一般是查询不到的,这是一个瞬时状态。
僵尸状态
Z状态是僵尸状态。
进程在执行完成之后,代码和数据可以直接被释放,但是自己PCB不会被立即释放。
对于一个进程来说,进程是为了给用户提供服务的,进程在执行完成之后,需要将自己的执行信息以及执行成功还是失败等信息返回给它的父进程、操作系统需要获取这个进程执行完成之后返回的数据,之后操作系统会反馈给用户。
进程退出但是操作系统并未获取到该进程退出的信息时,这个进程处于僵尸状态。
让操作系统获取到这个进程退出的数据时,才会释放PCB,这个进程才是终止状态。
所以说,一个进程执行结束,先到僵尸状态,然后变为终止状态被系统释放。
孤儿进程
子进程退出之后父进程必须要读取。如果不读取,则PCB会被一直保存,长期会造成内存泄漏。
父进程存在时,子进程僵尸状态会被父进程回收获取返回信息。
子进程存在时,父进程僵尸状态会被bash自动回收获取返回信息。并将子进程交给操作系统(1号进程)所领养。此时子进程ppid变为1。
bash会自动回收获取僵尸状态的进程的返回值。
被操作系统所领养的进程为孤儿进程,孤儿进程都是后台进程。
相关文章:

Linux---进程(3)---进程状态
目录 进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux内核具体进程状态 浅度睡眠状态 运行状态 深度睡眠状态 暂停状态 可被追踪的暂停状态 终止状态 僵尸状态 进程排队 进程不是一直在运行的,进程放在了CPU上,也不是一直运行的。 进程…...
Drools规则引擎实现停车计费
业务规则: 20:00至次日7时不收费白天7:00-20:00每小时5元,每半个小时计费一次进场30分钟内不收费,但计入时间每天最高收费50元 测试项目搭建 pom<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/…...
【python虚拟环境】安装第三方包失败/failed with error code1
问题: 今天新建了一个项目,默认的虚拟环境pip包版本是19.0.3,太低了。安装第三方包的时候一直超时 解决方案: 更新pip: python -m pip install -U --force-reinstall pip然后就可以正常pip install包了 清华镜像源࿱…...

DiffusionModel-latent diffusion,VAE,U-Net,Text-encoder
Diffusers StableDdiffusion 参考: Stable Diffusion原理详解(附代码实现) Latent Diffusion 自编码器(Variational Autoencoder, VAE): 自编码器是一种无监督学习的神经网络,用于学习数据的有效表示或编码。在稳定扩…...

C# form的移植工作
前言: 目标,将一个项目的form移植到新的工程下,且能够正确编译执行: 1 Copy form的两个文件到新工程下: 比如笔者的logo form 2 修改命名空间: 然后,找到新项目的主程序: 的命名…...
linux防火墙相关命令
防火墙启动关闭 启动防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 查看状态 systemctl status firewalld 开放或限制端口 开放端口 firewall-cmd --zonepublic --add-port22/tcp --permanent 重新载入一下防火墙设置,使设置生效…...

实习中学到的一点计算机知识(MP4在企业微信打不开?)
我在实习中,常有同事向我反馈说我在微信发的视频格式打不开。这就导致我还要一帧帧的盯着某一个时刻来截图,今天查了一下资料尝试修改视频后缀来解决视频的播放问题。 在网上下载mp4的格式,在本地都能播放,怎么可能发上企业微信就…...
ElasticSearch入门语法基础知识
1、创建测试索引 PUT /test_index_person {"settings": {"analysis": {"analyzer": {"ik_analyzer": {"type": "custom","tokenizer": "ik_smart"}}}},"mappings": {"proper…...

【C++】C++应用案例-dolphin海豚记账本
目录 一、整体介绍 1.1、需求和目标 1.2、整体功能描述 二、页面及功能描述 2.1 主菜单 2.2 记账菜单 2.3 查询菜单 2.4 退出功能 三、流程设计 3.1 主流程 3.2 记账操作流程 3.3 查询操作流程 四、代码设计 4.1 核心思路 4.2 项目文件分类设计 4.2.1 头文件 …...
Matlab数据处理学习笔记
1 :数据清洗 注:数据读取 (1)读取工作表 % 指定要读取的工作表 filename sales_data.xlsx; sheetName Sheet2; % 或者使用工作表编号,例如:sheetNumber 2;% 读取指定工作表的数据 data readtable(fi…...

浏览器中的同源策略、CORS 以及相关的 Fetch API 使用
前言 笔者对前端 Web 技术的认真学习,其实开始于与 Fetch API 的邂逅。当时觉得 fetch() 的设计很不错,也很希望能够请求其它网站下的数据并作处理和展示。学习过程中 HTML 和 CSS 都还好说,由于几乎没有 Web 技术的基础,学习 Fe…...

爬虫 APP 逆向 ---> 粉笔考研
环境: 粉笔考研 v6.3.15:https://www.wandoujia.com/apps/1220941/history_v6031500雷电9 模拟器:https://www.ldmnq.com/安装 magisk:https://blog.csdn.net/Ruaki/article/details/135580772安装 Dia 插件 (作用:禁…...
2024河南萌新联赛第(三)场 河南大学
B. 正则表达式 题目: https://ac.nowcoder.com/acm/contest/87865/B 给出n个地址,每个地址的形式为x.x.x.x,找四个x都满足x>0&&x<255的个数 思路: 首先定义四个数组和一个字符,然后按题目所给的形式…...
回溯法---分割回文串
题目:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。 思路: 第一步:确定参数与返回值。参数为字符串s,分割起始下标startIndex,无返回值 第二…...

DDR等长,到底长度差多少叫等长?
DDR4看这一篇就够了 - 知乎 (zhihu.com) 【全网首发】DDR4 PCB设计规范&设计要点PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 终于看到较为权威的DDR4等长要求了: !!!! 依据这个要求,H616项目的等长线不合格:...

程序员面试题------N皇后问题算法实现
N皇后问题是一个著名的计算机科学问题,它要求在NN的棋盘上放置N个皇后,使得它们之间不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题,通过逐步尝试不同的放置位置…...

【C++学习】6、继承
1、什么是继承? 继承描述的是类与类之间的关系,A类继承B类,A类就拥有B类的数据和方法。 继承的方式: 公有继承(public) 保护继承(protected) 私有继承(private&…...
从零开始的MicroPython(三) 按键与外部中断
上一篇:从零开始的MicroPython(二) GPIO及点灯代码 文章目录 前言硬件原理软件原理注意代码编写轮询外部中断其他 前言 点灯是嵌入式GPIO输出的典型,按键则是输入的典型。 硬件原理 按键对角接通。 软件原理 如果是一端接高电平,一端接单…...
Windows下编译安装Kratos
Kratos是一款开源跨平台的多物理场有限元框架。本文记录在Windows下编译Kratos的流程。 Ref. from Kratos KRATOS Multiphysics ("Kratos") is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, a…...
汽车-腾讯2023笔试(codefun2000)
题目链接 汽车-腾讯2023笔试(codefun2000) 题目内容 现在塔子哥有 n 个汽车,所有的汽车都在数轴上,每个汽车有1.位置 pos 2.速度 v ,它们都以在数轴上以向右为正方向作匀速直线运动。 塔子哥可以进行任意次以下操作:选择两个汽车…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...