进程及进程状态

news2025/3/10 5:52:27

1.PCB及task_struct

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
书上称之为 PCB process control block ), Linux 操作系统下的 PCB : task_struct。
task_struct是PCB的一种。
task_struct和PCB之间的关系,打个比方:
就如同王婆和媒婆一样,王婆是媒婆的一种,媒婆是对各种说媒的婆的统称。
在Linux中,描述进程信息的进程控制块,就叫做task_struct.
task_struct  里的内容分类:
标示符 : 描述本进程的唯一标示符,用来区别其他进程。
状态 : 任务状态,退出代码,退出信号等。
优先级 : 相对于其他进程的优先级。
程序计数器 : 程序中即将被执行的下一条指令的地址。
内存指针 : 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据 : 进程执行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ]
I O 状态信息 : 包括显示的 I/O 请求 , 分配给进程的 I O 设备和被进程使用的文件列表。
记账信息 : 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

如何理解进程

进程=对应的代码和数据+对应的task_struct结构 

1.如何查看进程

进程的信息可以通过 /proc 系统文件夹查看 

大多数进程信息同样可以使用top和ps这些用户级工具来获取
TOP命令:

PS命令:

 

PID和PPID可通过系统调用来获取

 

可通过fork来创建子进程

fork的使用:(一般要进行if分流)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 int ret = fork();
 if(ret < 0){
     perror("fork");
     return 1;
 }
 else if(ret == 0){ //child
     printf("I am child : %d!, ret: %d\n", getpid(), ret);
 }else{ //father
     printf("I am father : %d!, ret: %d\n", getpid(), ret);
 }
 sleep(1);
 return 0;
}

2.进程状态

我个人对进程状态的理解:

运行:task_struct 结构体在运行队列中排队

阻塞:等待非CPU资源就绪

挂起:当内存不足的时候,OS通过适当地调整进程的代码和数据到磁盘,此时进程被OS展示转移到磁盘时的状态,就是挂起状态

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)

认识进程状态

 

上面的STAT列就是进程状态,R代表它是运行进程,R后面的+号代表它是前台进程 

观察不难看出来,上面./myproc进程的状态变成了R,没有了+号,此时它是变成了后台进程。

如何理解Z僵尸状态(zombie)

当父进程通过fork来创建子进程后,当子进程退出后,但是还没有被父进程读取,此时子进程就是僵尸进程。

下面通过代码来进程实验:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>

int main()
{
	pid_t id = fork();
	if (id < 0)
	{
		perror("fork");
		return 1;
	}
	else if (id > 0)
	{ // parent
		printf("parent[%d] is sleeping...\n", getpid());
		sleep(30);
	}
	else
	{
		printf("child[%d] is begin Z...\n", getpid());
		sleep(5);
		exit(1);
	}
	return 0;
}

结果为:(通过while :; do ps aux | head -1 && ps aux | grep myproc; sleep 1; echo "###########################" ;done;来查看) 

僵尸进程的危害

  1. 资源占用:虽然僵尸进程本身不占用CPU时间,并且它们所占用的内存是微乎其微的,但是它们会保持进程ID。由于Linux系统对进程数有严格的限制,当僵尸进程数量达到一定数目时,会导致系统中无法再产生新的进程,因为新的进程无法使用已经被僵尸进程占用的进程ID。
  2. 系统性能影响:如果系统中存在大量的僵尸进程,会占用一部分系统资源,这可能会影响到服务器的性能,尤其是在高并发或资源密集型的应用场景中。
  3. 系统稳定性问题:僵尸进程的存在可能引发一些潜在的系统稳定性问题。例如,如果父进程因为某种原因(如崩溃或挂起)未能正确清理其僵尸子进程,这些僵尸进程可能会在系统中长时间存在,对系统稳定性构成威胁。

如何避免僵尸进程的产生

父进程应该通过调用waitwaitpid等函数来等待子进程的结束,并获取其退出状态信息。这样,子进程在退出后,其相关资源可以被系统及时释放,避免形成僵尸进程。同时,对于可能产生大量子进程的应用,也需要注意合理管理子进程的生命周期,避免因为子进程管理不当而导致僵尸进程的产生。 

如何理解孤儿进程

当父进程通过fork来创建子进程后,但是父进程先于子进程退出,此时子进程就是孤儿进程,不过此时该进程会被1号 init 进程所领养。

下面通过代码来进程实验:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>

int main()
{
	pid_t id = fork();
	if (id < 0)
	{
		perror("fork");
		return 1;
	}
	else if (id == 0)
	{ // child
		printf("I am child, pid : %d\n", getpid());
		sleep(10);
	}
	else
	{ // parent
		printf("I am parent, pid: %d\n", getpid());
		sleep(3);
		exit(0);
	}
	return 0;
}

结果为:通过( while :; do ps ajx | head -1 && ps ajx | grep myproc; sleep 1; echo "###########################" ;done;)来查看

通过上图,我们看到子进程(孤儿进程)被1号 Init 进程领养了。

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

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

相关文章

MySQL教程-安装与卸载

MySQL官网 https://www.mysql.com MySQL 官方提供了两种不同的版本&#xff1a; 社区版 MySQL Community Server&#xff0c;免费&#xff0c;但不提供任何技术支持商业版 MySQL Enterprise Server&#xff0c;收费&#xff0c;官方可提供技术支持 本教程采用MySQL的社区版作…

看!Chat4.0如何看待AI与光纤资源管理软件的应用结合点及价值

问&#xff1a;你好&#xff0c;AI在光纤资源管理软件中有那些应用结合点&#xff0c;请详细描述应用结合点及价值? 答&#xff1a;AI在光纤资源管理软件中的应用结合点涉及多个方面&#xff0c;它们通过智能化的手段提高资源管理的效率和准确性。以下是一些关键的应用结合点及…

阿里云服务器centos安装msf教程

msf官方命令行一键安装 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall 稍微等待几分钟即可安装成功&am…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Progress)

进度条组件&#xff0c;用于显示内容加载或操作处理等进度。 说明&#xff1a; 该组件从API version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Progress(options: ProgressOptions<Type>) 创建进度组件&a…

VGG网络的代码实现

VGG网络的程序实现完全根据配置表来实现。 全连接层之前的部分属于特征提取部分&#xff0c;后三部分全连接层用来分类。 1、模型 import torch.nn as nn import torch# official pretrain weights #预训练的权重下载地址 model_urls {vgg11: https://download.pytorch.org/…

使用opencv进行图片分析

opencv学习 一、配置环境并打开编译器 配置opencv在你的任意一个盘里创建一个专属于opencv的文件夹便于学习与整理 打开控制台winr输入cmd&#xff0c;进入后输入conda activate opencv&#xff0c;进入环境以后进入你所设置的opencv文件的盘&#xff0c;我的是D盘&#xff0…

fastreport循环数据表

1.创建数据源 2.将数据源关联到数据区 3.配置控件及属性 拖拽文本控件&#xff0c;设置文本控件的style属性为Data 4.比对效果 比对数据库和报表的数据一致。且循环显示。 数据库数据 报表展示数据

【Qt】从QMainWindow到UI框架

目录 简介UI布局元素Central WidgetMenu BarToolbarsStatus BarDock Widgets 参考文档 简介 如下图所示&#xff0c;我们常见的一些desktop软件&#xff0c;比如VS Code、Smart VCI等&#xff0c;一般都会包含顶部的菜单栏&#xff0c;底部的状态栏&#xff0c;以及一些其他UI…

工业制造领域系统:SCADA、PLC、DCS、MES、HMI、ERP等,一文秒懂

工业制造控制系统在工业制造领域起到了关键的作用&#xff0c;帮助企业提高生产效率、降低成本、提高产品质量和安全性。不同的企业根据自身需求和规模&#xff0c;可能会选择使用其中的一种或多种系统。 SCADA系统&#xff08;Supervisory Control and Data Acquisition&…

第2章 信息技术基础

本章学习要点 全面了解医院信息系统建设所涉及的主要信息技术以及这些技术的应用情况。 计算机与网络、信息技术与信息系统、数字媒体与数据存储技术、条形码(二维码)、RFID技术、云计算、APP技术 1.XML 可扩展标记语言与Access&#xff0c;Oracle和SQL Server等数据库不同…

什么软件可以剪辑录音?录音剪辑推荐3款工具

随着数字技术的发展&#xff0c;录音已经成为我们日常生活和工作中不可或缺的一部分。无论是会议记录、课堂笔记&#xff0c;还是音乐创作、语音聊天&#xff0c;我们都需要用到录音功能。然而&#xff0c;单纯的录音往往不能满足我们的需求&#xff0c;我们还需要对录音进行剪…

常用芯片学习——TP4057电源管理芯片

TP40578 500mA线性锂离子电池充电器 芯片介绍 TP4057是一款性能优异的单节锂离子电池恒流/恒压线性充电器。TP4057采用S0T23-6封装配合较少的外围原件使其非常适用于便携式产品&#xff0c;并且适合给USB电源以及适配器电源供电。 基于特殊的内部MOSFET架构以及防倒充电路&a…

图像处理与视觉感知---期末复习重点(3)

文章目录 一、空间域和频率域二、傅里叶变换三、频率域图像增强 一、空间域和频率域 1. 空间域&#xff1a;即所说的像素域&#xff0c;在空间域的处理就是在像素级的处理&#xff0c;如在像素级的图像叠加。通过傅立叶变换后&#xff0c;得到的是图像的频谱&#xff0c;表示图…

BMP280学习

1.Forced mode模式&#xff0c;单次采集后进入休眠&#xff0c;适用于低采样率。 2.normal mode模式&#xff0c;持续采集&#xff0c;我们使用这种 采集事件基本都是ms级&#xff0c;所以我们1s更新一次。 温度和压力的计算 #include <SPI.h> //定义数据类型 #define s3…

就业班 2401--3.12 Linux Day16 PXE布置——自动化装系统

什么是PXE&#xff1f; PXE&#xff0c;全名Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff1b;通过网络接口启动计算机&#xff0c;不依赖本地存储设备&#xff08;如硬盘&#xff09;或本地已安装的操作系统&#xff1b;由Intel和Systemsoft公司于1999年…

2024/03/15(网络编程·day3)

一、思维导图 二、模拟面试题 什么是IP地址&#xff1f; IP地址是主机在网络中的唯一标识。 分为IPv4和IPv6&#xff0c; IPv4由4字节32位二进制数组成&#xff0c;通常使用点分十进制表示&#xff0c;例如192.168.117.85 &#xff0c;其中每个十进制数的范围都在0-255. IPv6由…

技术资讯:Volar正式更名为Vue-Official

大家好&#xff0c;我是大澈&#xff01; 本文约700字&#xff0c;整篇阅读大约需要1分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包“…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试总结是安全生产模拟考试一点通总题库中生成的一套广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;模拟试题&#xff0c;…

ArrayBlockingQueue与LinkedBlockingQueue底层原理

ArrayBlockingQueue与LinkedBlockingQueue底层原理 在线程池中&#xff0c;等待队列采用ArrayBlockingQueue或者LinkedBlockingDeque&#xff0c;那他们是怎么实现存放线程、阻塞、取出的呢&#xff1f; 一、ArrayBlockingQueue底层原理 1.1 简介 ArrayBlockingQueue是一个阻塞…

[嵌入式AI从0开始到入土]16_ffmpeg_ascend编译安装及性能测试

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…