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 ,它们都以在数轴上以向右为正方向作匀速直线运动。 塔子哥可以进行任意次以下操作:选择两个汽车…...
软测面试二十问(最新面试)
1.软件测试的流程是什么 参加需求评审会,解决需求疑问---写测试用例---对测试用例进行评审---评审后开始执行测试---提交bug---追踪bug---关闭bug---回归测试---交叉测试---编写测试报告---冒烟测试 2.什么是黑盒测试和白盒测试?它们有何区别 黑盒测试…...
风吸杀虫灯采用新型技术 无公害诱虫捕虫
TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源(如紫外光、蓝光)的敏感性,通过光波引诱害虫成虫扑灯。同时,内置的风扇产生强烈的气流,形成负压区,将害虫迅速吸入到收集器中。害虫在收集器内被风干…...
随手记录第十二话 -- JDK8-21版本的新增特性记录(Lambda,var,switch,instanceof,record,virtual虚拟线程等)
本文主要用于记录jdk8以来的新增特性及使用方法! 1.Java8 Lambda表达式(8) 1.1 方法引用 List<String> list List.of("1", "2", "3");list.forEach(i -> System.out.println(i));//方法引用list.forEach(System.out::println);1.2 接…...
SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持
背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互,因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此,大多数的应用开发时基本都是直接Http就过去了,不会一开始就是直接上Https。然而随着时间的推移,…...
JavaScript做网页是否过期的处理
通过路由上的参数生成唯一md5和路由上token做验证_md5 token-CSDN博客 前言:基于这篇文章我们做网页是否超时,网页是否过期的处理。打开一个网页允许他在一定时间内可以访问,过了这个时间就不可以访问了,encrypt是h5加密方法&…...
python coding时遇到的问题
Q:只有cpu的时候加载模型 A:checkpoint torch.load(model_path, map_locationtorch.device(‘cpu’)) Q:vscode的文件路径和spyder的不一样 A:在vscode中,右键要用的文件,选择“文件相对路径”...
攻防演练号角吹响,聚铭铭察高级威胁检测系统助您零失分打赢重保攻坚战
在数字化浪潮中,攻防演练成为了衡量网络安全防御力的核心标尺,其重要性与日俱增。这项由政府、行业监管或企业内部主导的安全活动,随着互联网普及而兴起,现已发展成为全球公认的检验网络安全体系效能的标准。它不仅关乎技术实力的…...
个人量化交易兴起!有什么好用的量化软件推荐?迅投QMT量化平台简介!
QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端,拥有高速行情、极速交易、策略交易、多维度风控等专业功能,满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…...
SQL labs-SQL注入(七,sqlmap对于post传参方式的注入,2)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。参考:SQL注入之Header注入_sqlmap header注入-CSDN博客 序言: 本文主要讲解基于SQL labs靶场,sqlmap工具进行的post传参方式的SQL注入,…...
SAM 2: Segment Anything in Images and Videos
Introduction 提出的目的: 1.现有的应用像自动驾驶,AR等来说都是需要temporal localization beyond image-level segmentation(时序定位而不仅是图片分割) 2. 一个好的分割模型不应该仅仅局限于图片领域,而是图视频两…...
做app和网站怎样/企业网站推广有哪些方式
gPXE无盘中有一个补丁叫sanbootconf,它可以让XP通过ISCSI启动。它有一个功能,就是把无盘系统的IP地址固定为DHCP获取到的IP,以免多机启动造成IP冲突。但是它有一个问题没有解决,就是多机同时启动计算机名也会冲突。本程序就是解决…...
青岛网站建设青岛新思维/seowhy教研室
上文,我用了AJAX去搭建ajax框架。 但是ajax有个安全性问题,就是不能跨域操作。 今天早上参考了fanfou.com的api,突然茅塞顿开! 实际上json就是javascript!!因此我只要一句话: <script langua…...
站长论坛 激活网站/免费推广网站2024
基本概念: 1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。 2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最…...
我想给赌博网站做代理/百度广告投放代理商
原标题:提升窗口服务,助力创城工作4月15日,在高新区新市区政务服务大厅,办事群众正在窗口办理相关事项。记者牟敏摄新疆网讯(记者 牟敏)高新区(新市区)发挥政务服务窗口优势,以打造“服务质量最优、办事效率最高”政务…...
wordpress htaccess 404/识万物扫一扫
? EDGE的后续发展表明无线网卡的知识应该得到普及和常识?两台计算机如何共享Internet: 只有一个宽带接口并且不想购买无线路由器,使用桥接功能2008年7月30日类别: 无线Internet信息评论: 3浏览: 2601我相信大多数家庭用户都会同时拥有笔记本电…...
把国外的网站翻译过来做自媒体/互联网销售公司
LeetCode 169:多数元素题目描述解题思路代码实现总结题目描述 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输…...