【Linux操作系统】Linux进程状态和两个特殊进程

news2024/11/20 7:29:23

在这里插入图片描述

文章目录

  • 一.一套普适性的进程状态理论
    • 1.运行
    • 2.阻塞
    • 3.挂起
  • 二.一套具体的Linux进程状态
    • 1.R-运行
    • 2.S-睡眠
    • 3.T-暂停
    • 5.t-被追踪
  • 三.僵尸进程和孤儿进程
    • 1.僵尸进程
    • 2.孤儿进程

一.一套普适性的进程状态理论

1.运行

cpu图片_cpu图片素材_cpu图片大全_cpu高清图片_全景视觉

由于CPU数量相对于进程数量来说少之又少,所以CPU维护了一个运行队列,方便管理大量等待CPU资源的进程.

同时由于CPU的处理速度很快,位于运行队列中的每一个进程都必须随时准备被运行, 所以只要位于运行队列中的进程都是处于运行状态.

值得注意的是处于运行状态的进程不一定是正在被CPU运行,但处于运行状态的进程一定是在CPU的运行队列中.

2.阻塞

什么是「机械硬盘」?它由哪些部分组成? - 知乎

我们知道磁盘等外设资源的读写速度相对于CPU相差甚远,所以当有些进程进程需要访问外设,比如数据打印到显示器,当CPU知道他们需要访问外设,CPU为了整体效率,肯定不能停下等,等待进程访问外设完后继续为其服务.

所以操作系统会把需要访问外设 (比如磁盘) 的进程从运行队列拿到内存中—磁盘所维护的等待队列中进行等待磁盘资源就绪.那么位于等待队列中的进程所处的状态就被称为阻塞状态.

值得注意的是:

  1. 实际上进程所处的状态取决于其所处的是何种队列

  2. 并非进程位于队列中,而是进程所对应的PCB位于队列中排队

  3. 进程所处的状态都在task_struct(PCB)中以数字含义的形式记录着

3.挂起

当大量要访问外设的进程, 都在等待外设资源就绪之时,他们是不会被立即调度, 未来可能还要等待很长的时间.

然而进程PCB和对应代码和数据都是要占用内存资源

所以操作系统就会自主地把一些等待外设资源就绪的进程所对应的代码和数据从内存换出到磁盘上,但是PCB仍然作为进程存在的标志,依旧保留在内存—-磁盘所维护的等待队列中

从而为内存节省了空间.

值得注意的是:

  1. 毕竟PCB依旧位于等待队列中, 所以挂起也是阻塞状态的一种
  2. 挂起是操作系统自主的行为,用户并不关心

二.一套具体的Linux进程状态

一套普适性的进程状态理论讲完了,让我们看看一套具体的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 */
};

1.R-运行

写一段纯计算的代码:

  1 #include<stdio.h>                   
  2 #include<unistd.h>
  3 int main()
  4 {
  5   int a=0;
  6   while(1)
  7   {
  8     a++;
  9   }
 10   return 0;
 11 }

进程转态查看:R+

image-20230114164715671

2.S-睡眠

写一段访问外设的代码/睡眠X秒的代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5   int a=0;
  6   while(1)
  7   {
  8     a++;
        //和上面代码区别在下面一行:打印到显示器
  9     printf("a:%d\n",a);             
 10   }
 11   return 0;
 12 }

进程转态查看:S+

image-20230114164951191

3.T-暂停

首先介绍一下kill:

kill -l

image-20230114165703469

9号信号:SIGKILL杀进程信号
19号信号:SIGSTOP暂停信号
18号信号:SIGCONT继续信号

接着演示两种如何出现暂停状态:

从R+ => T =>R:

image-20230114165510685

从S+ => T =>S:

恢复成后台进程进程,ctrl+C无法终止:

image-20230114201148398

状态S+和S的区别

S+状态的进程是前台进程, 在该状态下,CTRL+C可以终止进程,shell命令不可被正常执行.

S 状态的进程是后台进程, 在该状态下,CTRL+C不可以终止进程,shell命令可以被正常执行.

4.D-深度睡眠

</给大家讲个三个人的故事了解一下即可:

我们知道, 一般用户数据都永久保存在磁盘上,因为用户数据很重要,所以磁盘的地位也很重要! 有一天一个进程A抱着一堆数据来找磁盘,让磁盘保存.

磁盘:你把用户重要数据从内存拿过来,但是我保存需要时间,你得等一段时间哦!

进程A把用户数据交给磁盘,并在内存中苦等…同时内存空间不够了

操作系统:内存空间不够,我快顶不住了,进程挂起也解决不了问题,我得杀进程来解决问题!

操作系统看到占着茅坑不拉屎的进程A,便在不知情的情况杀掉了进程A…同时磁盘保存数据失败,来向进程A反馈,但进程A已然死亡.

磁盘:进程A,我保存数据失败了,用户数据还给你.

但内存中并无进程A的回应, 于是磁盘将数据丢掉,继续为其他进程服务…同时用户发现数据丢失,前来问责.

磁盘:我只是听话照做,数据本来就可能会保存失败,罪责与我无关.

进程A: 我也是工具人,我办事情到一半就被干掉了,我还没找操作系统算账呐.

操作系统:用户你给我的权力啊,内存压力大,挂起都不顶用,再说我杀掉进程A我也不是针对他,我不知道他拿着重要数据嘛.

用户听了三者都无罪,于是用户定了一个新规…

用户:我给一些重要的进程一块免死金牌,他特殊,你再怎么样也别杀他.

磁盘,进程A,操作系统都一致称好…

了解D深度睡眠状态:

深度睡眠状态一般在企业内部做高IO或者高并发用的多,处于深度睡眠状态的进程无法被操作系统杀死,只能通过断电重启或者进程自己醒来。

5.t-被追踪

我们在使用gdb调试代码的时候,进程会处于一种被追踪状态,等待开发人员查看上下文数据,这也就是为什么我们能够调试代码的原因。

ps:

  1. S和D,T和t其实都是阻塞状态的一种,这就是具体的一款操作系统和抽象的操作系统理论之间的差别
  2. X-死亡状态,死亡的进程直接被父进程回收,Linux下没法演示,但好理解。
  3. D-僵尸状态/将死状态,将于<三>大概了解,后进程控制深入理解

三.僵尸进程和孤儿进程

1.僵尸进程

僵尸进程:子进程退出,其代码和数据被回收,但是PCB中保存着退出码等退出信息,PCB没有被立即回收,得等待父进程读取退出信息完再彻底死亡,子进程就是僵尸进程.

僵尸:Zombie
已故的:defunct

Linux下查看僵尸进程:

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h> 
  4 int main()
  5 {
  6   pid_t pid=fork();
  7   if(pid<0)
  8   {
  9     perror("Error\n");
 10     return 0;
 11   }
 12   else if(pid==0)
 13   {
 14           printf("I am child,PID:%d,PPID:%d\n",getpid(),getppid());
 15           sleep(5);
 16           exit(1);
 17   }
 18   else 
 19   {
 20       while(1)                                  
 21       {
 22 
 23          printf("I am parent,PID:%d,PPID:%d\n",getpid(),getppid());
 24          sleep(1);
  25       }
 26   }
 27   return 0;
 28 }

image-20230114212910382

2.孤儿进程

但是如果父进程先于子进程退出,子进程退出时,谁来完成子进程的退出信息读取和资源回收呐?

孤儿进程: 父进程退出, 子进程被操作系统领养,操作系统完成子进程退出信息读取和资源回收,子进程就是孤儿进程.

Linux下查看孤儿进程:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h> 
  4 int main()
  5 {
  6   pid_t pid=fork();
  7   if(pid<0)
  8   {
  9     perror("Error\n");
 10     return 0;
 11   }
 12   else if(pid==0)
 13   {
 14     while(1)
 15     {
 16           printf("I am child,PID:%d,PPID:%d\n",getpid(),getppid());
 17           sleep(1);                                                               
 18     }
 19   }
 20   else
 21   {
 22       printf("I am parent,PID:%d,PPID:%d\n",getpid(),getppid());
 23       sleep(5);
 24       exit(1);
 25   }
 26   return 0;
 27 }

父进程退出,父进程的退出信息读取和资源回收工作由bash完成

因为子进程退出的时候也有退出信息读取和资源回收工作,所以要被领养

事实证明,子进程被操作系统领养,变成S状态,前台进程变成后台进程。

image-20230114212150915

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

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

相关文章

Synchronized底层原理系列之Synchronized的偏向锁实现原理

作者简介&#xff1a;专注于研究Linux内核、Hotspot虚拟机、汇编语言、JDK源码、各大中间件源码等等喜欢的话&#xff0c;可以三连关注~上篇文章已经对Synchronized关键字做了初步的介绍&#xff0c;从字节码层面介绍了Synchronized关键字&#xff0c;最终字节码层面就是monito…

【Linux】 iptables 入门简介

文章目录前言作用持久化和恢复执行的顺序前言 简单地说&#xff0c;iptables是Linux的防火墙程序。它将使用表监控进出服务器的流量。这些表包含称为链的规则集&#xff0c;这些规则将过滤传入和传出数据包。 作用 当数据包与规则匹配的时候&#xff0c;会为其指定一个目标&a…

基于幂等表思想的幂等实践

一、为什么需要幂等 分布式场景下&#xff0c;多个业务系统间实现强一致的协议是极其困难的。一个最简单和可实现的假设就是保证最终一致性&#xff0c;这要求服务端在处理一个重复的请求时需要给出相同的回应&#xff0c;同时不会对持久化数据产生副作用&#xff08;即多次操…

【Linux】Linux下调试器gdb的使用

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、铺垫三、指令集和使用1、指令集2、演示四、结语如果无聊的话&#xff0c;就来逛逛 我的博客栈 吧! &#x1f339; 一、前…

通信原理与MATLAB(十三):AMI的编解码

目录1.AMI的的编解码原理1.1 AMI编码原理1.2 AMI解码原理2.AMI编解码的代码3.AMI编解码结果图4.AMI的误码率曲线4.1 原理4.2 AMI的误码率曲线代码4.3 误码率曲线图1.AMI的的编解码原理 1.1 AMI编码原理 如下图所示&#xff0c;AMI的编码原理:将原始码元的1转换成1,0转换成-1。…

快过年了,用Python康康哪一家足浴店可以带朋友去玩.....

人生苦短&#xff0c;我用Python 首先肯定是去正经足浴店&#xff0c; 毕竟一年出差也不少&#xff0c; 大家都很辛苦&#xff0c; 好不容易放假了&#xff0c; 约上好兄弟一起去放松放松~ 所需环境 python 3.8 解释器pycharm 编辑器 所需模块 requests 数据来源分析 …

Silane-PEG-NH2 氨基聚乙二醇硅烷 NH2-PEG-Silane结构式

英文名称&#xff1a;Silane-PEG-NH2 Silane-PEG-Amine 中文名称&#xff1a;硅烷-聚乙二醇-氨基 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途…

2022年度总结,迎接2023

目录 我和CSDN的2022 初次见面&#xff1a; 你我的成长&#xff1a; 博客&#xff1a; 比赛&#xff1a; 我和CSDN的2023 我和CSDN的2022 初次见面&#xff1a; CSDN你好啊&#xff01;我跟你的初次见面在于2022年4月2日&#xff01;&#xff01;&#xff01; 这这半年内…

【算法5.1】背包问题 - 01背包 (至多最大价值、至少最小价值)

目录 至少模板和至多模板的两大区别 1、至多模板 2、至少模板 2. 01背包 - 至多模板 - 体积至多j&#xff0c;总价值最大 1、朴素做法 - 二维dp 2、优化 - 一维dp 4700. 何以包邮&#xff1f; - 至少模板 - 价值至少j&#xff0c;总价值最小 至少模板和至多模板的两大区…

list容器与vector容器的区别

vector与list都是STL中非常重要的序列式容器&#xff0c;它们都存放在namespace std命名空间中&#xff0c;由于俩个容器的底层结构不同&#xff0c;导致其特性不同 一、底层实现结构不同 vector本质是一段动态连续的顺序表&#xff0c;而list底层是一个双向循环链表 二、访…

Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法

简介大家都知道&#xff0c;Linux现在用Luks全盘加密一直有一个痛点&#xff0c;就是每次开机都需要输入解密硬盘的密码&#xff0c;之后又要输入用户密码&#xff0c;非常的麻烦&#xff01;本文正是为了解决这个问题诞生的&#xff01;本文多硬盘加密带来的效果是&#xff0c…

Redis持久化——RDB机制详解

在运行情况下&#xff0c;Redis 以数据结构的形式将数据维持在内存中&#xff0c;为了让这些数据在 Redis 重启之后仍然可用&#xff0c;需要将数据写入持久存储 持久化是指将数据写入持久存储&#xff0c;例如固态磁盘(SSD) Redis 提供了一系列持久化选项。这些包括&#xff1…

Java-黑马Java学习作业-day07综合练习

学习视频链接&#xff1a;黑马Java学习视频 文章目录练习一&#xff1a;飞机票练习二&#xff1a;打印素数练习三&#xff1a;验证码练习四&#xff1a;复制数组练习五&#xff1a;评委打分练习六&#xff1a;数字加密练习七&#xff1a;数字解密练习八&#xff1a;抽奖解法一:…

【C++11】—— 可变参数模板

目录 一、可变参数模板概念以及定义方式 二、参数包的展开 1. 递归函数方式展开参数包 2. 逗号表达式展开参数包 三、STL容器中的empalce相关接口函数 一、可变参数模板概念以及定义方式 在c11之前&#xff0c;类模板和函数模板只能含有固定数量的模板参数&#xff0c;c11…

JavaScript高级 ES5 面向对象原型继承

原型以及ES5中实现继承1. 对象和函数的原型1. 普通对象的原型 [[prototype]]2. 函数的原型 prototype2. new、constructor1. new 操作符2. constructor属性3. 将方法放到原型上4. 创建对象的内存表现5. 重写原型对象3. 原型链的查找顺序4. 原型链实现的继承5. 借用构造函数继承…

深入URP之Shader篇10: 深度值专题(1)

之前研究Unlit shader的时候就遇到一些Z值相关的问题&#xff0c;一笔带过了&#xff0c;比如ComputeFogFactor中的UNITY_Z_0_FAR_FROM_CLIPSPACE。今天就把URP Shader中出现的Z相关的问题做一个专题一起研究下。 深度缓冲的方向和UNITY_REVERSED_Z 先说这个关于z的宏&#x…

nacos:服务注册与发现

导入SpringCloudAlibaba相关的依赖&#xff0c;并在父工程将依赖进行管理 <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-s…

Java EE|多线程代码实例之定时器与线程池

文章目录&#x1f534;定时器什么是定时器以及开发中的作用标准库中的定时器定时器的实现&#x1f534;线程池什么是线程池标准库中的线程池创建一个线程池ThreadPoolExecutor构造方法解析线程池的实现&#x1f534;定时器 什么是定时器以及开发中的作用 程序中的定时器功能与…

【互联网大厂机试真题 - 华为】九宫格

题目描述 九宫格是一款广为流传的游戏,起源于河图洛书。游戏规则是:1到9九个数字放在3x3的格子中,要求每行、每列以及两个对角线上的三数之和都等于15. 在金麻名著《射雕英雄传》中黃蓉曾给九宫格的一种解法,口诀:戴九恩一,左三右七,二四有肩,八六为足,五居中央。解法…

【云原生进阶之容器】第四章Operator原理4.3节--Operator模式

1 Operator概述 1.1 诞生背景 Kubernetes实际是期望状态管理器。先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。Kubernetes的控制平面运行在Master节点上,它包含数个controller以调和应用达到期望状态: 检查当前的…