【Linux-进程状态】

文章目录

  • 1.进程状态
    • 1.运行状态
    • 2.阻塞状态
    • 3.挂起
  • 2.Linux系统中的进程状态
    • 1.前台进程和后台进程
      • 深度睡眠
    • 2.停止状态
    • 3.僵尸状态和死亡状态(孤儿进程)

1.进程状态

想要理解进程状态,我们要先看看课本中的进程有哪些状态。
在这里插入图片描述
进程状态用大白话说,就是pcb中的一个字段,就是pcb中的一个变量:int status;
在这里插入图片描述

所谓的状态变化,本质就是修改整形变量。

1.运行状态

什么叫做运行状态?
每一个cpu在系统层面上都会维护一个运行队列。当我们磁盘中的可执行文件加载到内存中的时候,操作系统会对其产生相应的pcb,当这个程序运行的时候,就会将它的pcb加载到运行队列中。只要在运行队列中的进程,状态都是运行状态,表示我已经准备好了,随时就会被调度。在这里插入图片描述

2.阻塞状态

我们的代码中,一定会或多或少的访问系统中的某些资源,例如:磁盘,键盘,网卡等。当我们调用scanf,cin类似的函数,本质是想要从键盘中获取数据,但是如果不输入,键盘上的数据就没有就绪。我们进程要访问的资源就没有就绪。
那么操作系统要不要知道设备的状态呢?操作系统一定是最先知道它管理的设备的状态变化的。操作系统怎么知道呢?一定是先描述,在组织。每一个设备也会有它对应的pcb,存储着它的状态,所在队列等属性。

在这里插入图片描述
当我们没有输入数据时,设备的数据状态就是没有准备好的,所以这个设备就不具有访问条件,进程代码无法继续向后执行。这时进程就处在阻塞状态,同时,操作系统也会将键盘的pcb放入等待队列中。当我们输入数据时,再将它放入运行队列,进程就可以正常执行了。

在这里插入图片描述
进程的pcb是可以在多个队列中的。
在这里插入图片描述

3.挂起

在这里插入图片描述

2.Linux系统中的进程状态

  • 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
  • 下面的状态在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运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

1.前台进程和后台进程

当我们想循环打印一段代码时,我们发现它的状态是S+,我们正在运行这个代码啊,它不是应该是运行状态吗,为什么是睡眠状态呢?
在这里插入图片描述
在显示器上只是我们肉眼看到了代码在不断打印,打印本质是往显示器上打印,在冯诺依曼体系当中,你的进程是在内存里的,说白了就是将内存里的数据不断向外设进行刷新,当你刷新的时候,你的外设不一定是准备好的。所以在我们运行期间,查出来的状态大部分是S状态。当我们只进行while循环,不进行打印,发现进程状态就都是R+了在这里插入图片描述
我们发现,这两个状态后面都有一个加号,它表示的是什么呢?
它表示当前进程是一个前台进程,当进程运行起来时,我们在想执行其它指令,就无法执行了。系统的一个bash中只能启动一个前台进程
在这里插入图片描述
当我们./运行程序的时候加上一个 & ,就可以让它后台运行了。这时后进程不能ctrl+c删掉了,我们可以用kill-9命令删掉它

深度睡眠

有浅度睡眠就会有深度睡眠。
在这里插入图片描述
当我们的进程要向磁盘写入数据时,在进程等待的过程中,如果操作系统内存紧张,会杀掉进程,节省资源。如果此时进程被杀掉了,磁盘中的写入如果失败了,就会出现BUG。所以为了不让操作系统杀掉写入磁盘的进程,操作系统就设置了一种D深度睡眠状态,谁也不能杀掉它,只能等待它的回应。
在这里插入图片描述

2.停止状态

我们通过kill-l命令可以查看信号指令,这些指令在操作系统中是被#define的
在这里插入图片描述
通过发送19号指令就可以让进程暂停,发送18号指令可以让进程继续。
我们在debug 程序的时候,我们打上断点,程序在运行中就是运行状态,到达断点位置时就变成了停止状态
在这里插入图片描述

3.僵尸状态和死亡状态(孤儿进程)

为什么我们要创建一个进??一定是为了完成某种任务。
那我们如何知道任务完成的怎么样呢?
进程在退出时,会有一些退出信息表明自己把任务完成的怎么样。由它的父进程接收。
当一个进程退出时,退出信息会由os到当前退出进程的pcb中,可以允许进程的代码和数据空间被释放但是不能允许进程的pcb被立即释放。要等它的父进程接收到子进程的退出信息后,子进程的pcb才可以被释放。

在这里插入图片描述
如果进程退出了,但还没有被父进程或者os读取,操作系统必须维护这个退出进程的pcb结构!!此时,这个进程算退出了吗??

  • 此时这个进程处于僵尸Z状态

  • 如果一个进程一直处于僵尸状态不回收,pcb就会一直存在。

  • 并且如果我们不回收,会有内存泄漏的问题

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

在这里插入图片描述

僵尸进程危害:

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

如果子进程的父进程直接退出了,子进程要被(操作系统)领养,变成孤儿进程。不然就会出现内存泄漏。
在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张,云渲染一张图的价格会受到多个因素的影响,如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此,无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…

《苍穹外卖》Day11部分知识点记录(数据统计——图像报表)

一、Apache ECharts 介绍 Apache ECharts是一款基于javascript的数据可视化图标库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 效果展示 柱形图饼图折线图 入门案例 1. 在 echart…

API安全尽释领先力,美创再获权威市场指南推荐

数字化时代,单位组织愈加依赖API实现系统间的数据共享和交互,但同时,因API引发的网络攻击风险也在不断升级,成为数据泄露的高发之地。 统计显示,过去的一年,API攻击增长已超过287%。Gartner研报预测&#x…

链动3+1模式:引领运营革命的创新之路与优势解析

在数字化浪潮的席卷之下,企业为寻求持续发展,已将商业模式创新视为核心驱动力。其中,链动31模式以其独特的运营理念,成功引领了一场革命性的运营变革,使得众多企业和个人在激烈的市场竞争中崭露头角。接下来&#xff0…

Docker 容器操作

容器创建 就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。 格式:docker create [选项] 镜像 常用选项: -i:让容器开启标准输入 -t:让…

RLDRAM简介

说明 RLDRAM(Reduced Latency DRAM,减少延迟动态随机访问存储器)是一种专为解决延迟问题而设计的DRAM架构,主要由美光和英飞凌公司开发。它的出现主要是为了满足对更低延迟、更高带宽的SRAM市场的需求。 随着技术的不断发展&…

上位机图像处理和嵌入式模块部署(树莓派4b与mcu固件升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在一个系统当中,可能不止需要树莓派4b一个设备。有的时候还需要搭载一个mcu,做一些运动控制的事情。比如说,图像…

电脑处于局域网,怎么查询电脑公网IP

当你购买了云服务器,要设置安全组的时候,就是限制能访问你的服务器的网络IP,比如限制只有你的电脑能连接你的服务器 那么一般就是要就要开放服务器的22号端口,端口范围就是你要开放的服务器的端口,如上图所示授权对象就…

【JAVA】探究Java依然屹立的25个理由

1.生态系统成熟 Java 具有广泛的生态系统,我们可以自由选择库、构建工具和框架。 2.一次编写,到处运行 Java 具有跨平台特性,一次编写,到处运行。 3. 向后兼容性 Java 承诺永远向后兼容,非常nice。 4. JAVA强类型…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日,百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会,围绕汽车智能化,发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶,201…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者,我长期关注特殊群体的生活现状与科技助力下的改善举措。今天,我要讲述的是盲人朋友在独立出行,尤其是过马路时面临的挑战,以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能,显著提…

vue2[黑马笔记]

vue基础 是什么—javascript框架 构建用户界面的前端框架 1.构建用户界面用vue往html页面中填充数据 2.框架现成的解决方案,遵守框架的规范去实现自己的业务功能学习vue 就是学习vue框架中规定的用法vue的指令组件(对ul结构的复用)&#x…

袁庭新ES系列16节|Elasticsearch客户端高级操作

前言 上一章节袁老师主要带领大家学习了Elasticsearch客户端基础部分的内容,Elasticsearch客户端还有很多高级相关的操作,这一章节主要带领大家来学习Elasticsearch客户端高级相关的操作。接下来就跟上袁老师的节奏继续探讨Elasticsearch的相关知识。 一…

swiper使用方法?

组件 首先 recat -vant组件 带小点点的 可以实现跳转的一个效果 import { Swiper } from react-vant; 每个 Swiper.Item 代表一张轮播卡片,可以通过 autoplay 属性设置自动轮播的间隔。 import React from react; import { Swiper } from react-vant; import { i…

游戏新手村20:游戏落地页广告页如何设计

在互联网营销中,着陆页(Landing Page,有时被称为首要捕获用户页)就是当潜在用户点击广告或者搜索引擎搜索结果页后显示给用户的网页,LandingPage对于游戏广告的转化率和重要性就不言而喻了。 网页游戏LP页面 上图就是我们大家在浏览网站时不小心蹦出或者主动点击某…

数据结构(八)——排序

八、排序 8.1 排序的基本概念 排序(Sort),就是重新排列表中的元素,使表少的元素满足按关键字有序的过程。 输入∶n个记录R1,R2...., Rn,对应的关键字为k1, k2,... , kn 输出:输入序列的一个重排R1,R2....,Rn,使得有k1≤k2≤...≤…

快速入门Web开发(下)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 有没出现的图片 请访问 传送门 这是我的掘金账号 掘金文…

【MySQL】查询数据,对结果进行排序(关键字:ORDER BY)

文章目录 单列排序多列排序指定排序方式,升序(ASC,ASCENDING) / 降序(DESC,DESCENDING)ORDER BY 关键字与 LIMIT 关键字联用 我是一名立志把细节都说清楚的博主,欢迎【关注】&#x…

Vue项目中引入高德地图步骤详解,附示例代码

vue中如何使用高德地图,下面为您详解。 步骤一:安装高德地图的JavaScript API 在Vue项目的根目录下打开终端,执行以下命令安装高德地图的JavaScript API: npm install amap/amap-jsapi-loader --save 步骤二:创建地…

【数据结构6--图】

目录 1 图2 图的定义和基本概念(在简单图范围内)3 图的类型定义4 图的存储结构4.1 邻接矩阵 表示法4.2 邻接表 表示法4.3 十字链表 表示法4.4 邻接多重表 表示法 5 图的遍历5.1 深度优先搜索-DFS 及 广度优先遍历-BFS 6 图的应用6.1 最小生成树6.1.1 克鲁…