【进程概念】Linux进程状态 | 僵尸进程 | 孤儿进程

目录

Linux中的进程状态

R运行状态&S休眠状态

T/t停止状态stopped(tracing stop)

D磁盘休眠状态Disk sleep 

X死亡状态dead&Z僵尸状态zombie 

僵尸进程

僵尸进程的理解

演示僵尸进程

僵尸进程的危害

孤儿进程

孤儿进程的理解

演示孤儿进程

进程状态的查看


本篇主要介绍task_struct中进程的状态,具体介绍Linux中进程状态,一个状态一个状态细谈。

Linux中的进程状态

  • 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
  • 每个进程都有自己的进程状态
  • 进程状态在task_struct内部的一个属性 int status
  • OS更改一个进程状态,只是更改进程的task_struct 的状态属性,只是一个标志位用来表明进程的状态,经此而已。

Linux操作系统本身的对状态的定义有以下:

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping) 意味着进程在等待事件完成(这里的睡眠有时候叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是个返回状态,你不会在任务列表里看到这个状态。
下面的状态在kernel源代码里定义:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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运行状态&S休眠状态

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

 S睡眠状态(sleeping) 意味着进程在等待事件完成(这里的睡眠有时候叫做可中断睡眠(interruptible sleep))。


运行下列程序,我们发现,为什么printf打印显示的时候存在休眠状态,既有S+也有R+这个状态,这是怎么一回事呢❓

我们把下面需要显示器打印的代码全部注释掉,只保留循环,全是S+,这又是为什么呢❓

//既有S+/R+ 1 #include<stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     while(1)8     {9         printf("I am a process,pid:%d\n",getpid());  10     }11     return 0;12 } //只有R+1 #include<stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     while(1)8     {9        // printf("I am a process,pid:%d\n",getpid());10     }                          11     return 0;                  12 }

 解释:

  • printf的本质是向显示器终端打印。
  • 根据冯诺依曼体系结构,打印的代码需要先写到内存再刷新到外设。
  • 程序是从CPU写入内存,由内存刷新到外设,CPU的运算速度比外设快很多,外设设备是不能保证每次都准备就绪。
  • 综上所述,进程就存在等待外设准备就绪,此刻进程的状态就是浅度睡眠的状态S。
  • 如果外设设备准备好了,进程可以向显示器打印数据,此刻进程的状态就是运行R。
  • 所以,当打印代码被注销,不需要访问外设设备,此刻进程的状态一直都是R。

进程被调度的时候需要访问显示器资源,进程的信息往显示器上打印的时间 相较于 CPU运行慢很多,所以进程大部分时间都在等待外设资源准备就绪,此时进程的状态就是S。只有真正执行打印打代码的时候,进程的状态此时R。


  • S在前台,S+在后台跑(前台/后台,后面谈)
  • S状态,休眠状态,处于进程等待的状态。
  • S是可中断睡眠:进程处于休眠状态,但是依旧可以随时被外部信息打断。

T/t停止状态stopped(tracing stop)

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

T/t:让进程暂停,等待进一步被唤醒。


关于进程中的信号(先应用,后面理解)

  • 用一个kill进程去控制目标进程的是否暂停状态
  • 查看信息kill -l
  • kill命令可以向指定进程发信号
  • kill -9 进程pid杀死进程
  • kill -19 pid暂停进程
  • kill -18 pid唤醒进程
  • 注意:暂停一个进程并且再次唤醒它,它自动被切换到后台。
  • Linux中Ctrl+c是中断进程,kill是终止进程。(ctrl+C和kill❓❓)

  • 进程是T/T+表示纯粹暂停状态
  • gdb调试代码打断点的时候t/t+表示进程被追踪,进程暂停的状态
  • 两种进程的相互切换时因为遇到了断点,进程就被暂停了

【kill -9】 

 【kill -19 & kill -18】

【调试gdb】 

D磁盘休眠状态Disk sleep 

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

  • LinuxOS存在一种特有的权力:当内存严重不足的时候,杀掉进程来释放空间
  • 以下情况的发生根本原因是:OS杀死进程是毫无类型的杀死,哪怕是正在写入关键数据的进程。正在写入关键数据的进程是不能被杀死的。
  • 防止下面情况:凡是进程都需要数据IO
  • 若进程在等待【磁盘】资源,需要将自己的状态设置为D状态。(不可中断睡眠)

  • D状态时系统里特有的一种进程状态。是OS对磁盘的单独状态。
  • D状态是不可被杀,不可中断,深度睡眠。
  • D状态的存在的目的:保证进程IO的时候,等待磁盘资源时不能被杀。
  • S状态时浅度睡眠。
  • 消除D状态有2中方法
  1. 进程自己醒来(磁盘写入完成)
  2. 重启断电
  • 数据IO&进程IO(后面讲)

 

X死亡状态dead&Z僵尸状态zombie 

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

Z僵尸状态(zombie ):和下面的僵尸进程有关。OS很难查到所以就不做演示了。

👇👇和僵尸进程一起理解

僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态 
  • ptrace系统调用追踪进程运行Ptrace 详解 - tangr206 - 博客园 (cnblogs.com)

僵尸进程的理解

  • 子进程退出不是默默无闻退出的,而是将自己的退出信息保存在自己的PCB中。
  • 进程退出之后,进程的代码和数据会被释放,但是进程的PCB一直不会释放。
  • 若有人读取了进程的退出代码(有人对进程进行了"等待",后面谈),则进程的PCB才会被释放。由Z☞X
  • 若一直进程的PCB的退出信息没有被读取则一直不会被释放,一直处于"僵尸状态"Z
  • 父进程读取/等待子进程PCB的退出信息
  • 释放PCB还是由OS来实现(一瞬间的事情)

所以综上所述:进程退出时不会立即全部被释放(数据/代码会 PCB内核数据结构不会)处于Z僵尸状态。子进程已经运行完毕,但仍需要维持自己的退出信息,在自己的进程的task_struct会记录自己的退出信息,未来让父进程去读取/等待。(❓怎么读取 等待接口 后面讲)

演示僵尸进程

  • 父进程持续循环
  • 子进程循环几次结束
  • 此时子进程就是僵尸进程,处于僵尸状态Z
12151 12152 12151 13529 pts/1    12151 Z+    1000   0:00 [testStatus] <defunct>
//僵尸进程
  1 #include<stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     pid_t id=fork();//创建父子进程8     if(id == 0)9     {10         //child11         int cnt=7;12         while(cnt--)13         {14            printf("I am child process,cnt:%d,pid:%d\n",cnt,getpid());15            sleep(1);16         }17     }18     else//id>019     {                                                                   20         //parent21         while(1)22         {23             printf("I am parent process,pid:%d\n",getpid());24             sleep(1);}}27     return 0;28 }

僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
  • 一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!
  • 因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!内存泄漏?是的!
  • 如何避免?后面讲

孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为“孤儿进程”
  • 孤儿进程被1号init进程领养,当然要有init进程回收喽。

孤儿进程的理解

演示孤儿进程

进程状态的查看

ps aux / ps axj 命令

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

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

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

相关文章

【Java程序设计】【C00352】基于Springboot的疫情隔壁酒店管理系统(有论文)

基于Springboot的疫情隔壁酒店管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅲ)

1.连接查询 连接查询&#xff1a;同时涉及多个表的查询 连接条件或连接谓词&#xff1a;用来连接两个表的条件 一般格式&#xff1a; [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [&l…

Typecho 博客文章评论添加显示 UserAgent(UA)的功能

本篇文章实现了为 Typecho 博客文章评论添加显示 UserAgent&#xff08;UA&#xff09;的功能本功能可替代 UserAgent 插件&#xff0c;更美观、简洁且好看 效果显示 大概就是这样了&#xff0c;实际效果请看我的评论&#xff01; 目前可以识别的操作系统以及浏览器 食用方…

用redis lua脚本实现时间窗分布式限流

需求背景&#xff1a; 限制某sql在30秒内最多只能执行3次 需求分析 微服务分布式部署&#xff0c;既然是分布式限流&#xff0c;首先自然就想到了结合redis的zset数据结构来实现。 分析对zset的操作&#xff0c;有几个步骤&#xff0c;首先&#xff0c;判断zset中符合rangeS…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.1 神经网络概述&#xff08;Neural Network Overview&#xff09;3.2 神经网络的表示&#xff08;Neural Network Representation…

ArkTS编写的HarmonyOS原生聊天UI框架

简介 ChatUI&#xff0c;是一个ArkTS编写的HarmonyOS原生聊天UI框架&#xff0c;提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

【Java常用API】带目的的爬虫

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

西井科技与安通控股签署战略合作协议 共创大物流全新生态

2024年3月21日&#xff0c;西井科技与安通控股在“上海硅巷”新象限空间正式签署战略合作框架协议。双方基于此前在集装箱物流的成功实践与资源优势&#xff0c;积极拓展在AI数字化产品、新能源自动驾驶解决方案和多场景应用&#xff0c;以及绿色物流链等领域的深度探索、强强联…

视频汇聚平台EasyCVR启用图形验证码之后调用login接口的操作方法

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

Windows如何搭建 ElasticSearch 集群

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中。 除了负载能力&#xff0c;单点服务器…

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

确定碰撞体积 选择rigidbody2d&#xff0c;创建player重力 创建player碰撞体积 创建瓦片地图碰撞体积 使平台变成一个整体 ​​​​​ 设置Body Type为Static&#xff08;避免平台也因为重力影响下落&#xff09; 回到Player&#xff0c;在Rigidbody2D中设置为冻结旋转 Player设…

2016年认证杯SPSSPRO杯数学建模C题(第二阶段)如何有效的抑制校园霸凌事件的发生全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现&#xff1a; 近年来&#xff0c;我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的&#xff0c;因此对于这些情况我们应该…

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊

Java毕业设计 基于SSM网上二手书店系统

Java毕业设计 基于SSM网上二手书店系统 SSM jsp 网上二手书店系统 功能介绍 用户&#xff1a;首页 图片轮播 图书查询 图书分类显示 友情链接 登录 注册 图书信息 图片详情 评价信息 加入购物车 资讯信息 资讯详情 个人中心 个人信息 修改密码 意见信息 图书收藏 已经付款 邮…

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域&#xff1a;代码块、函数内的全局作用域&#xff1a;顶层作用域&#xff0c;代码块外的就是全局&#xff0c;如果变量名大写&#xff0c;则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type)&#xff0c;如果类型断言…

怿星科技Neptune CHT-S测试系统,让智能座舱测试更加高效便捷

随着汽车“智能化”浪潮的推进&#xff0c;汽车的智能化水平正在持续刷新行业认知。在这股智能化潮流中&#xff0c;智能座舱作为客户体验最为直观的部分&#xff0c;其重要性不言而喻。倘若座舱设备出现死机、黑屏、卡顿等现象&#xff0c;都将对客户的使用体验产生非常大的影…

xmes前端问题,给form表单赋值后,再次从表单拿不到该值

xmes前端&#xff0c;给form表单赋值后&#xff0c;再次从表单拿不到该值&#xff0c;但页面可以展示 赋值 this.$[frm-main].$$([namefilm_num]).value filmNum ; 获取表单的值&#xff0c;这里拿不到之前赋的值 const reqData this.$[frm-main].serializeMyForm(); 原因&…

2.7、创建列表(List)

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…