Linux 进程的地址空间

一、进程

进程:是一个正在运行的程序

PCB : 即是进程控制块,是进程存在的唯一标志。用来描述进程的属性信息,如进程的pid。

在这里插入图片描述
每一个进程都是通过fork复制而来的。

在执行fork之后,先将PCB复制一份给子进程,复制之前先申请一个pid,将复制给子进程的PCB中的pid修改为申请成功的pid;然后把当前的进程复制一份给子进程。父子进程并发运行。

二、进程的地址空间

以32位为例:

在32位的计算机系统中进程的地址空间是4G,如下图所示:

在这里插入图片描述

通常定义一个空指针时int *p = NULL;,这个指针p指向的空就是指向的上图中的0x0000 0000

地址空间除了内核使用的1G,剩下的3G实际上能用的内存空间是小于3G的。

虽然一个进程的地址空间为4G,但是实际上在执行一个程序的时候并不会把4G的内存空间用完,其中代码段和数据段使用几个页面就足够了,而一个页面的内存是4K,所以执行一个程序实际上用到的内存比4G小很多,所以并不是16G的计算机只能运行4个进程。这个4G是规定一个进程最大占用4G的内存空间,也就是一个进程理论上拥有4G地址空间的权限,一般情况下不会用完。

在地址空间中,代码段是从0x0804 8000开始,是一个固定值:

在这里插入图片描述

内核和用户使用空间的分界线的上限为0xc000 0000,下限为0xbfff ffff

在这里插入图片描述

1.定义在栈上的变量

由于栈是从上往下增长,所以在栈上定义的局部变量的地址就离0xbfff ffff非常接近。在栈上定义的变量每次运行的地址是不一样的,每次运行程序栈在分配的时候故意让局部变量的地址不一样,以确保程序的安全性。

2.在堆上申请动态内存

(1)malloc申请的内存空间当程序结束后会被系统自动回收

在Linux中,用malloc申请一块1G的内存空间,不用free释放也可以,不会发生内存泄漏,因为进程终止之后,所申请的内存空间就会被回收,但是当进程运行的时间长时,也是需要用free来释放的。在C语言中,malloc分配一段内存空间之后必须用free释放掉这块内存空间,不然会发生内存泄露。但是,我们一般在使用malloc之后是需要通过free释放空间的。

(2)malloc能申请多大的内存空间

32位系统内存空间的理论值小于3G,参考地址空间,如上图。

①当物理内存剩余的内存空间大于要申请的内存空间的时候是可以申请成功的。

比如现在物理内存剩余的内存空间为1.8G,要用malloc申请1G的内存空间是可以申请成功的。

②当前物理内存剩余的空间加虚拟内存剩余的空间能否满足申请要求。

当malloc申请内存2G内存空间,当物理内存剩余的空间加虚拟内存剩余的空间大于2G,就可以申请成功。如果分配在虚拟内存的空间不去使用,那么它就一直在虚拟内存,不会被调用回物理内存。如果物理内存的剩余空间加上虚拟内存的剩余空间不能满足申请内存空间的要求,那就申请失败,这里的满足还要考虑自身的特性,自身最多只能申请接近3G。如果没有虚拟内容就会申请失败。

③当前物理内存剩余的空间加虚拟内存剩余的空间比所申请的空间大,但是申请失败。

当malloc申请3G的内存空间,虽然物理内存和虚拟内存加起来超过了3G,但是不会申请成功,因为用户可以使用的内存空间为3G,除去代码段、数据段之后留给堆区的内存空间是不够3G的。用户最多只能申请接近3G

④malloc 与 fork,父进程堆区申请的空间复制后,子进程也会有一份,也需要释放吗?

父子进程对申请的堆空间都没有操作,代码如下:

在这里插入图片描述

父进程在堆区申请了5个字节大小为int型的内存,通过fork复制之后,产生一个子进程,并在父进程和子进程结束前都执行了free。

编译以上代码,并运行,编译运行并没有出错:

在这里插入图片描述

所以,我们可以知道,父进程在堆区申请的内存空间复制一份给子进程之后,子进程并不共享父进程的内存空间,父子进程在堆区都会有一份内存空间。因为如果这段内存空间是共享的,那么父进程对这段内存空间free一次,子进程再对这段内存空间free一次,对同一个内存空间free两次,编译运行会出现错误。而此时编译运行并没有出错,所以父子进程堆空间不共享(这里指的是每个进程的堆空间),哪怕父子进程对申请的堆空间都没有操作。

现在父子进程对申请的堆空间进行操作,代码如下:

在这里插入图片描述
上述代码,让子进程中的arr[0]等于10,让父进程中的arr[1]等于100。

编译并运行以上代码,结果如下:

在这里插入图片描述

结果分析:输出的结果中,第一行是父进程输出的结果,第二行是子进程输出的结果,可以看出父子进程对堆空间里的值进行修改,父进程对堆空间的值进行修改并没有导致对应子进程堆空间的值被修改,子进程对堆空间的值进行修改也没有导致对应父进程堆空间的值被修改。更加可以说明,父子进程是不共享堆上的内存空间的。子进程也需要释放从父进程复制过来的堆上的内存空间。

malloc申请的空间是对每个进程的物理地址而言的,只有当用到申请的空间,才会映射到底层真时物理地址。

【注意】

同一个程序在每次运行的时候,代码的逻辑地址不会变,物理地址会变,但是物理地址我们看不到,我们能看到的打印出来的地址都是逻辑地址。

如果一个函数没有被主函数调用也会给该函数分配内存空间。

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

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

相关文章

美国大模型风向速报(一)为何重视提示工程?LangChain+向量数据库+开源大模型真香...

多家,且独家来自美国的信源同时向“亲爱的数据”表示, 提示工程(Prompt Engineering)在美国大模型领域备受重视。 读者都要聊, 那就干活。 (一)开源真香 现阶段,AI开源极客大展身手&…

CloudQuery实战 | 谁说没有一款一体化数据库操作管控云平台了?

文章目录 CloudQuery询盾的地址CloudQuery主页统一入口数据库归纳SQL编辑器权限管控审计中心数据保护数据变更 CloudQuery文档中心了解CloudQuery快速入门安装步骤社区版v2.1.0操作手册1数据查询更新日志 CloudQuery社区和活动 CloudQuery线上实战线上实战主页面展示及数据操作…

java实现人物关系抽取

java实现人物关系抽取 人物关系抽取是实体关系抽取的一种情况。实际上是两个过程:命名实体识别和关系抽取。 Java人物关系抽取是指从文本中提取出与Java相关的人物之间的关系。这个过程可以通过自然语言处理和文本分析的方法来实现。具体的步骤包括: 文本…

非常详细的 Ceph 介绍、原理、架构

1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过…

(7)(7.6) 恢复任务回放

文章目录 前言 7.6.1 配置 7.6.2 工作原理 7.6.3 局限性 前言 本页介绍了什么是"任务继续时后退"功能以及如何使用该功能。 !Note 从 4.1 版起,Plane、Copter 和 Rover 均可使用此功能。 在某些应用或运行区域,为了消除冲突&…

okhttp源码简单流程分析

拦截器详细解析可以看大佬简书 "https://www.jianshu.com/p/6fac73f7570f"和 “https://www.jianshu.com/p/3c740829475c” okhttp请求流程 1:OkHttpClient okHttpClient new OkHttpClient.Builder() 构建一个okhttpClient对象,传入你想传入的…

2023国赛数学建模D题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

【IEEE会议】第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023)

第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023) 随着大数据时代的到来,对数据获取的随时性和对计算的需求也在逐渐增长。为推动大数据时代的云计算与软件工程的发展,促进该领域学术交流,在CBASE 2022成功举办的…

人工智能在网络安全中的应用: 分析人工智能、机器学习和深度学习等技术在预测、检测和应对网络攻击中的作用

第一章:引言 随着信息技术的迅猛发展,网络安全已成为当今社会不容忽视的重要议题。网络攻击手法日益复杂,传统的防御方法已经不再足够。在这一背景下,人工智能(AI)技术正逐渐崭露头角,为网络安…

循环神经网络RNN完全解析:从基础理论到PyTorch实战

目录 一、循环神经网络全解1.1 什么是循环神经网络网络结构工作原理数学模型RNN的优缺点总结 1.2 循环神经网络的工作原理RNN的时间展开数学表述信息流动实现示例梯度问题:梯度消失和爆炸总结 1.3 循环神经网络的应用场景文本分析与生成1.3.1 自然语言处理1.3.2 机器…

unity打造路径编辑与导航系统

Unity是一款非常流行的游戏引擎,它提供了丰富的工具和API,方便开发者快速创建游戏。其中,路径编辑与导航系统是游戏开发中非常重要的一部分,可以帮助玩家更好地探索游戏世界,提升游戏体验。本文将详细介绍如何在Unity中…

C#与西门子PLC1500的ModbusTcp服务器通信2--ModbusTcp协议

Modbus TCP是近年来越来越流行的工业控制系统通信协议之一,与其他通信协议相比,Modbus TCP通信速度快、可靠性高、兼容性强、适用于模拟或数字量信号的传输,阅读本文前你必须比较熟悉Modbus协议,了解tcp网络。 一、什么是Modbus …

自动驾驶合成数据科普一:不做真实数据的“颠覆者”,做“杠杆”

前言: 在7月底的一篇文章中,九章智驾提到,数据闭环能力是自动驾驶下半场的“入场券”,这一观点在行业内引起了广泛共鸣。 在数据闭环体系中,仿真技术无疑是非常关键的一环。仿真的起点是数据,而数据又分为真…

Linux网络编程:网络基础

文章目录: 一:协议 二:网络应用设计模式_BS模式和CS模式 三:网络分层模型(OSI七层 TCP/IP四层) 四:通信过程 五:协议格式 1.数据包封装 2.以太网帧格式和ARP数据报格式 …

【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题,下面给大家介绍几种出现的问题以及解决方案: 1、ohpm not set up,报错截图如下: ​ 解决方案&…

基于YOLOv8模型和PCB电子线路板缺陷目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型PCB电子线路板缺陷目标检测系统可用于日常生活中检测与定位PCB线路板瑕疵,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检…

❤ 全面解析若依框架vue2版本(springboot-vue前后分离--前端部分)

❤ 解析若依框架之前台修改 1、修改页面标题和logo 修改网页上的logo ruoyi-ui --> public --> favicon.ico,把这个图片换成你自己的logo 修改网页标题 根目录下的vue.config.js const name process.env.VUE_APP_TITLE || ‘若依管理系统’ // 网页标题 换成…

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统(spring spring…

通过postgresql的Ltree字段类型实现目录结构的基本操作

通过postgresql的Ltree字段类型实现目录结构的基本操作 将这种具有目录结构的excel表存储到数据库中,可以采用树型结构存储 DROP TABLE IF EXISTS "public"."directory_tree"; CREATE TABLE "public"."directory_tree" (…

【李沐】3.5、softmax回归的从0开始实现

注意: 把每个像素位置看作⼀个特征 # 导入PyTorch库 import torch # 从IPython库中导入display模块,用于在交互式环境中显示内容 from IPython import display # 从d2l.torch模块中导入torch作为d2l的别名,方便后续使用d2l库中的功能 from d…