Linux进程--进程状态

文章目录

一、运行状态R

运行状态并不想字面上说的只包括运行时的程序,而是包括了正在运行的和在排序队列里的程序,其实就是可以被直接调度的程序。下面我们来举个例子。

在file这个可执行程序里我们就有两个进程,这两个进程都在运行,所以我们可以看到两个进程都有R+的状态。

二、休眠状态

1.浅度休眠/阻塞状态S

浅度休眠是一种挂起状态,其实就是一个等待其他进度(I/O等待,信号等待、、、)的过程,我们可以进行一个测试。

c 复制代码
#include<stdio.h>
  2 int main()
  3 {
  4   int a;
  5   scanf("%d",&a);                                               
  6   printf("%d",a);
  7   return 0;
  8 }

tests中的进程就是在等待scanf的输入,这时候就是处于一个休眠状态,可以通过Ctrl+C直接进行终止。

2.深度休眠D

深度休眠也被称为磁盘休眠,这种情况是当磁盘空间紧张的时候,用来保护进程的pcb的安全的,防止OS对正在等待磁盘空间的pcb进行误删。只不过这种情况我们很难演示,因为当这个状态出现时,说明磁盘空间已经非常紧张了,反应速度也很慢,系统这个时候就已经快挂掉了。而且也是不可中断的。

三、停止状态T

停止状态一般是为了防止进行危险操作而将进程停止的状态。通过SIGSTOP指令让进程进入停止状态,处于这个状态的进程,只能接收特殊的指令,一般指令都不会再接收,当输入SIGCONT指令时,可以让暂停的进程开始运行。

四、僵尸状态Z

1.僵尸状态的定义

僵尸状态就是进程结束之后到被父进程接收之前的这段时间,这段时间内,代码已经被释放,但是pcb中的进程属性和数据还要等待父进程的接收。

2.为什么会有僵尸进程

因为在每个子进程结束之后,父进程都要去接受子进程运行的数据,但是父进程并不会自动接收,而是要通过wait去回收,我们通过一个例子演示一下。

c 复制代码
#include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main()
  5 {
  6   pid_t d=fork();
  7   if(d<0)
  8   {
  9     return -1;
 10   }
 11   else if(d==0)
 12   {
 13     printf("我是子进程,pid is %d,ppid is %d\n",getp    id(),getppid());
 14    // sleep(1); 
 15   }
 16   else
 17   {
 18     while(1){
 19     printf("我是父进程,pid is %d,ppid is %d\n",getp    id(),getppid());
 20     sleep(1);                                      
 21   }
 22   }
 23   return 0;
 24 }

输出结果如下图所示

下面的是子进程,此时的子进程已经变为了Z的状态,并且最后也标识出了子进程是已经被销毁了的。

想要进行回收,就只需要在父进程的代码 最后加上一个wait函数即可。

3、僵尸进程的危害

僵尸进程如果长时间存在的话,那么在内存中就会有大量的pcb存在,但是这些pcb所描述的进程都已经结束过了,所以就会造成系统层面的内存泄漏。

五、死亡状态X

死亡状态我们很难直接捕捉到,因为这是一个瞬时状态,在完成回收之后,一瞬间就会让这个进程死亡。

六、孤儿进程

顾名思义,就是当父进程比子进程先结束的时候,子进程就会变成一个孤儿进程,此时的孤儿进程就会被init进程回收,ppid变为1。

此时的子进程还会变成一个后台进程,我们通过Ctrl+c已经不能终止这个进程了,需要通过kill -9 +进程pid来终止这个进程。

创作不易,感谢阅读。

相关推荐
翼龙云_cloud几秒前
亚马逊云渠道商:如何在AWS控制台中创建每月成本预算?
服务器·云计算·aws
全栈软件开发1 分钟前
PHP实时消息聊天室源码 PHP+WebSocket
开发语言·websocket·php
小尧嵌入式5 分钟前
【Linux开发二】数字反转|除数累加|差分数组|vector插入和访问|小数四舍五入及向上取整|矩阵逆置|基础文件IO|深入文件IO
linux·服务器·开发语言·c++·线性代数·算法·矩阵
代码游侠5 分钟前
ARM开放——阶段问题综述(一)
arm开发·笔记·嵌入式硬件·学习·架构
试试勇气6 分钟前
Linux学习笔记(十二)--用户缓冲区
linux·笔记·学习
@小博的博客7 分钟前
Linux 中的编译器 GCC 的编译原理和使用详解
linux·运维·服务器
电饭叔7 分钟前
has_solution = False 是什么 费马大定律代码化和定理《计算机科学中的数学》外扩学习3
学习·算法
Java后端的Ai之路8 分钟前
【AI应用开发工程师】-分享Java 转 AI正确思路
java·开发语言·人工智能·java转行·程序员转型
wdfk_prog8 分钟前
[Linux]学习笔记系列 -- [drivers][base]faux
linux·笔记·学习
ORBITVU9 分钟前
ORBITVU 自动化摄影眼镜360°展示解决方案
运维·自动化