Linux:虚拟地址空间,程序和进程,创建并回收子进程,孤儿进程和僵尸进程。为什么要回收子进程?

2023-05-16

目录

一:虚拟地址空间

二:程序和进程

三:子进程

3.1:fork创建子进程

3.2:回收子进程

(1)调用wait函数回收子进程

(2)调用waitpid函数回收子进程

3.4:孤儿进程和僵尸进程

(1)孤儿进程:

(2)僵尸进程:


一:虚拟地址空间

什么是虚拟地址空间呢?我们在编写C代码时,总是会提到地址的相关概念,那么这里地址,说的就是这个虚拟地址空间了。每一个程序在运行起来后,都会占用系统资源去开辟一块虚拟地址空间。(每一个·进程都有一块独有的虚拟地址空间)

虚拟地址空间一般被分成两块,用户区和内核区:

1:用户区

我们的代码段,全局变量,等。在程序执行起来时,都会被加载到用户区。当然用户区的0到4K的地址区域我们也使用不了,这一段被称为被保护的区域。

2:内核区

内核区中有一个比较重要的进程管理模块,这里存储着标识进程身份的进程id编号。(与人的身份证号类似)

二:程序和进程

程序:程序就是我们写好相关代码后,经编译器生成的二进制文件,存储在磁盘上,占用磁盘的空间。是一个静态的概念。

进程:进程就是一个已经启动的程序,占用系统资源(cpu ,终端等)。是一个动态的概念

有一个很恰当的比喻来形容程序和进程,程序就是剧本,是一张纸(一个静态的概念)。那么进程就是一出戏,根据剧本演出的戏。那么演戏就需要资源,舞台,演出的人之类。

对于一出戏来说,可以在多个舞台同时上演,同样的,同一个程序也可以被加载为不同的进程,彼此之间互不影响。

每启动一个程序都会有一个进程pid,即使是相同的程序被多次启动,也会有不同的pid。

三:子进程

3.1:fork创建子进程

函数原型  pid_t fork(void);(pid_t就是一种整形值)

 我们调用fork函数创建子进程后,他会将原有的父进程的虚拟地址空间的信息深拷贝一份给到子进程,此时用户区的信息是完全相同的(代码段也完全相同),只不过内核区中有一些信息不相同。(进程的id号就不相同

对于fork函数来说,现在也出现了两份,一份在父进程中,它的返回值就是子进程的进程id号,另一份在子进程中,它的返回值为0,如果创建子进程失败,就会返回-1。

3.2:回收子进程

(1)调用wait函数回收子进程

 pid_t wait(int *status);

参数:会返回子进程的退出状态,是正常退出还是被信号杀死了。当然如果不关心子进程的退出状态可以之间传NULL.

返回值:大于0,那么这个值就是被回收的子进程的id号,如果子进程全部被回收完成,会返回-1. 

(2)调用waitpid函数回收子进程

 pid_t waitpid(pid_t pid, int *status, int options);

参数:

pid:可以传入指定进程的pid,那么就是回收指定的进程。也可以传入-1 ,代表等待任意一个子进程。

int *status:与wait函数的参数作用相同

int options:传入0,那么代表该函数是一个阻塞状态,传入WNOHANG代表该函数非阻塞状态。

   //创建子进程
 18   pid_t  pid = fork();
 19   if(pid < 0)//创建子进程失败
 20   {
 21     perror("fork error");
 22     return -1;
 23   }
 24   else if(pid == 0)//子进程
 25   {
 26     printf("子进程干什么\n");
 27   }
 28   else //父进程 回收子进程
 29   {
 30     wait(NULL);
 31     //waitpid(-1,NULL,0);i
 32   }
 33

为什么要回收子进程呢,其实对于任何一个进程来说,它被执行起来,都会由系统给他分配一块虚拟地址空间,但是在该进程退出时,它只能释放自己用户区的资源。那么会使得每启动一个进程就会损失一个G的虚拟地址空间资源,那么这样下去系统资源总会被占满的。(而对于内核区的资源,必须由它的父进程来进行回收。

3.4:孤儿进程和僵尸进程

(1)孤儿进程:

所谓的孤儿进程,就是对与该子进程来说,它的父进程比他先执行完并退出了,它还没有执行完,这样的子进程就被称为孤儿进程了。但是在子进程的父进程退出后,系统会自动将该孤儿进程给init进程(1号进程)领养,最后会由init进程来回收该进程的内核区资源。

(2)僵尸进程:

子进程先执行完并退出,但是它的父进程还没有退出,并且在它的父进程中也没有调用相应的进程回收函数对该子进程的内核区资源进行回收,那么此时这个已经死掉的子进程就被称为僵尸进程。要想杀死僵尸进行,只能先杀死它的父进程,让该僵尸进程被init进程领养后,再对该僵尸进程的内核区资源进行回收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux:虚拟地址空间,程序和进程,创建并回收子进程,孤儿进程和僵尸进程。为什么要回收子进程? 的相关文章

  • tomcat 详情介绍与部署

    1 xff0c 部署tomcat 安装JDK JDK下载面页 xff1a http www oracle com technetwork java javase downloads index html 下载jdk1 8到服务器 安装jdk
  • Redis 部署及介绍

    1 安装单机版redis root 64 redis master mkdir p data application 创建工作目录 root 64 redis master wget http download redis io relea
  • shenyu中logback替换成log4j2

    一 背景 shenyu框架默认使用的是logback处理日志 xff0c 压测发现写入日志存在瓶颈 基于log4j2优秀的性能 xff0c 使用log4j2替换logback 二 如何替换logback 1 删除logback的依赖项 sp
  • 图片项目部署

    1 xff0c 准备 mysql 主从 43 读写分离 3台 nginx 43 uwsgi 43 python3 6 1台 redis 哨兵 3台 A nginx uwsgi python3 上传代码包 xff0c 调试 B mysql r
  • Git 构建分布式版本控制系统详解

    安装git要4G以上内存 安装和配置必要的依赖关系 root 64 localhost yum install curl policycoreutils openssh server openssh clients 安装邮件程序 root
  • jenkins 详细部署

    部署jenkins需要以下的步骤 环境需要4G内存 1 xff0c 部署git 安装依赖环境 root 64 localhos yum install curl devel expat devel gettext devel openssl
  • RabbitMQ消息队列的部署

    RabbitMQ消息队列的用处 对于一个大型的软件系统来说 xff0c 它会有很多的组件或者说模块或者说子系统 xff08 subsystem or Component or submodule xff09 那么这些模块的如何通信 xff1
  • Docker 基础使用命令

    Docker下载 配置阿里云Docker Yum源 root 64 xingdian yum install y yum utils device mapper persistent data lvm2 git root 64 xingdi
  • docker部署mysql AB复制-详细步骤

    docker部署mysql AB复制 详细步骤 1 安装docker 参考链接 xff1a https blog csdn net qq 50263172 article details 109640641 spm 61 1001 2014
  • mysql 查询特定时间内的操作数量

    查询某几个月中每天的操作量 命令格式 Select DATE FORMAT 字段 39 Y m d 39 AS 34 时间 34 COUNT 1 AS 34 数量 34 FROM 表名 WHERE 字段 gt 39 2021 01 01 0
  • zabbix 邮箱,钉钉报警详解

    1 zabbix部署环境说明 zabbix监控服务器 xff1a mastsc zabbix被监控服务器 xff1a slave 两台机器关闭 34 selinux 34 xff1a setenforce 0 两台机器关闭防火墙 xff1a
  • Centos7离线安装redis

    Centos7离线安装redis 参考文档 xff1a https www cnblogs com yy3b2007com p 10513752 html 1 下载redis安装包 在 opt redis 如没有这个目录需要手动建立 roo
  • zabbix监控使用ping来判断主机是否存活,向邮箱发送邮件报警

    1 安装zabbix监控服务 server 和被监控服务器 slave 安装zabbix参考文档 https blog csdn net qq 50263172 article details 115519613 spm 61 1001 2
  • Feign调用错误no suitable HttpMessageConverter found for response type

    Feign接口 span class token annotation punctuation 64 PostMapping span span class token punctuation span value span class t
  • ubuntu WPS字体缺失 解决方法

    前言 请保证您还有一台windows 文章目录 前言一 在windows复制字体二 复制到ubuntu三 重启WPS总结 一 在windows复制字体 首先在windows下载好WPS xff0c 然后找到字体 xff0c 复制 二 复制到
  • 将IMG等镜像文件转换VMware虚拟机

    先下载好qemu这个转换软件 然后这个软件是用鼠标点不开的 xff0c 先到软件的文件路径然后在路径栏打cmd 或者另一种打开方法 xff0c 在文件所在位置 xff0c 按shift 43 鼠标右键 我这里用第一种 xff0c 接下来两条
  • VNC访问阿里云服务器

    最近阿里云年终特惠 xff0c 新用户服务器只要38一年 xff0c 爱住了呀 xff01 xff01 xff01 果断下单 xff01 买它个一年 xff01 接下来介绍如何通过vnc访问阿里云服务器 一 先要对端口进行开放 在服务器的防
  • ISCSI的部署与安装

    iSCSI xff08 Internet Small Computer System Interface xff0c Internet小型计算机系统接口 xff09 是一种由IBM公司研究开发的IP SAN技术 该技术是将现有SCSI接口与
  • JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

    一 前言 xff08 比较规则 xff09 JS中的相等操作符由 61 61 表示 xff0c 如果两个操作数相等 xff0c 则返回true 原理 xff1a 相等操作符会先转换操作数 xff08 通常称为强制转型 xff09 xff0c
  • 计算机网络——IP地址与划分子网

    IP地址 1 IP地址表示 对主机和路由器来说 xff0c IP地址用32位二进制代码表示 xff0c 每八位分为一段 xff0c 每段间用空格隔开 xff0c 例如 xff1a 10000000 00001011 00000011 000

随机推荐