进程及进程状态

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){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("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){ // parentprintf("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){ // childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{ // parentprintf("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.mzph.cn/news/758125.shtml

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

相关文章

西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)

前言 在学习到这部分时&#xff0c;对 ℓ-rank 以及AUC的关系难以理解透彻&#xff0c;在网上看到其他博主也并未弄明白&#xff0c;大家大多写自己的理解&#xff0c;我希望您在看完这篇文章时能够深刻理解这二者的关系&#xff0c;如果我的理解有误&#xff0c;希望您在评论…

论文翻译 - HotFlip: White-Box Adversarial Examples for Text Classification

论文链接&#xff1a;https://aclanthology.org/P18-2006.pdf 项目代码&#xff1a;https://github.com/AnyiRao/WordAdver HotFlip: White-Box Adversarial Examples for Text Classification Abstract1 Introduction2 Related Work3 HotFlip3.1 Definitions3.2 Derivatives o…

JAVA实战开源项目:无代码动态表单系统(Vue+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.…

21.python——模块引用

一、语法 *import import <模块名> as <别名> *from...import... from <模块名> import <对象、函数...> 用在不同文件中引用函数 from <模块名> import * #引用该模块中所有函数

MySQL面试题之基础夯实

一、mysql当中的基本数据类型有哪些 MySQL中的基本数据类型包括但不限于以下几大类&#xff1a; 数值类型&#xff1a; 整数类型&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INTEGER&#xff09;、BIGINT浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL&#xf…

实现接口自动化测试

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

【NC16589】机器翻译

题目 机器翻译 先进先出 ( F I F O ) (FIFO) (FIFO) 的内存置换算法、队列、哈希表 思路 题目很直观&#xff0c;有一个大小受限的内存&#xff0c;如果内存没装满就装&#xff0c;装满了则将最先装入的那一块换掉&#xff0c;再装新的。 这是一种先进先出 ( F I F O ) (FI…

基于SWAT-MODFLOW地表水与地下水耦合实践技术教程

原文链接&#xff1a;基于SWAT-MODFLOW地表水与地下水耦合实践技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598169&idx3&sn16d726694ca77f9cda3aa95716a18cc1&chksmfa8201becdf588a846bc1d461b8c985536e6191e7288df035e5bef6fc85b933030f…

【二分查找】算法例题

目录 十八、二分查找 114. 搜索插入位置 ① √- 115. 搜索二维矩阵 ② 116. 寻找峰值 ② √- 117. 搜索旋转排序数组 ② 118. 在排序数组中查找元素的第一个和最后一个位置 ② √ 119. 寻找寻钻排序数组中的最小值 ② 120. 寻找两个正序数组的中位数 ③ 136. 直线上最多…

顺序表的动态分配基本操作

#include <stdio.h> #include <stdlib.h>// 顺序表存储空间动态分配 #define InitSize 10 // 顺序表初始长度 typedef int ElemType; // int类型重命名为ElemType&#xff0c;方便后续调整typedef struct { // 定义结构体ElemType *data; // 用静…

Rust Rocket简单入门

简介 Rust中最知名的两个web框架要数Rocket和Actix了&#xff0c;Rocket更注重易用性&#xff0c;Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程&#xff0c;就学一下最简单的 Rocket。 Rocket 是一个用于 Rust 的异步 Web 框架&#xff0c;专注于可用性、安全性…

找工作的经验总结一——渠道与简历

关于简历与面试的经验总结&#xff0c;也可以说是关于找工作的方法论。 这里我们用第一性原理的方法论来分析找工作这件事。 首先&#xff0c;我们的目的是什么&#xff1f; 当然是找工作&#xff0c;不论你是大学刚毕业&#xff0c;还是创业失败&#xff0c;或者是在家闲着…

python网络爬虫实战教学——urllib的使用(1)

文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

113 链接集10--ctrl+左键单击多选

1.ctrl+左键单击多选,单击单选 精简代码 <div class="model-list"><div@mousedown.prevent="handleClick(item, $event)"class="model-list-item"v-for="item in modelList":key="item.id":class="{ model-a…

[leetcode] 45. 跳跃游戏 II

文章目录 题目描述解题方法贪心java代码复杂度分析 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0…

C语言例3-28:位逻辑运算的例子

一、计算机中数值的表示 1. 二进制位与字节 计算机的内存是由许多称为字节的单元组成的。1字节由8个二进制位&#xff08;bit&#xff09;组成。每个二进制位的值为0或1。最右端的一位称为“最低位”&#xff0c;编号为0&#xff1b;最左端的一位称为“最高位”&#xff0c;编…

重装系统后鼠标识别不了咋办

不知道大家在重装系统时,有没有遇到过系统重装完成后,鼠标不能使用的情况。在这种情况下,我们要怎么操作电脑解决这个问题呢?今天就跟大家分享重装系统后鼠标识别不了咋办。 一、主板没有设置兼容usb 在重装系统时,如果主板没有设置兼容usb,就会出现鼠标使用不了的现象。…

模拟计算机和数字计算机

抽象符号只是对现实世界的描述而非模拟&#xff0c;这种描述的还原依赖于人脑对自然世界的物理共识&#xff0c;当你说 “这是山” 这三个简单的字时&#xff0c;听者会还原出一座大山的具象… 人们早在 70 多年前就习惯了以二进制 0 和 1 为基础的数字逻辑&#xff0c;开启了数…

【Docker】-- 如何安装docker

一、安装docker 首先要安装一个yum工具 yum install -y yum-utils 安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 最后&#xff0c;执行命令&#x…

XJLS-84/620静态双位置继电器 DC220V 带柜内板前接线底座 JOSEF约瑟

XJLS-84系列静态双位置继电器 系列型号&#xff1a; XJLS-84/023A静态双位置继电器; XJLS-84/132A静态双位置继电器; XJLS-84/203静态双位置继电器; XJLS-84/222A静态双位置继电器; XJLS-84/312A静态双位置继电器; XJLS-84/502静态双位置继电器; XJLS-84/440静态双位置继电器; …