【进程概念】进程状态以及僵尸进程(结合代码)

news2024/9/20 1:09:08

文章目录

  • 进程状态
  • 实验观察进程的各个状态
    • 动态监视进程的脚本
    • 代码样本1:观察S(浅度睡眠)状态
    • 代码样本2:观察R(运行)状态
    • 发送`kill -19 `信号 观察T(暂停)状态:
    • 调试代码,观察t(追踪)状态
    • X(死亡)状态
    • D(深度睡眠)状态
    • Z状态(僵尸进程)
  • 孤儿进程
  • 进程的五态模型

进程状态

进程状态的概念
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换
而在task_struct里,其实也就是用一些变量来表示进程状态,其中state表示的就是进程的当前状态,state定义在 Linux 源文件 include/linux/sched.h 头文件中.-1 就表示不能运行,0表示运行,大于0表示停止。

 volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
 int exit_state;
 unsigned int flags;

观察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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
Z僵尸状态(zombie):当进程退出且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程

实验观察进程的各个状态

动态监视进程的脚本

为了方便实时观察进程的状态,我们可以新开一个窗口使用一个动态监视的脚本来观察:

while :; do ps ajx|head -1 && ps ajx|grep test | grep -v grep;sleep 1; done

ps ajx|head -1的意思就是打印进程信息的头部状态栏属性
ps ajx|grep test | grep -v grep 显式包含test的进程的信息,并过滤掉grep指令本身这个进程
while :;do 指令 ; sleep 1 done循换while中的指令,每过一秒执行一次

代码样本1:观察S(浅度睡眠)状态

在这里插入图片描述

运行程序并执行脚本观察
在这里插入图片描述
以上结果很奇怪,在右边的窗口中,test程序一直在printf打印,可是为什么进程的状态显示是S休眠状态(S+中的’+‘表示该进程在前台运行,运行时加一个&就可以使程序在后台运行)
原因是CPU的处理速度太快了,每次程序在申请打印资源的时候都需要等待。相对cpu来说,等待这个过程的时间是漫长的。而等待成功后向屏幕打印这个动作几乎是瞬间的,马上就又要去等待。所以在我们的监测脚本看来,好像一直处于休眠状态,其本质原因在于CPU的运算速度比显示器这个外设的运算速度要快得多。所以我们大概率只能看到休眠状态。
由此我们也能理解,休眠状态其实就是在等待“资源”就绪
此外,我们能用ctrl+c能够强行终止一个在休眠的进程,这样的休眠状态也叫可中断休眠(浅度睡眠)

代码样本2:观察R(运行)状态

在这里插入图片描述
运行程序并执行脚本观察,R状态
在这里插入图片描述
果然,将打印代码注释掉之后,我们就能看到进程的运行状态R

发送kill -19 信号 观察T(暂停)状态:

kill -l查看信号
在这里插入图片描述
发送信号暂停某个进程,继续运行代码样本2:
格式是 kill + 信号编号+进程pid
在这里插入图片描述
再发送kill -18 26187唤醒被暂停的进程,于是test进程的状态由T变成了R
在这里插入图片描述
T状态时,程序处于暂停状态,此时信息没有任何更新,是完全的暂停。处于S状态的进程会有一些数据更新,比如睡眠了多少秒等
那么t状态和T状态有区别吗?
答案是有的。

调试代码,观察t(追踪)状态

t状态表示跟踪状态,这个状态有点特殊,常在调试中遇见:
在这里插入图片描述
在这里插入图片描述
当我们打好断点进行调试,程序在遇到断点处就会暂停变为追踪状态。此时的进程在等待gdb进程对他进行操作。
和T状态不同的是,t状态不能被kill -18 信号唤醒只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作 (通过ptrace系统调用的参数指定操作), 或调试进程退出,被调试的进程才能恢复R状态

X(死亡)状态

表示一个进程死亡,CPU会进行资源的回收。由于这个状态比较瞬时,难以观察到。

D(深度睡眠)状态

D(disk sleep),深度睡眠状态,又叫不可中断睡眠状态。跟S状态类似,都是在休眠等待”资源“,但是D状态不能被中断。也就意味着用kill发送中断信号对它也没用。一旦进入了D状态,就只能被资源唤醒(或者重启、断电)。

Z状态(僵尸进程)

Z状态又叫僵尸状态。表示一个终止了但是还未被回收的进程的状态
当一个进程由于某种原因终止时,内核斌并不是立即把他从系统中清除。相反,进程被保持在一种已终止的状态中,知道被父进程回收。当父进程回收已终止的子进程时,内核就会把子进程的退出状态传递给父进程,然后抛弃已经终止的进程,这个时候子进程就不存在了。

为什么已经终止的子进程被称为僵尸进程?
在民间的传说中,僵尸是活着的尸体,一种半生半死的实体。而僵尸进程已经终止了,内核还在保留着他的退出信息知道父进程回收为止,与僵尸类似。

给出以下代码观察僵尸状态
在这里插入图片描述
运行脚本监测
在这里插入图片描述
在这里插入图片描述

观察代码我们可以知道,子进程被创建后休眠五秒后马上就return;此时的子进程已经被终止,但是并没有马上释放所有资源,而是等待父进程的回收。父进程这个时候陷入了较长的休眠状态,并没有马上回收子进程。于是导致了子进程称为了僵尸进程。如果没有父进程去处理这些退出信息,僵尸进程就会一直存在,其部分未释放的资源也一直存在。也就造成了内存泄漏
在这里插入图片描述

孤儿进程

与僵尸进程相反,如果父进程先终止,那该父进程的子进程就会成为孤儿进程
成为孤儿进程后,内核会安排init进程成为它的孤儿进程的养父init进程的PID为1,是在系统启动的时候由内核创建的,他不会终止,是所有进程的祖先。如果父进程还没来得及回收僵尸子进程就终止了,init进程也会去回收它们。不过长时间运行的程序,比如shell或者服务器,总是应该回收它们的僵尸子进程。即使僵尸子进程没有运行,它们也消耗内存资源。

观察以下代码
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
当父进程终止,子进程成为孤儿进程,被init领养
在这里插入图片描述
在这里插入图片描述

进程的五态模型

上面的七种进程状态可以总结为三种:运行、阻塞、挂起。
是不是非常熟悉呢,这就是我们教科书上经常看到描述进程状态的三种状态。
在这里插入图片描述
其中运行态R分为两个部分:
一个是真正在CPU中执行的进程状态(运行态)
一个是在CPU的运行队列中但是还没有进入CPU的进程状态(就绪态)
这两种状态都可以被称为运行态。
在这里插入图片描述

挂起状态通常发生在内存不足的情况下,系统会将暂时用不到的一部分进程资源换出到磁盘里面,此时进程状态为S,等内存不在那么紧张的时候再唤醒该进程,并重新将资源加载到内存里面。整个过程比较消耗时间,是一种用时间换空间的做法。

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

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

相关文章

原型、原型链

如图: 判断对错: Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性 prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。 Q2:通过 proto 属性来连接对象…

MOSDANET

# in the figure refers to the first term of Equation 1 辅助信息 作者未提供代码

2024年【山东省安全员C证】免费试题及山东省安全员C证作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 山东省安全员C证免费试题根据新山东省安全员C证考试大纲要求,安全生产模拟考试一点通将山东省安全员C证模拟考试试题进行汇编,组成一套山东省安全员C证全真模拟考试试题,学员可通过…

Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的环境管理与虚拟环境的使用 在Python开发中,环境管理是至关重要的一环…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

轻松去除视频号水印:高效下载无痕视频教程

短视频已经成为了我们获取知识、娱乐消遣的主要途径之一。而视频号作为一个新兴的短视频平台,凭借其丰富的内容和便捷的操作界面,吸引了大量用户的关注。然而,有时候我们想要保存自己喜欢的视频,却发现视频上带有水印,…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接: 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明: 首先,考虑DFS暴力解:对于蜗牛来说,它出发的起点可能是: 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi, 那么他有三种方式走&…

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象,作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

🔥博客主页:PannLZ 😘欢迎关注:👍点赞🙌收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性,看看各个字段的注释,可是打开一看,居然是乱码的,如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据, Scanner inputnew Scanner(System.in); 导包的方式: 什么是导包,导入的是jdk提供的java开发工具包,我们建一个java文件,psvm快捷输入后,打上new S…

预约陪诊APP定制开发方案以及流程详解

随着医疗行业的快速发展,越来越多的人开始关注自己的健康问题。然而,在看病的过程中,很多人都会感到孤独和无助。为了解决这个问题,许多医疗机构和企业推出了预约陪诊APP,旨在为用户提供一个安全、便捷的陪伴服务。本文将详细介绍…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

【漏洞复现】金和OA IncentivePlanFulfill.aspx SQL注入漏洞

0x01 产品简介 金和OA协同办公管理系统C6软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效…

基于Springboot的农产品销售管理系统+数据库+免费远程调试

项目介绍: 基于Springboot的农产品销售管理系统。Javaee项目,springboot项目。采用M(model)V(view)C(controller)三层体系结构,通过SpringMvc SpringBootMybatisVuemaven来实现。MyS…

大数据--hdfs--java编程

环境: virtualbox ubantu1604 Linux idea社区版2023 jdk1.8 hadoop相关依赖 使用java操作 1. 判断/user/stu/input/test.txt文件是否存在,存在则读出文件内容,打印在控制台上。反之,输出“文件不存在”。 package abc;impo…

5 线程网格、线程块以及线程(2)

5.3 线程块 即使有512个线程,也不能让你在GPU上斩获颇丰。对很多在CPU上编程的编程人员来说,这似乎是一个很大的数量,但其实在GPU上编程的时候,512个线程并不一定会让你获得很高的效益,对于GPU而言,通常我…

PTA L2-026 小字辈

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,…

使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓,并自动部署到服务器启动服务

文章目录 使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓,并自动部署到服务器启动服务1、功能原理实现2、将自己的Java项目通过Git上传到阿里的代码仓库中,也可以通过绑定Gitee或者GitHub账号进行导入3、创建自己的阿里云镜像私仓3、进入阿里的C…