当前位置: 首页 > news >正文

Linux——进程地址空间

前言

 在操作系统中,内存分为以下几个区域,从下往上按照从小到大排列

一、程序地址的分布

代码

#include <stdio.h>
#include <stdlib.h>
int noval;
int val = 1;int main(int argc,char*argv[],char*env[]){printf("code addr %p\n",main);printf("init data addr %p\n",&val);printf("uninit data addr %p\n",&noval);char*heap =(char*)malloc(20);char*heap1 =(char*)malloc(20);char*heap2 =(char*)malloc(20);char*heap3 =(char*)malloc(20);printf("heap addr %p\n",heap);printf("heap1 addr %p\n",heap1);printf("heap2 addr %p\n",heap2);printf("heap3 addr %p\n",heap3);printf("stack addr %p\n",&heap);printf("stack1 addr %p\n",&heap1);printf("stack2 addr %p\n",&heap2);printf("stack3 addr %p\n",&heap3);for(int i=0;i<3;i++){printf("&argv[%d]:%p\n",i,argv+i);}for(int i=0;i<3;i++){printf("&env[%d]:%p\n",i,env+i);}return 0;
}

 现象

[yw@hcss-ecs-e53a test3]$ ./mybin -1 -2 -3
code addr 0x40057d
init data addr 0x60103c
uninit data addr 0x601044
heap addr 0xf80010
heap1 addr 0xf80030
heap2 addr 0xf80050
heap3 addr 0xf80070
stack addr 0x7ffe667d4790
stack1 addr 0x7ffe667d4788
stack2 addr 0x7ffe667d4780
stack3 addr 0x7ffe667d4778
&argv[0]:0x7ffe667d4888
&argv[1]:0x7ffe667d4890
&argv[2]:0x7ffe667d4898
&env[0]:0x7ffe667d48b0
&env[1]:0x7ffe667d48b8
&env[2]:0x7ffe667d48c0

通过以上结果可以得到以下结论:

1.地址从代码区到命令行参数环境变量区域依次增大

2.堆区和栈区之间留有巨大的内存空间

3.堆区的地址是逐步增大的而栈区的地址是逐步减小的,简称堆栈相向而生

 二、物理地址与虚拟地址

物理地址是内存中真实存在的地址空间,而虚拟地址是划分给进程,进程内再进行划分的内存空间,其每一块虚拟地址都对应着一个物理地址,但是这种对应关系在用户层面是看不到的,所以需要反向验证虚拟地址的存在。

代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> int val = 1;int main(){pid_t id = fork();if(id){int cnt=0;while(1){cnt++;printf("Parent,pid=%d,ppid=%d,val=%d,&val=%p\n",getpid(),getppid(),val,&val);sleep(2);if(cnt==5){val=100;printf("val:1->100\n");}}}else{while(1){printf("Child,pid=%d,ppid=%d,val=%d,&val=%p\n",getpid(),getppid(),val,&val);sleep(2);}}return 0;
}

现象

         在父进程与子进程之间,如果数据不被修改的情况下,父子进程是共用一份数据的,但是如果有一方对数据进行修改,则会发生写时拷贝,即会将数据拷贝一份到自己的进程内存空间中,两份数据互不影响,在上面的结果可以看到,在数据val被修改前,父子进程的val的地址一致,在val被修改后,二者的值不一样,但是其地址却还是一致。同一块地址不可能会有两个不同的值,说明父子进程的地址是不一样的,但是地址值相同,说明这个地址绝对不可能是物理地址,所哟进程中存在虚拟地址。

在最上面的那张地址分布叫做进程地址空间

三、进程地址空间

1)什么是进程地址空间

        在进程运行时都会有对应的PCB,在PCB里面会存在一张表,每个进程都有对应的地址空间,在地址空间中,存在一张哈希表,该哈希表叫做页表,存放虚拟地址和物理地址之间的映射关系。子进程会继承父进程的地址空间,所以一开始父子进程的数据共享,在数据修改后,在物理地址中会对父进程的地址空间复制一份,并且修改子进程中的映射关系,所以父子进程在打印val的值时,两者通过各自的地址空间的映射关系,获取到的值是不同的。

        每个进程都存在一个地址空间,在32位环境下取值范围是0-4GB;进程地址空间的本质就是数据结构,将多个进程地址空间连接起来。

2)为什么要有地址空间

        地址空间存在的意义是1)划分内存区域,防止进程之间内存发生冲突,并且对进程之间的大小进行动态调整,从而使物理内存由无序变为有序,可以让进程以统一的视角看待进程。2)通过映射,可以将进程管理和内存管理进行解耦,方便操作系统的设计。3)保障物理内存的安全,防止进程产生非法访问。在CPU中,存在一个寄存器,叫做CR3,用于存放页表的第一个物理地址,在CPU上面还存在一个硬件,叫做Memory Manager Unit(MMU,内存管理单元),专门用于通过页表解析物理地址。

3)进程的本质

进程=内核数据结构+可执行程序

4)new/malloc问题

在new/malloc申请空间之后,操作系统只会在进程虚拟内存空间中分配一块内存空间,此时并没有真正在物理内存层面开辟物理空间并创建虚映射关系,只有当用户要对内存空间进行访问的时候才会开辟空间并且建立映射关系,这样的好处是可以加快new/mallc的速度,并且充分保证内存的使用效率。

相关文章:

Linux——进程地址空间

前言 在操作系统中&#xff0c;内存分为以下几个区域&#xff0c;从下往上按照从小到大排列 一、程序地址的分布 代码 #include <stdio.h> #include <stdlib.h> int noval; int val 1;int main(int argc,char*argv[],char*env[]){printf("code addr %p\n&q…...

信创(国产化)方案

信创 信创,即信息技术应用创新,旨在实现信息技术自主可控openEuler openEuler是一款开源、免费的操作系统,由openEuler社区运作,前身为运行在华为公司通用服务器上的操作系统EulerOS。openEuler作为一款开源、免费的操作系统,由开放原子开源基金会(OpenAtom Foundation)…...

EasyRecovery17中文版永久汉化版电脑数据恢复工具下载

&#x1f388;&#x1f389;安利时间到&#xff01;今天要跟大家分享的是——EasyRecovery17中文版的最新功能&#xff01;&#x1f389;&#x1f388; &#x1f31f;✨ “数据恢复小能手” ✨&#x1f31f; 让我来介绍一下这款软件的主打特点。 EasyRecovery17中文版是一款强…...

Cesium倾斜相机视角观察物体

先看效果&#xff1a; 在cesium中&#xff0c;我们有时需要倾斜相机视角去观察物体&#xff0c;如相机俯视45观察物体。 cesium的api提供了倾斜相机视角的配置&#xff0c;但是直接使用cesium的api不能达到我们想要的效果。 函数如下&#xff1a; function flyToBox() {let l…...

C/C++开发---全篇

1、统筹 学习目标&#xff1a; C/C、python精通。 就业匹配方向&#xff1a;专精一个领域&#xff0c;延长职业生涯。 &#xff08;1&#xff09;适配行业&#xff1b; &#xff08;2&#xff09;量化&#xff1b; &#xff08;3&#xff09;安全&#xff1b; &#xff08;4&…...

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论&#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么&#xff1a;activity是什么时候被创建的&…...

WPS真题题库导入刷题小程序:百思考个人使用经验分享

这篇文章的诞生&#xff0c;是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅&#xff01; WPS的分值&#xff1a; 单项选择题20分(含公共基础知识部分10分)。 WPS处理文字文档操作题30分。 WPS处理电子表格操作题30分。 …...

拯救者双系统问题 Verifiying shim SBAT data failed: Security Policy Violation

Verifiying shim SBAT data failed: Security Policy Violation Something has gone seriously wrong: SBAT self-check failed: Security Policy Violation windows更新的问题 https://forums.linuxmint.com/viewtopic.php?t427297 https://github.com/Metabolix/HackBGRT/…...

ThreeJs学习笔记--坐标系,光源,相机控件

坐标系 一、创建添加坐标系 给场景添加坐标系THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸 const axesHelper new THREE.AxesHelper(200)//数值是坐标的尺寸 scene.add(axesHelper)//添加到场景里 坐标系包含三个坐标轴&…...

基于 Android studio 实现停车场管理系统--原创

目录 一、项目演示 二、开发环境 三、项目页面 四、项目详情 五、项目完整源码 一、项目演示 二、开发环境 三、项目详情 1.启动页 这段代码是一个简单的Android应用程序启动活动&#xff08;Activity&#xff09;&#xff0c;具体功能如下&#xff1a; 1. **延迟进入登…...

8 个最佳 Java IDE 和文本编辑器

从 2024 年使用的最佳 Java IDE 和代码编辑器中进行选择&#xff0c;并提高您的 Java 生产力。 Java 是世界上最流行的编程语言之一&#xff0c;于 1995 年首次推出&#xff0c;它确实践行了“编写一个&#xff0c;随处运行”的座右铭。该语言用途广泛&#xff0c;可用于构建从…...

【2024最新版版】PyCharm安装教程

简介 由于Python语法简单容易入门&#xff0c;并且Python在办公自动化等领域的功能非常强大&#xff0c;所以现在越来越多非IT行业的人也开始学起了Python&#xff0c;要学习和使用一门编程语言&#xff0c;一个好用的IDE是必不可少的&#xff0c;而对于Python来说&#xff0c…...

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?

作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满&#xff0c;几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代&#xff0c;AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现&#xff0c;同样值得业界关注&…...

Java进阶篇之包的概念及其应用

引言 在前面的文章中&#xff0c;我们介绍了抽象类和抽象方法&#xff08;Java进阶篇之抽象类和抽象方法&#xff09;&#xff0c;在Java编程中&#xff0c;包&#xff08;Package&#xff09;是管理类和接口的重要工具。包不仅提供了一种层次化的命名空间机制&#xff0c;还可…...

短剧出海,赚钱新途径,掌握海外短剧CPS分销的秘诀

国内短剧发展的如日中天&#xff0c;需要的资质也是越来越严格&#xff0c;不少人已经将目标瞄向海外短剧市场&#xff0c;海外短剧这块相对来说并没有那么严格&#xff0c;但很多人在海外推广的道路上举步维艰&#xff0c;推广异常困难&#xff0c;重点讲下目前海外短剧的推广…...

uniapp小程序openid和unionId

1. openid 1. 用户的openid在小程序中的固定不变的&#xff1b; 2. 用户在不同的小程序里的openid是不一样的&#xff1b; 3. 只要appid不变&#xff0c;openid就不变。 获取openid 1. 使用uni.login获取code 2. 使用code调接口换取 用户唯一标识 OpenID 、 用户在微信开放平台…...

前端工程化-04.Vue项目简介

一.Vue项目-创建 1.使用如图两种方式创建Vue项目 2.在此创建新项目 点击创建项目 创建成功&#xff01; 二.Vue项目-目录结构 三.Vue项目-运行 启动后直接在下方找到连接端口 成功启动项目 这个项目即为Vue中的自带项目Vue.app。修改其中的Home为Vue Home。ctals保存发…...

10 Checkbutton 组件

10 Checkbutton 组件 Tkinter 是 Python 的标准 GUI 库&#xff0c;它提供了一系列的控件来创建图形用户界面。Checkbutton 是其中的一个组件&#xff0c;用于创建可以被选中或取消选中的按钮&#xff0c;通常用于实现布尔值的开关功能。 创建 Checkbutton 创建一个基本的 C…...

获奖方案|趋动科技:资源池化释放AI算力价值

“据统计&#xff0c;GPU的平均利用率不超过30%&#xff0c;会产生巨大的算力资源浪费。我们用软件定义的方式通常可以把用户GPU的利用率提升3-8倍&#xff0c;甚至可以到10倍。” 这是算力池化软件公司趋动科技援引行业报告数据并结合自身企业最佳实践经验给出的最新数据。通…...

Gin框架接入pyroscope完美替代pprof实现检测内存泄露

传统检测内存泄露可以看一下我这篇文章Gin框架接入Prometheus,grafana辅助pprof检测内存泄露-CSDN博客 pyroscope被Grafana收购,GPT来总结一下pyroscope的强大之处&#x1f436; pyroscope github地址 pyroscope与grafana的安装 docker compose安装&#xff0c;这里我们其实…...

反向海淘站点常见配置故障复盘与数据一致性优化方案

摘要反向海淘独立站运行过程中&#xff0c;容易出现价格换算异常、页面语种错乱、商品同步失败、订单状态停滞、运费计算偏差等问题。多数故障并非系统底层缺陷&#xff0c;而是配置逻辑理解偏差、数据规范不统一引发。本文结合实际运维场景&#xff0c;汇总高频故障成因&#…...

从XAI到HXAI:构建以人为中心的可解释AI框架与实践

1. 项目概述&#xff1a;从“黑箱”到“白盒”&#xff0c;构建可信AI的演进之路在机器学习项目里摸爬滚打了十几年&#xff0c;我见过太多因为模型“说不清道不明”而引发的信任危机。一个在测试集上表现完美的信用评分模型&#xff0c;可能因为无法向风控专家解释“为什么拒绝…...

YOLO训练前数据检查必备:一个脚本批量转换LabelImg的txt标签并可视化核对

YOLO训练前数据检查实战&#xff1a;批量转换与可视化核验脚本开发指南 在计算机视觉项目的实际落地过程中&#xff0c;数据质量往往比模型架构更能决定最终效果的上限。许多团队花费大量时间调整超参数和网络结构&#xff0c;却忽略了最基础的标注数据验证环节。当使用LabelIm…...

工业级SCADA革命:FUXA零代码可视化平台如何重塑工业监控决策

工业级SCADA革命&#xff1a;FUXA零代码可视化平台如何重塑工业监控决策 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA 在工业4.0和数字化转型浪潮中&#xff0c;传统SCADA…...

终极指南:5步精通开源网页版三国杀无名杀

终极指南&#xff1a;5步精通开源网页版三国杀无名杀 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 想要随时随地畅玩经典的三国杀卡牌游戏吗&#xff1f;无名杀作为当前最受欢迎的开源网页版三国杀&#xff0c;让你无需下载客户端…...

如何精准识别高校院所与企业之间的潜在合作机会?

核心要点 传统“相亲角”式校企对接效率低下&#xff0c;根源在于科研供给与市场需求间的信息断层&#xff0c;必须转向以数据驱动、模型研判为核心的精准识别机制&#xff0c;才能将模糊的产学研线索转化为可落地的合作机会。精准识别合作机会的关键在于分拆为“供给侧”与“需…...

展锐RM500U 5G CPE固件升级避坑指南:为什么你的QFlash总卡在‘开始下载’?

展锐RM500U 5G CPE固件升级疑难解析&#xff1a;从QFlash卡顿到完美升级的实战手册 当你的展锐RM500U 5G CPE设备需要固件升级时&#xff0c;QFlash工具本应是简单高效的解决方案。然而&#xff0c;许多用户在点击"Start"按钮后&#xff0c;却遭遇了进度条停滞不前的…...

图神经网络在高能物理径迹重建中的应用:ETX4VELO项目解析

1. 项目概述&#xff1a;当图神经网络遇上高能物理径迹重建在大型强子对撞机&#xff08;LHC&#xff09;的LHCb实验中&#xff0c;每秒发生着数千万次质子-质子对撞&#xff0c;产生海量的次级粒子。这些粒子穿过探测器&#xff0c;留下一串串被称为“击中点”的信号。将这些离…...

Neural Complete架构解析:LSTMBase类与TextEncoderDecoder工作流程

Neural Complete架构解析&#xff1a;LSTMBase类与TextEncoderDecoder工作流程 【免费下载链接】neural_complete A neural network trained to help writing neural network code using autocomplete 项目地址: https://gitcode.com/gh_mirrors/ne/neural_complete Neu…...

探索dpt-tools:突破索尼电子纸设备系统限制的技术突破

探索dpt-tools&#xff1a;突破索尼电子纸设备系统限制的技术突破 【免费下载链接】dpt-tools dpt systems study and enhancement 项目地址: https://gitcode.com/gh_mirrors/dp/dpt-tools 在数字阅读与笔记领域&#xff0c;索尼DPT系列电子纸设备以其卓越的显示技术和…...