『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...

这篇具有很好参考价值的文章主要介绍了『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

💐专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 Linux从入门到精通,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法

💐文章导读

本章我们将认识几种进程状态——运行状态休眠状态暂停状态退出状态等。还要介绍两种具有惨烈身世的僵尸进程孤儿进程~

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

🌷认识进程状态

Linux中进程状态一般有:

  • R(运行状态):并不意外着真正的在运行(指正在被CPU调度);
  • S(休眠状态):进程在等待获取某种资源,此状态还被称为可中断休眠;
  • D(磁盘休眠状态):在这个状态的进程也是在休眠,但是不可被中断,因此又称过该状态为不可中断休眠;
  • T(暂停状态):可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X(死亡状态):这个状态只是一个返回状态,你不会在任务列表里看到这个状态;
  • Z(僵尸状态):当一个子进程没有被父进程“回收”,该进程就会处于僵尸状态;

下面为这些状态在kernel源代码中的定义:

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
};

🌺如何查看进程状态

  • 输入指令:
ps axj | head -n1 && ps axj | grep myprocess | grep -v grep

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

接下来我们就依次来看各种状态是什么模样吧~

🌷R状态

🌺引例

当你在电脑上同时运行很多程序,例如你敲代码的时候,还听着某个软件播放的歌曲,或者在浏览器之间来回切换。请问此时这些所有的应用都在CPU运行吗?

答案是,并不是这样的。

CPU进行工作的时候,会存在一个进程运行的队列。队列维护的内容是一个个task_struct结构体的指针(上一章中讲到了task_struct为进程描述符)。在该队列中维护的进程都处于R状态,且等着被CPU所调度。

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

🌺如何观察

写下一段简单的代码:

#include<stdio.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    printf("hello myprocess\n");
  }
  return 0;
}

在运行该程序之后,查看该进程的状态如图所示:

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

  • 问题又来了,为什么在该程序执行时,并没有看到所谓的R状态呢?
  • 答案是,由于CPU运算速度太快了,我们基本很难看到R状态。该进程死循环的在屏幕上打印hello myprocess。我们都知道此时的屏幕是一种外设,而CPU的计算速度相比较外设的访问速度根本不在一个量级。所以,该进程死循环的在屏幕上打印内容,有99.9%的时间都在访问外设,剩下的时间是CPU在做计算。在进程访问外设的时候,CPU并不会傻傻的原地等待,而是转头却做别的事,当该进程访问外设成功后,CPU再对它进行调度。

那么有什么办法等看到R状态呢?我们将上面的代码略作修改:

#include<stdio.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    //printf("hello myprocess\n");
  }
  return 0;
}

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

如上图所示,当我们不再访问外设,而是只不停地做重复的运算,此时CPU会一直被调度,就能看到R状态了。

🌷S状态与D状态

🌺S状态

S状态称为休眠状态。一个进程好端端地为什么要休眠呢?难道是因为运行太久累到了吗?当然不是这样。休眠状态本质是一种阻塞。

  • 阻塞:进程因为等待某种资源就绪而表现出的不推进的状态。

例如,当一个进程运行到一半,需要从磁盘上获取很大的一块数据,那么就要花费较久的时间。此时OS的处理方式是,让该进程继续等待它要的数据,但是要求你不能在等待资源的时候还占用着CPU,于是该进程就被OS安排到某个地方进行等待,这时该进程就处于S状态。

🍁如何观察

#include<stdio.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    int n = 0;
    scanf("%d",&n);
    printf("%d\n",n);
  }
  return 0;
}

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

如上图所示,当进程等待用户从键盘上输入的数据时,它就处于睡眠状态

🌺D状态

D状态也是一种休眠状态,但是它又有个名字叫做磁盘休眠状态或者不可中断休眠。那么如何看待S状态与D状态的区别呢?

首先我们得清楚一般什么情况下进程会发生中断。当一个进程偷偷地地干一些坏事,此时用户想停止该进程,那就要向该进程发送一个中断信号,该进程就被“杀”掉了。

在一些情况下,不需要用户自己动手,OS自己就能“杀”掉某些进程。例如,当内存资源非常紧张甚至危险到了整个系统的安全时,OS就会“杀”掉一些不太重要的进程。

就比如某个进程因为在等待数据而进入休眠状态,此时被OS发现了,内存这么紧张你还在这睡懒觉?叉出去!好嘛,进程被叉出去了。此时数据被读到一半,结果当事人没了。这些数据只能被舍弃,不然谁找到刚刚那个进程投胎之后还能不能找到“我“。

这些被舍弃的数据若是一些无关紧要的数据也就罢了,丢就丢了。但若是什么机密文件那岂不是坏了大事了?所以,为了避免将某些不能中断的进程被OS误杀掉了,可让该进程处于不可被中断休眠状态即D状态。此时该进程休眠时终于不怕被打扰了,但是,各退一步,我换个地方睡,不然我怕你急眼。于是该进程休眠时,就在相对宽阔的磁盘当中去休眠了。

🌷T状态

T状态称为停止状态,非常好理解,就是让某个进程暂停一下。例如在调试时,我们设置了几个断点。当进程在该断点处停下来时,该进程就处于暂停状态。

🌺如何观察

🍁方法一

#include<stdio.h> 
#include<unistd.h>

int main() 
{ 
   while(1)  
   { 
     //printf("hello myprocess\n"); 
     int n = 0; 
     scanf("%d",&n); printf("%d\n",n); 
   }
   return 0;
}

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

当我们在第9行打上断点并运行后,程序停到了断点的位置。此时查看进程状态如下图所示:

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

注意:t也是一种暂停状态。有时候也被叫做追踪状态

🍁方法二

我们可以通过给进程发送暂停的信号使进程进入暂停状态。编辑如下代码:

#include<stdio.h> 
#include<unistd.h>

int main() 
{ 
   while(1)  
   { 
     printf("hello myprocess\n"); 
   }
   return 0;
}

当程序开始运行后,此时向进程发送暂停的信号:

$ kill -19 (进程PID)

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器
此外,我们还可以发送继续的信号让该进程继续执行:

$ kill -18 (进程PID)

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

🍁注意

进程继续在运行了。但是我们发现有一个地方好像和之前不一样了,S后面是不是一直有一个+号来着?我们也不知道+是干嘛的,只知道他现在好像消失了。

  • “+” 代表在前台运行,没有”+“表示在后台运行;

之前我们在终止一个程序时,习惯使用Ctrl + c ,但是现在好像对于后台在运行的进程失效了,此时我们需要掌握一条新的指令来”杀掉“进程:

$ kill -9 (进程PID)

或者,

$ kill -9 (进程PID)

🌷X状态与Z状态

  • X状态为退出状态是一个瞬时状态不易观察,暂且认为它不重要;
  • Z状态被称为僵尸状态。顾名思义,一个进程死了(退出了)但没有”收尸“,就成了”僵尸“。具体一点,当一个进程退出时如果它的父进程没有读取到该进程退出时返回的退出状态码,该进程就会变成僵尸进程。

概念有点多,先来理一理。首先什么是退出状态码?在一段C语言程序中,我们经常要在main函数结束时写一句代码——return 0; 。这个0就是退出状态码,但并不仅仅是0,还可以是1,2,3…

🌺如何看到僵尸进程?

接下来我们就写一段代码看看僵尸进程:

#include<stdio.h> 
#include<unistd.h>

int main() 
{
  pid_t id = fork();

  if(id == 0)
  {
    while(1)
    {
      printf("我是子进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  else if(id > 0) 
  {
    while(1)
    {
      printf("我是父进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  return 0;
}

当我们运行程序后,能看到程序正常的在运行;

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器
此时当我们执行指令将子进程”杀“掉,子进程就会变成僵尸进程;

$ kill -9 (子进程PID)

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

其中我们能看到一个英文单词——defunct就是僵尸的意思。

🌺僵尸进程的危害

  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(即PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护。
  • 一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费。因为数据结构对象本身就要占用内存。

僵尸进程是有危害的,当然我们也可以避免它,这就需要在下一章节中提到了。

🌷孤儿进程

当父进程活着,子进程提前挂掉,容易造成僵尸进程。那如果父进程提前挂掉,子进程又该何去何存呢?这就是我们接下来要讲的孤儿进程了。

🌺如何看到孤儿进程

编辑如下代码:

#include<stdio.h> 
#include<unistd.h>

int main() 
{
  pid_t id = fork();

  if(id == 0)
  {
    while(1)
    {
      printf("我是子进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  else if(id > 0) 
  {
    while(1)
    {
      printf("我是父进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  return 0;
}

运行该程序,我们使用kill命令”杀“掉父进程,此时再来查看进程信息:

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

如上图所示,子进程发生了两个变化。一是子进程的PPID,二是子进程变为在后台运行了。

🍁如何理解

当子进程的父进程挂掉之后,子进程会被1号进程领养。该进程也被称为孤儿进程。

  • 那么为什么要进行领养呢?

答案是,找一个人为自己收尸。不然当哪一天自己突然挂掉,没人为自己收尸那么就会变成为祸人间的僵尸进程了。

关于进程状态就介绍到这里了,当然进程状态不仅仅只是这些,更多内容敬请期待吧~

『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...,Linux从入门到精通,linux,运维,服务器

点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓文章来源地址https://www.toymoban.com/news/detail-594622.html

到了这里,关于『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】详解进程状态之僵尸进程——孤儿进程

    目录 🌞专栏导读 🌛什么是进程 ⭐什么是PCB?  🌛查看进程  🌛如何通过系统调用查看进程PID 🌛fork 🌞认识进程状态 🌛查看进程状态  🌛R状态  ⭐例如: 🌛S状态  🌛D状态  🌛T状态 🌛t状态: 🌛X状态  🌛Z状态 ⭐僵尸进程 ⭐僵尸进程的危害  🌛孤儿进程 🌟作

    2024年02月13日
    浏览(70)
  • 【Linux】僵尸与孤儿 && 进程等待

    目录 一,僵尸进程 1,僵尸进程 2,僵尸进程的危害 二,孤儿进程 1,孤儿进程 三,进程等待 1,进程等待的必要性 2,wait 方法 3,waitpid 方法 4,回收小结 1,僵尸进程 僵死状态(Zombies)是一个比较特殊的状态。 当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取

    2024年02月04日
    浏览(36)
  • 【Linux深入剖析】进程状态---进程僵尸与孤儿

    📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 进程 = taskk_stuct + 可执行程序 进程不是一直在运行的 进程放在cpu上也不会一直运行的 它可能在等待某

    2024年03月18日
    浏览(57)
  • 【Linux取经路】探索进程状态之僵尸进程 | 孤儿进程

    进程状态是指在操作系统中,一个进程所处的不同运行状态,进程状态就决定了该进程接下来要执行什么任务。常见的进程状态有以下几种: 新建状态 :进程被创建但还没有被操作系统接受和分配资源。 就绪状态 :进程已经获得了所需的资源,并等待被调度执行。 运行状

    2024年02月12日
    浏览(39)
  • 【Linux】进程状态&&僵尸进程和孤儿进程&&阻塞、挂起和运行

    个人主页 : zxctscl 如有转载请先通知 上一篇博客中提到 【Linux】进程初步理解,这次继续来分享与进程有关的知识。 Linux的进程状态就是struct task_struct内部的一个属性。 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在

    2024年04月14日
    浏览(38)
  • 【Linux】进程排队的理解&&进程状态的表述&&僵尸进程和孤儿进程的理解

             进程不是一直运行的,进程可能会在等待某种软硬件资源。即使把进程加载到CPU中,也不是一直会运行的。而进程排队,一定是在等待某种软硬件资源(可以是CPU,键盘,磁盘,网卡等等设备......), 排队时是进程的PCB在排队 。 在这里就需要引入一个概念: 一

    2024年03月21日
    浏览(44)
  • Linux操作命令&静态库和动态库区别&大小端&孤儿僵尸进程

    cd:切换当前目录 ls:查看当前文件与目录 grep:通常与管道符命令一起使用,用于对一些命令的输出进行筛选和加工 cp:复制文件或文件夹 mv:移动文件或文件夹 rm:删除文件或文件夹 ps:查看进程情况 kill:向进程发送信号 tar:对文件进行打包 cat:查看文件内容 top:查看

    2024年02月16日
    浏览(42)
  • 基于linux下的高并发服务器开发(第二章)- 2.7 进程退出、孤儿进程、僵尸进程

    ◼ 父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程 (Orphan Process)。 ◼ 每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init 进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束 了其生

    2024年02月16日
    浏览(54)
  • 『Linux从入门到精通』第 ⑰ 期 - 那年我手执『wait』桃木剑,轻松解决僵尸进程~

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月16日
    浏览(47)
  • 【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②

    目录 1.进程排队 时间片 时间片的分配 结构体内存对齐 偏移量补充 对齐规则  为什么会有对齐 2.操作系统学科层面对进程状态的理解 2.1进程的状态理解 ①我们说所谓的状态就是一个整型变量,是task_struct中的一个整型变量 ②.状态决定了接下来的动作 2.2运行状态 2.3 阻塞状

    2024年04月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包