【Linux】进程排队的理解进程状态的表述僵尸进程和孤儿进程的理解

一、进程排队的理解

        进程不是一直运行的,进程可能会在等待某种软硬件资源。即使把进程加载到CPU中,也不是一直会运行的。而进程排队,一定是在等待某种软硬件资源(可以是CPU,键盘,磁盘,网卡等等设备......),排队时是进程的PCB在排队在这里就需要引入一个概念:一个PCB可以被链入多种数据结构中在之前的博客中也说过,PCB其实就是描述进程的一个很大的结构体,在这个结构体中,包含有很多其他的结构体比如我定义一个node结构体

struct node
{
    struct node* prev;
    struct node* next;
}

        该结构体可以指向它的前一个节点,也可以指向它的后一个节点。也就是说,进程排队不是我们简单地理解的是进程的PCB去排队,而是PCB内部的各个结构体通过prev指针和next指针连接起各个进程去排队,从而可以让进程在不同的队列中进行排队。如下图所示。也就是说,当我们要把某一个task_struct结构体链入某一个队列中时,我们不必把它从全局双链表中移除,可以直接链入队列中。

        通过task_struct结构体内部listnode相对于task_struct结构体首地址的地址偏移量,也可以找到task_struct结构体开始的地址,进而找到task_struct结构体。

二、进程状态的表述--运行、阻塞、挂起

运行状态

        所谓的状态,本质就是一个整形变量,是在task_struct中的一个整形变量。状态决定了你的后续动作Linux中可能存在多个进程都要根据它的状态执行后续动作。一个CPU都会维护一个运行队列,当一个进程的PCB被链入到CPU的运行队列中时,我们就称这个进程的状态为运行状态。也就是说,并不是当进程在CPU上运行的时候它才是运行状态,只要进程的PCB被链入到CPU的运行队列中,我们就可以成进程处于运行状态了。运行状态表示进程已经随时准备好接受CPU的调度了。

阻塞状态

        在操作系统层面上,为了管理好底层的硬件,其实操作系统也是把硬件都描述成一个一个的结构体,其中在硬件的结构体中,就有像CPU的运行队列一样的等待队列,当一个进程比如执行到scanf函数必须等待键盘资源时,操作系统就会将该进程的PCB从CPU的运行队列中移除,将表示进程状态的整形变量设置为block,再将该进程的PCB链入到键盘结构体的等待队列中。该进程就开始等待键盘资源了,这个状态我们就称之为阻塞状态。当键盘读到了用户输入的数据,操作系统再将该进程的PCB从键盘的等待队列中移除,链入到CPU的运行队列中,再改变表示进程状态的整形变量,从而实现了进程状态的切换。上面的例子可以总结为,当我们的进程在等待软硬件资源的时候,资源如果没有就绪,我们的进程PCB只能1、设置进程状态为阻塞状态,2、将自己的PCB链入等待资源的等待队列中。进一步的我们也可以了解到,进程状态的变迁,引起的是进程的PCB会被操作系统链入到不同的队列中

挂起状态

阻塞挂起

 前提:计算机资源已经比较吃紧当一个进程想要被CPU调度运行时,它对应的代码和数据势必要加载到内存当中。可是如果这个进程此时正处于阻塞状态且对应的硬件资源一时半会儿不会得到相应,而此时计算机的内存资源又比较吃紧的情况下,操作系统就会将这个进程对应的代码和数据先存放到磁盘对应的swap分区中,让其它比较重要的进程优先占有内存,这个动作就叫做唤出动作。等到计算机资源相对宽裕,硬件资源响应时,再将这个进程对应的代码和数据加载到内存中,这个动作就叫做唤入。一旦该进程的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 */
};

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

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠/浅度睡眠 (interruptible sleep)),是阻塞状态的一种。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态/深度睡眠(uninterruptible sleep):在这个状态的进程通常会等待IO的结束,处于D状态的进程在系统资源吃紧的时候也不会被操作系统杀死,也是阻塞状态的一种。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程,也是阻塞状态的一种。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行,进程暂停以后就变成了后台进程。kill -19 进程标识符。kill -18 进程标识符:让这个进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

         上面这一段程序是一段死循环,当我把它运行起来时,我们可以看到:

         当前我这个进程是处于睡眠状态(S状态)的。这是因为我的这个程序中执行了printf函数,printf函数是要访问外设的,要访问外设就不可避免的要等待外设响应。而CPU的运行速度是非常非常快的,也就是说相对CPU而言,该进程大部分时间还是在等待外设的,在等待过程中CPU就将该进程链入到外设的等待队列中,所以该进程查到的状态大部分都是睡眠状态,这里的Linux操作系统具体实现的S状态就是上面操作系统层面上的阻塞状态的一种S后面这个+号表示该进程是前台进程,没有+号表示该进程是后台进程

僵尸状态(Z状态)

        当子进程退出时,父进程就必须去读取子进程退出时的退出状态。如果父进程不读取子进程退出时的退出状态,子进程的PCB就不会被系统释放,子进程就会一直处于僵尸状态。创建子进程是为了让这个子进程给用户完成工作的,子进程完成工作后必须得有结果数据,这些数据都保存在子进程的PCB中。这就是为什么要有僵尸状态的原因,是为了获得子进程的结果数据。如果父进程不读取,那么这个僵尸状态的进程会一直存在,会引起内存泄漏,造成系统资源的浪费

        为什么我们在之前的进程没有见过处于Z状态呢?那是因为以前我们创建的进程的父进程都是bash,bash一瞬间会自动读取子进程的退出状态,不需要我们手动读取。而我们自己创建的子进程需要我们自己读取它的退出状态

 四、孤儿进程

        当父进程先于子进程退出,子进程会被操作系统(1号进程)领养,这个子进程就叫做孤儿进程。这个子进程变成孤儿进程的同时也变成了一个后台进程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio实现内容丰富的安卓图书馆座位图书预约系统

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号109 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看公告 3.查看图书馆座位 4.查看图书馆图书&#xff0c…

k8s详细教程

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点…

《1w实盘and大盘基金预测 day7》

昨日预测有点差劲,最低点也相差五个点。 打分C 公众号:JavaHelmet 昨天预测: 3052-3062-3076-3115 3067是趋势线,有回踩需求 5-30-60分钟级别顶钝 大盘冲到标红的点位3115或者3100就需注意。不要随意追高(最高309…

第四百一十一回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容,本章回中将介绍自定义标题栏.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我…

蓝桥杯备赛_python_DFS搜索算法_刷题学习笔记

1.是什么 沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。并且每个节点只能访问一次。本质上是持续搜索,遍历了所有可能的情况,必然能得到解。 流程是一个树的形式,每次一条路走到黑。 目的主要是达到…

哈尔滨工业大学 《材料物理》 笔记-3

原内容请参考哈尔滨工业大学何飞教授:https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》(哈尔滨工业大学出版社) 量…

杨氏矩阵的查找(复杂度<O(N))

题目: 解释:时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路: 一个33的二维数组如图所示: 一:先找到一个最关键的数字,3(下标为0,2) 关键数的关键之处在于(处于…

【Unity】从0到1的横版2d制作笔记-DAY1

写在前面: 感谢旻子提供的Unity2d课程捏,红豆泥阿里嘎多 创建项目 测试Visual Studio的使用 右键选择【create】,右键创建C# Script,待文件创建完毕后双击查看能否正确跳转。 正确跳转的结果是能看见代码中注释标注有:…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 🧡🧡t1_求余🧡🧡思路代码 🧡🧡t2_灌水🧡🧡思路代码 🧡🧡t3_字符显示🧡🧡思路代码 🧡🧡t4_区间最大和…

(56)删除每行中的最大值

文章目录 1. 每日一言2. 题目3. 解题思路4. 代码5. 结语 1. 每日一言 抱怨过去发生的一切,就等于丧失了力量,白白浪费了往事要带给我们的成长。 2. 题目 题目链接:删除每行中的最大值 给你一个 m x n 大小的矩阵 grid ,由若干正…

线程工具类与原子类

参考文档: CountDownLatch、CyclicBarrier、Semaphore的用法和区别juc15_基本AtomicInteger、数组、引用AtomicStampedReference、对象的属性修改原子类 AtomicIntegerFieldUp 、原子操作增强类LongAdder 辅助工具类 CountDownLatch(闭锁) 做减法 允许一个或多个…

c语言文件操作(2)

1.文件的随机读写: fseek函数 int fseek ( FILE * stream, long int offset, int origin ); fseek函数是根据文件指针的位置和偏移量来定位文件指针。 其中,origin所含的参数: seek_set:文件开头 seek_cur:文件指…

DFS-重复覆盖模型

糖果 1243. 糖果 - AcWing题库 首先是最暴力的做法,我们枚举所有的选法,当某种选法可以尝到所有口味的糖果时,比较当前购买的糖果数和当前的res,迭代出res的最小值。这样进行搜索的话,最极端的状态下树的深度是n&…

腾讯云服务器多少钱1个月?2024一个月收费阿济格IE吧

2024腾讯云服务器多少钱一个月?5元1个月起,腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月,8核32G22M配置115元一个月、345元3个月,腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

easyrecovery15易恢复中文绿色版 数据恢复软件易恢复 Ontrack EasyRecovery汉化破解版下载 易恢复软件免费版

易恢复 Ontrack EasyRecovery 由世界著名数据恢复公司 Ontrack 出品的威力非常强大的硬盘数据恢复软件。EasyRecovery 15破解版具备强大的磁盘诊断、数据恢复、文件修复功能。Ontrack EasyRecovery 能够帮你恢复由于误操作删除的,或者说格式化选成丢失的数据以及重建…

ASP .Net Core ILogger日志服务

🐳简介 ILogger日志服务是.NET平台中的一个内置服务,主要用于应用程序的日志记录。它提供了灵活的日志记录机制,允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件: ILogger接口:这是ILogger日志服…

Nacos下载和安装

(1)下载地址和版本 下载地址:Releases alibaba/nacos GitHub 解压在没有中文及空格的文件夹 (2)启动nacos服务 在bin目录下,打开命令行,输入 启动命令:sh startup.sh -m standalone - Linux/Unix/Mac …

(总结)OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT,仅供学习参考。

3.19总结

A计划 题解&#xff1a;这题其实就是一个很简单的三维搜索&#xff0c;有了一个传送门&#xff0c;并且要确定是否传过去的对应位置是墙&#xff0c;防止被装死&#xff0c;同事呢又要在对应的t时间内完成&#xff08;不一定要卡着t时间恰好完成&#xff09; #include<ios…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…