Linux——进程概念(进程状态)

news/2024/5/20 22:48:24/文章来源:https://blog.csdn.net/m0_64388758/article/details/129187059

目录

进程状态

三态模型

五态模型

七态模型

Example

eg1:阻塞态:等待某种资源的过程

eg2:挂起态

Linux内核源代码

Linux进程状态查看

Linux运行状态

R运行状态(running):

S睡眠状态(sleeping):

 D磁盘休眠状态(Disk sleep):

T停止状态(stopped):

kill -19 SIGSTO(暂停stop)

kill -18 SIGCONT(继续continue)

 kill -9 SIGKIL(kill)

X死亡状态(dead):

 Z(zombie)-僵尸进程:

孤儿进程


进程状态

三态模型

进程状态分为 运行态,就绪态,阻塞态。

五态模型

进程状态分为 新建态、终止态,运行态,就绪态,阻塞态。

七态模型

进程状态分为 挂起就绪态、挂起等待态、新建态、终止态,运行态,就绪态,阻塞态

Example

eg1:阻塞态:等待某种资源的过程

        操作系统对外设的管理先描述再组织,操作系统有对应的结构体对外设进行管理,每个管理外设的结构体都有一个等待队列,这些结构体对需要访问该外设的进程进行管理,而等待的进程就被放入等待队列,进而变成阻塞状态,当相应的外设进行相关的操作,PCB(含有全部的属性和数据)便会被CPU执行
        进程因为等待某种条件就绪,而导致的一种不推进的状态——进程卡住了
        阻塞——不被调度——一定是因为当前进程需要等待某种资源(磁盘、网卡、显卡等各种外设)就绪——一定是进程task_struct结构体需要在某种被OS管理的资源下排队
        为什么阻塞?进程要通过等待的方式,等具体资源被别人用完之后,再被自己使用

 PCB可以被维护在不同的队列中

资源线性申请

eg2:挂起态

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

Linux进程状态查看

ps aux / ps axj     

Linux运行状态

R运行状态(running):

并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

传统意义上新建态、就绪态在Linux中就是R状态

我们来看两段代码
  • 含printf的循环
#include <stdio.h>int main()
{while(1){printf("我在运行吗??\n");}
}
//printf 本质就是向外设打印消息,循环打印的过程中外设不会一直处于运行状态,所处理的代码在等待队列中(CPU执行速度非常快)
  •  不含printf的纯循环
int main()
{while(1){//printf("我在运行吗??\n");}
}

 不含printf的纯循环,只需要进行判断,一个纯计算使用CPU不需要使用外设资源的代码,所以就是R状态

S睡眠状态(sleeping):

意味着进程在等待事件完成(本质是一种阻塞状态)

(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。

#include <stdio.h>int main()
{while(1){int a=0;scanf("%d\n",&a);printf("%d\n",a);//printf("我在运行吗??\n");}
}

 等待键盘输入,等待键盘资源

 D磁盘休眠状态(Disk sleep):

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

        我们来举个例子:假如现在有个进程,想向内存写入一个巨大的数据,磁盘将这些数据进行储存,而该进程等待磁盘工作完成并且在等待队列中等待,该进程S休眠,此时CPU执行其他的代码。此时操作系统路过,看到内存严重不足,并且看到该进程尚未执行,什么都不做,Linux就将其删除,当磁盘写完后,发现家被偷了,为了避免这种情况发生,我们保证在某种状态下,即便是操作系统,该进程在这种状态下也无法被杀死,这种状态即为D磁盘休眠状态

T停止状态(stopped):

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

#include <stdio.h>2 #include<unistd.h>3                                                4 int main()                           5 {                                    6   while(1)                           7   {                                  8 //    int a=0;                       9 //    scanf("%d\n",&a);              10 //                                   11 //    printf("%d\n",a);              12 //                                        13     printf("我在运行吗??,%d\n",count++);14     sleep(1);                        15   }                                  16 }

kill -19 SIGSTO(暂停stop)

kill -18 SIGCONT(继续continue)

 但是当我们control C时,仍然执行

注:control C只能中断在前台运行的代码,即我们显示状态的时候后方跟了+号的进程,由此可以解释之前显示状态的时候,为何S+后有一个+号,为了中断进程,不论前台或者后台的我们都可以使用kill -9 PID

 kill -9 SIGKIL(kill)

 "t (tracing stop)", /* 8 */ 追踪暂停也是暂停的一种,断点处停下来,本质就是进程暂停

X死亡状态(dead):

        这个状态只是一个返回状态,你不会在任务列表里看到这个状态 

 Z(zombie)-僵尸进程:

       
         僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲),没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 ,僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
        所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态来维持进程
        我们创建进程是为了让进程 帮助我们办事,而对于我们操作者而言,我们可能关心结果,也可能不关心结果;当我们是前者的时候,我们可以使用printf来查看结果,但是需要认为校验结果的准确性,我们也可以通过进程退出码来判断,如果一个进程退出了,立马X状态,立马退出,有没有机会拿到退出结果???Linux当进程退出的时候,一般不会立即彻底退出,而是要维持一个状态叫做,也叫做僵尸状态——方便后续父进程(OS)读取该子进程退出的退出结果
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
如何看到僵尸的状态??子进程退出,但是不要收回子进程
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);}}}

        我们kill -9 子进程,发现变成了Z+
        维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护,僵尸状态资源没回收完,如果一个父进程创建了很多子进程,就是不回收,就是不释放,会使得内存可用的越来越少,因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!不释放涉及内存泄漏等知识

孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
父进程退出,子进程就会被OS自动领养(通过让1号进程成为新的父进程)。
int main()
{pid_t id =fork();if(id==0){//childwhile(1){printf("我是子进程:pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);}}else {//parentint cnt=10;while(1){printf("我是父进程:pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);if(cnt--<=0)break;}}return 0;
}

 父进程的僵尸状态未被看见,因为其被其父进程即bash回收

32516的爹嘎了之后,又给自己找了一个爹,PPID为1

 为什么领养?如果不领养,子进程后续再退出,无人回收,游离的进程多了,占据更多的内存空间。

       并且我们可以看到,领养之前,子进程S+前台运行,领养之后,自动由前台变为后台运行,如果想杀掉该进程

  • kill -9 PID
  • killall myproc(进程名称)

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

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

相关文章

HEVC 编码速率控制

视频传输带宽通常都会受到一定的限制&#xff0c;为了在满足通信带宽和传输时延限制的情况下有效传输视频数据&#xff0c;保证视频业务的播放质量&#xff0c;需要对视频编码过程进行速率控制&#xff0c;所谓速率控制&#xff0c;就是通过选择一系列编码失真尽量小&#xff0…

一篇了解分布式id生成方案

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题&#xff0c;也常常为这个问题而纠结。生成ID的方法有很多&#xff0c;适应不同的场景、需求以及性能要求。所以有些比较复杂的系统会有多个ID生成的策略。下面就介绍一些常见的ID生成策略。 1.数据库自增长序列或字段 …

DCL单例模式是如何保证数据安全的?

承接上文证明CPU指令是乱序执行的DCL单例&#xff08;Double Check Lock&#xff09;到底需不需要volatile&#xff1f;new对象这一步&#xff0c;对应着汇编层面的这3个指令&#xff0c;指令0是申请空间&#xff0c;设置默认值&#xff1b;指令7是执行构造方法&#xff0c;设置…

计算机网络概述 第二部分

5.网络分层 ①OSI 7层模型 数据链路层 (Data Link Layer) 实现相邻&#xff08;Neighboring&#xff09;网络实体间的数据传输 成帧&#xff08;Framing&#xff09;&#xff1a;从物理层的比特流中提取出完整的帧 错误检测与纠正&#xff1a;为提供可靠数据通信提供可能 …

stm32f407探索者开发板(二十一)——窗口看门狗

文章目录一、窗口看门狗概述1.1 看门狗框图1.2 窗口看门狗工作过程总结1.3 超时时间1.4 为什么需要窗口看门狗1.5 其他注意事项二、常用寄存器和库函数2.1 控制寄存器WWDG_ CR2.2 配置寄存器WWDG_ CFR2.3 状态寄存器WWDG_SR三、手写窗口看门狗3.1 配置过程3.2 初始化窗口看门狗…

【微信小程序】-- 常用视图容器类组件介绍(六)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

LeetCode 725. 分隔链表

LeetCode 725. 分隔链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你一个头结点为 headheadhead 的单链表和一个整数 kkk &#xff0c;请你设计一个算法将链表分隔为 kkk 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差…

绿通科技在创业板开启申购:超额募资约19亿元,收入依赖贴牌

2月23日&#xff0c;广东绿通新能源电动车科技股份有限公司&#xff08;下称“绿通科技”&#xff0c;SZ:301322&#xff09;开启申购。据贝多财经了解&#xff0c;绿通科技本次上市的发行价为131.11元/股&#xff0c;发行数量为1749万股&#xff0c;市盈率73.75倍。 按发行价…

逆向 x品会 edata

逆向 x品会 edata 版本 7.88.6 帖子底部有参考说明 charles 抓包 目标字段 edata edata 搜索关键字 跟进找到是edata >>> KeyInfo native esNav 方法 private static native String esNav(Context context, String str, String str2, String str3, int i); …

XX项目自动化测试方案模板,你学会了吗?

目录 1、引言 2、自动化实施目标 3、自动化技术选型 4、测试环境需求 5、人员进度安排 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 1、引言 文档版本 版本 作者 审批 备注 V1.0 Vincent XXX …

不会前端没事,用GWT Boot和Spring Boot构建Web程序

本文介绍了一种使用Java构建Web应用程序的方式&#xff0c;其中GWT或者J2CL是必不可少的&#xff0c;另外还有多个UI框架可以配套使用&#xff0c;比如Domino UI、VueGWT、GWT Material Design (GMD)&#xff0c;React4J、WebFX&#xff0c;还有一些活跃低的框架GWTBootstrap3、…

【解决报错】‘jupyter‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

在当前路径下使用cmd打开后&#xff0c;输入jupyter notebook出现如下错误&#xff1a; 通常可能出现的问题有两种&#xff1a; &#xff08;1&#xff09;你本身就没安装jupyter&#xff0c;如果你配置了anaconda&#xff0c;就自带jupyter&#xff0c;直接跳到问题2。如果确…

Apache Commons FileUpload Apache Tomcat拒绝服务漏洞解决方案

近日&#xff0c;安全狗应急响应中心关注到Apache官方发布安全公告&#xff0c;披露在Apache Commons FileUpload&#xff1c;1.5版本中存在一处拒绝服务漏洞&#xff08;CVE-2023-24998&#xff09;。Commons FileUpload是Apache组织提供的免费的上传组件。由于Apache Commons…

面向对象的一点小想法

接口里的方法可以写也可以不写 如果写的话&#xff0c;那么得是默认方法&#xff0c;需要在前面加个default 对于默认方法&#xff0c;能够重写&#xff0c;或者直接继承&#xff08;也就是直接用&#xff09; 比如下面&#xff1a; 就直接调用了接口的默认函数nibuhao&#…

R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例)

这个推文也在电脑里待了快一年了&#xff0c;拖延症患者&#xff0c;今天终于把它发出来了。NMDS分析过程已经R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程中写过了。最近又重新看了《Numerical Ecology with R》一书,巩固一下知识&#xff0c;正好重新整理了一下发出…

Nacos源码启动

一、下载源码 为保证速度&#xff0c;国内推荐使用gitee&#xff1a;https://gitee.com/mirrors/Nacos.git 二、导入IDE中 参考之前文章配置国内Maven私服&#xff0c;快速更新工程。 三、启动过程&#xff0c;各种问题 找到启动入口&#xff1a; 先直接启动测试下&#xff…

oscp渗透测试认证该从哪里学起

当我决定要考OSCP时就马上打开浏览器&#xff0c;试图一下弄清楚课程内容和通过考试的方法&#xff0c;我不断的将指南和资源添加到书签中。渐渐的书签里存了许多资料&#xff0c;以至于我不知道从哪里开始学&#xff0c;学习命令吗&#xff1f;我学习编码吗&#xff1f;我使用…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…

valgrind 移植到arm64 平台上总结

valgrind 介绍valgrind是查找内存泄漏的神器&#xff0c;你可以自动的检测许多内存管理和线程的bug&#xff0c;避免花费太多的时间在bug寻找上&#xff0c;使得你的程序更加稳固。 下载地址&#xff1a;https://valgrind.org/downloads/ 本人下载的是valgrind-3.19.0valgrind编…