【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.mzph.cn/news/756219.shtml

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

相关文章

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

深入探讨Python中的文件操作与文件IO操作【第141篇—Python实现】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 深入探讨Python中的文件操作与文件IO操作 在Python编程中,文件操作和文件IO操作…

ES集群和分片以及脑裂

文章目录 概要一、概念二、节点角色三、master节点脑裂四、参考 概要 在工作中不可避免会用到ES,而用到ES就不得使用其集群模式了。 单节点的话不得不面临两个重大缺陷:单点故障(高可用)和海量数据存储搜索。 ES通过集群模式解决…

JSR规范系列(6)——Jakarta EE 9 规范

Jakarta EE 9 规范 Jakarta EE 9 规范 JSR规范系列(1)——Java版本、JSR规范和JCP社区流程概述 JSR规范系列(2)——JavaSE规范、JavaEE规范、JSR规范全面整理——截止201908 JSR规范系列(3)——Java EE 6规…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目,差不多都是求什么就怎么定义dp数组,最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话,怎么根据dp[i-1]得到dp[i]?发现很难找到递归关系…

Linux之gcc_makefile

一、提要 1. 预处理(进行宏替换) 2. 编译(生成汇编) 3. 汇编(生成机器可识别代码) 4. 链接(生成可执行文件或库文件) 五六十年代,我们编程大多是二进制编程,也就是使用打孔纸带喂给机器 再往后&…

118.Qt入门,实现一个图片查看软件

需要用到的控件 QLabelQLineEditQPushButton 需要实现的功能 打开目录选择图片显示图片的名字显示图片 QLabel基本用法 void setText(const QString &);//设置文本QString text() const;//获取文本void setPixmap(const QPixmap &);设置大小 使用父类QWidget的方法设置…

窗口函数(sample database classicmodels _No.8 )

窗口函数(sample database classicmodels _No.8 ) 准备工作,可以去下载 classicmodels 数据库具体如下 点击:classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…

什么品牌洗地机清洁效果最好?洗地机品牌十大排名:前四名口碑公认

有使用过洗地机的朋友,相信对此都深有感触,洗地机的一洗一吸,清洁效果非常棒,地面的污渍、垃圾、粉尘都坚持不了几秒钟,分分钟可以让家里地面焕然一新,简直不要太香。但是,洗地机那么多&#xf…

Unity类银河恶魔城学习记录11-2 p104 Inventoty源代码

此章节相对较难理解,有时间单独出一章讲一下 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili InventoryItem.cs…

FMQL45 XADC

通过PL自带的XADC可以读写温度,电压等,但是总是读的不对。开始查找FM_QL_bsp里面少了一个部分就是pl!添加,在ewp已经修改了,但是文件不存在,现在给补上了,有点奇怪,有的项目会自动生…

网络安全-护网行动1

1.什么事hvv行动 2021年攻击队伍 100队伍,不设定攻击路径,在不违法和不破坏防守单位的前提下可以使用任何工具,如社会工程、钓鱼等 攻击方: 又公安部提供统一的攻击平台,场景、规则 防守方:也有自己的平台…

Python入门(小白友好)

知识图谱 搭建环境 安装Python:Download Python | Python.org 安装PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains 注意:专业版本是收费的,新手小白使用社区版(community)即可 创建第一个项目: 一些PyCharm的设置(也适用…

Linux之线程同步

目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口&#xff1a; 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码&#xff1a;这次我们让一个线程抢完票之后不去做任何事。 #include <iostream> #include <unistd.h> #inc…

Java项目打包成Docker镜像

将项目打包成Docker镜像 将项目打包成Docker镜像的原因是可以在一台电脑的环境下模拟多台不同性能电脑响应高并发请求时候的表现。这里我们模拟半个CPU、一个CPU还有两个CPU的情况 在pom.xml文件中添加jib插件&#xff08;前提电脑安装了maven和Java 的 JDK才能成功完成编译&…

OLLVM环境配置

虚拟机配置: 4g 40g 增加源 deb [archamd64] http://archive.ubuntu.com/ubuntu focal main universe安装cmake sudo apt-get install cmake -y安装gcc8 sudo apt-get install gcc-8 g-8 -y切换为默认版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/…

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

Ubuntu Desktop - Desktop

Ubuntu Desktop - Desktop 1. Amazon2. Ubuntu Software3. Desktop4. 系统桌面快捷方式5. 用户桌面快捷方式References 1. Amazon Amazon -> Unlock from Launcher 2. Ubuntu Software Installed -> Games -> Remove 3. Desktop /home/strong/Desktop 4. 系统桌面…

【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷

极安云科专注职业教育技能竞赛培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教学与技能培训&#xff0c;成立至今持续优化教学资源与讲师结构&#xff0…

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…