Linux->父子进程初识和进程状态

news2025/7/27 21:09:17

目录

前言:

1. 父子进程创建

2. 进程状态

 R(running)状态:

S(sleep)状态:

D(disk sleep)状态:

T(stopped)状态:

X(dead)和Z(zombie)状态:

孤儿进程:   


前言:

        本篇主要讲解关于关于父子进程的生成,以及利用fork生成子进程返回两个不同的返回值的概念,以及不同进程在不同反应下的状态的演示。

1. 父子进程创建

        操作系统会为我们提供一些系统接口服务于我们的程序,而今天我们又会看到一个新的函数接口用于使用,那就是fork()

        这个函数的在#include<unistd.h>这个头文件当中,该函数的返回值为pid_t,也是这个头文件会为我们提供的新的类型。这个函数的作用就是会在当前进程下创建一个子进程,下面请看一个简单的程序来学习父子进程。

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 
  5 int main()
  6 {
  7   pid_t ret = fork();
  8   while(1)
  9   {
 10 
 11     if(ret == 0)
 12     {
 13       printf("我是子进程,我的PID是%d,我的PPID是%d,ret = %5d,&ret = %p。\n" 
 14               ,getpid(),getppid(), ret,&ret);
 15       sleep(1);
 16     }
 17     else
 18     {
 19       printf("我是父进程,我的PID是%d,我的PPID是%d,ret = %5d,&ret = %p。\n" 20           ,getpid(),getppid(),ret,&ret);                                                                 
 21       sleep(1);
 22     }
 23     //while(1)
 24     //{
 25     //  printf("hello world\n");
 26     //  sleep(1);
 27     //}
 28   }
 29 
 30   return 0;

        首先咱们可以看到我们通过fork()生成了一个子进程,由ret来接收它的返回值,但是大伙可能不知道ret其实接收的不只是子进程的返回值,还有当前进程的返回值,请看下图。

         可以看到父子进程的ret变量的地址是一模一样的,但是有没有发现这个地址却对应了两个值?子进程的返回值是0,而父进程是一个非0的值。

        这很明显不符合我们学习这么长时间代码的规律——一个地址只能存取一个数据。那么这里是系统出BUG了吗?很显然不是的,要是这是一个BUG我也不会为大家讲解了。

        那么会出现这个问题的原因其实简单来说就是,我们在程序中获取到的地址,并不是数据存储的真实位置,这是一个伪地址,操作系统会偷偷的给ret找两个存储空间,这一过程被称为写时拷贝,我会在下一篇“进程地址空间”中详细讲解,下面请先看图。

        首先我们得知道进程是有独立性的,而进程又是由于内核相关的数据结构 + 代码和数据所构成,那么我们也得保证代码、数据和数据结构也的是独立得才行,所以在同一块地址需要存储两个数据时就不能放在同一块空间,从而出现写时拷贝。       

         从程序运行图当中,我们还能看到两个东西PID(Process ID)和PPID(Parent Process ID),也就是当前进程的ID和它的父进程ID。通过函数getpid()和getppid()可以得到。

        进程ID也就相当于我们得身份证,标明这个进程存在,可以通过这个ID找到它,同时也可以通过这个ID对它进行修改等操作。

2. 进程状态

        我们为了弄明白正在运行得进程时什么意思,我们需要知道进程得不同状态。一个进程可以有几个状态。请先看状态在kernel源码中的定义:

/*
* The task state array is a strange "bitmap" ofreasons 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)状态:

        R——运行状态,我问大家一个问题,当我们的电脑中有多个软件都被运行着,那么这些软件是否在每一时刻都被CPU运行着呢?

        答案是不是,还记得我们的PCB吗,CPU基于PCB去管理这些进程,而管理方式为将这些PCB结构体用特定的数据结构组织起来,例如链表方式,所以CPU在运行这些进程的时候会拿到这些进程的PCB,从而执行程序,那么此时咱们就可以联想到,CPU运行进程其实是拿到PCB,运行一会,中断,拿到下一个PCB在运行,再中断,周而复始,那么运行状态的出现其实是这个进程要么在运行,要么处于运行队列当中。

        虽然这样说,但是我们是没有实际感受的,因为我们平时用电脑也没有看到一个程序一会关掉,一会又开始的情况,对此我只能说,CPU的运行速度确实厉害。

        不过大家却遇到过另一个问题,那就是电脑卡死的现象,这一现象与我们下一个状态S有关。

S(sleep)状态:

        在理解S状态之前我们需要先明白阻塞的概念,阻塞顾名思义,也就是当前进程没有继续推进,在等待某种资源获取成功

        那么某种资源是什么呢?举一个简单的例子大家就会懂了:

        我们在网上下载游戏或者影视资源时需不需要联网?肯定是需要的,但是在下载的时候,我们将网线给他拔了,又或者是把WIFI给砸了,那么这个时候电脑处于没有网络的状态,他还能继续下载吗?当然是不能的,毕竟没有网嘛,那么此时我们的进程就在等待着网络资源,CPU就不会将他放在运行队列当中,而给它挂上S状态,让它自己去等。

         我们运行的进程当中STAT下的S+就是睡眠状态,也可以叫做阻塞状态。不过大家可能有些奇怪,我不是将程序运行起来了吗?网好好的,也没个键盘输入啥的,为什么不是R状态而是S状态呢?有这个疑问的朋友可能忘记了一件事情,那就是将数据打印到显示器上有没有等待显示器准备完毕的资源信息呢?一定是有的咯,所以我们基本看不出来有程序处于R状态,一般都是在S状态。

D(disk sleep)状态:

        D状态是S状态的另外一种表现形式,我们也称为不可中断睡眠状态,挂起。这个概念不好理解,我还是以讲故事的形式为大家解释。

        我们有CPU,内存,磁盘三个人,某一天磁盘中有程序要运行,然后操作系统就将程序加载到内存当中,然后呢,这个程序要下载100个G的数据进磁盘当中,操作系统说:“好,你下载吧”,然后程序就呆在内存当中挂一个S状态等着。此时,电脑开了很多进程,CPU忙的不可开交,这个时候他就看到了内存里有个程序啥都不干,就在那里呆着。CPU气不过,说:“我都快要忙死了,你还在这里干扰我?去死吧你。”然后这个进程就被CPU杀死了。

        这个时候,磁盘内容已经下好了,却发现找不到人来拿了,这就把磁盘急坏了,他又不敢删,但是又不知道应该把这个数据交给谁,问题就出现了。

         上面的故事谁错了呢?其实它们都没有错,错的是这个世界。哈哈,开个玩笑,它们确实都没有做错,操作系统可以杀掉进程,这是它的权力,进程在等待资源,也是它的权力,而磁盘人家一直在辛辛苦苦的下载,有什么错?

        其实,上面的过程究其原因不就是操作系统把进程给杀掉了,导致磁盘找不到人了吗?所以我们让进程不能被杀掉不就可以了?所以这个时候D状态就出现了。

        操作系统看到进程是D状态,它就先获取这个进程的PCB,然后把这个进程退出内存,回到磁盘当中,当磁盘资源下载完毕,又将这个进程重新加载进入内存当中执行。

T(stopped)状态:

         该状态表示当前停止当前的进程,直到收到继续执行的指令才会再次运行。

        下面我以例子在执行:

        初始运行状态

         输入指令kill -19 27911,暂停父进程。运行状态,只有子进程还在执行。

        此时的父进程状态也由S+变为了T。 

         注意,这里的子进程也由S+变为了S,这里的+表示前台运行,可以直接ctrl+c终止,但是没有+表示后台运行,需要kill杀掉进程才能终止。

X(dead)和Z(zombie)状态:

        X状态是在一个进程结束之后显示的状态,这只是一个返回状态,我们不能在人物列表里面看到这个状态。

        而Z状态表示当父进程和子进程都运行着,然后子进程被干掉了,此时子进程的资源还没有被系统回收,这个时候就会处于僵尸状态等待父进程去回收它。如下:

孤儿进程:   

        孤儿进程与僵尸状态正好相反,它是父子进程都在运行时,父进程被干掉了,此时的子进程会被init初始进程也就是1号进程收养,用于子进程结束后回收资源。如下:

         看到此时的子进程的父进程变化称为了1。


        以上就是我对本篇的全部理解,谢谢大伙查看。

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

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

相关文章

Python学习-----模块4.0(json字符串与json模块)

目录 1.json简介&#xff1a; 2.json对象 3.json模块 &#xff08;1&#xff09;json.dumps() 函数 &#xff08;2&#xff09;json.dumps() 函数 &#xff08;3&#xff09;json.loads() 函数 (4) json.load() 函数 4.总结&#xff1a; 1.json简介&#xff1a; SON(…

Mybatis之一级缓存二级缓存

介绍 缓存&#xff0c;就是将经常访问的数据&#xff0c;放到内存中&#xff0c;减少对数据库的访问&#xff0c;提高查询速度。Mybatis中也有缓存的概念&#xff0c;分为一级缓存和二级缓存。 一级缓存 一级缓存是Mybatis中SqlSession对象的缓存。当我们执行查询以后&#x…

C语言-结构体对齐

详细说明参考博客 (1条消息) C语言结构体对齐&#xff0c;超详细&#xff0c;超易懂_haozigegie的博客-CSDN博客 (1条消息) #pragma pack详解_OuJiang2021的博客-CSDN博客_#pragma pack 以下个人理解总结 出现结构体对齐考虑的根本原因就是&#xff1a;【数据存取执行效率】…

玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10

也许每一个男子全都有过这样的两个女人&#xff0c;至少两个。娶了红玫瑰&#xff0c;久而久之&#xff0c;红的变了墙上的一抹蚊子血&#xff0c;白的还是床前明月光&#xff1b;娶了白玫瑰&#xff0c;白的便是衣服上沾的一粒饭黏子&#xff0c;红的却是心口上一颗朱砂痣。–…

网络原理 2

文章目录1. 网络层2. 数据链路层3. DNS前言 : 上文已经 将 网络层 和 传输层 说完了&#xff0c; 下面我们来学习以下 网络层 和 数据链路层 里 相关的知识 &#xff0c; 关于 网络层 和 数据链路层 的知识 简单了解一下即可 . 1. 网络层 网络层 主要 做两件事 : 1.地址管理…

如何优雅的用golang封装配置项(Functional Options)

导读 最近要封装一个公共服务&#xff0c;涉及到配置项的地方总是找不到合理的方案&#xff0c;后来看了一下grpc在配置方面的封装&#xff0c;了解到原来是golang特有的Functional Options编程模式&#xff0c;今天分享给大家&#xff0c;希望你能用到&#xff0c;咱们直接来看…

Linux 文件权限之umask

目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容&#xff0c;涉及到的内容有&#xff1a;文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类&#xff1a;文件所有者、文件…

忆享聚焦|人工智能、元宇宙、云计算、5G基站…近期热点资讯一览

“忆享聚焦”栏目第十二期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1.ChatGPT火爆全球 …

值传递和引用传递

什么叫 值传递&引用传递值传递&#xff1a;值传递是指在调用函数时将实际参数复制一份传递到函数中&#xff0c;这样在函数中如果对参数进行修改&#xff0c;将不会影响到实际参数。引用传递&#xff1a;引用传递是指在调用函数时将实际参数的地址传递到函数中&#xff0c;…

2023不伤人脉的全新商城分销,一劳永逸的消费分红

2023不伤人脉的全新商城分销&#xff0c;一劳永逸的消费分红 2023-02-24 11:52梦龙 2023不伤人脉的全新商城分销&#xff0c;一劳永逸的消费分红 如今是流量为王的时代&#xff0c;但是如何将流量转化为忠实客户是个难题。不再是单向的买卖关系&#xff0c;而是从对产品的关注…

CSS 盒子模型【快速掌握知识点】

目录 一、什么是盒子模型 二、边框border-color 三、边框粗细border-width 四、边框样式border-style 五、外边距margin 六、内边距padding 七、圆角边框 八、圆形 九、盒子阴影 一、什么是盒子模型 css盒子模型又称为框模型&#xff0c;盒子的最内部是元素的实际内容…

国家调控油价预测案例+源码

项目git地址&#xff1a;https://github.com/Boris-2021/Oil-price-control-forecast 使用已知的历史数据&#xff1a;日期、汇率、布伦特、WTI、阿曼原油价格&#xff0c;预测下一个调价周期中的汽油、柴油零售限价的调价价格。 一. 需求 1.1 需求说明 使用已知的历史数据&a…

Linux:makefile小结

1.初学者要掌握的基本知识 一条规则&#xff1a; 两个函数 三个变量 2.自己写的makefile&#xff0c;说明每条命令的作用: #指定源文件为*.c src $(wildcard *.c) #通过src生成中间需要的汇编文件名&#xff0c;把src中.c替换为.o obj $(patsubst %.c, %.o, $(src)) #…

编译原理【文法设计】—每个a后面至少一个b、ab个数相等,ab个数不相等的所有串

编译原理【文法设计】—设计每个a后面至少一个b、ab个数相等&#xff0c;ab个数不相等的文法为字母表Σ{a,b}Σ\{a,b\}Σ{a,b}上的下列每个语言设计一个文法 (a) 每个a后面至少有一个b的所有串 首先&#xff0c;每个a后面至少有一个b的正规式怎么写呢&#xff1f;每个a都需要…

华为OD机试题,用 Java 解【快递运输】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

16、变量、流程控制与游标

文章目录1 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量2 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决3 流程控制3.1 分支结构之 IF3…

MSTP的负载均衡实验

MSTP的负载均衡实验 拓扑图 配置思路 网路互联&#xff0c;交换机和网线配置网络设备 交换机 1. 初始化配置 2. 创建vlan 3. 交换机连接PC 设置模式为access&#xff0c; 并将端口加入对应vlan 交换机连接交换机端口 设置模式为trunk 并允许所有vlan通过 交换机连接路由器端口…

C/C++每日一练(20230224)

目录 1. 字符串排序 2. Excel表列名称 3. 颠倒二进制位 附录&#xff1a; 位移运算符 左移运算符<< 1.无符号 2.有符号 右移运算符>> 1.无符号 2.有符号 程序测试 1. 字符串排序 编写程序&#xff0c;输入若干个字符串。 要求: &#xff08;1&#x…

C++学习笔记-类和对象

##类与对象的思想 面向对象的特点&#xff1a;封装、继承、多态 面向对象编程的特点&#xff1a; &#xff08;1&#xff09;易维护&#xff1a;可读性高&#xff0c;即使改变了需求&#xff0c;由于继承的存在&#xff0c;只需要对局部模块进行修改&#xff0c;维护起来非常方…

华为OD机试题,用 Java 解【高矮个子排队】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…