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——进程地址空间
前言 在操作系统中,内存分为以下几个区域,从下往上按照从小到大排列 一、程序地址的分布 代码 #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中文版永久汉化版电脑数据恢复工具下载
🎈🎉安利时间到!今天要跟大家分享的是——EasyRecovery17中文版的最新功能!🎉🎈 🌟✨ “数据恢复小能手” ✨🌟 让我来介绍一下这款软件的主打特点。 EasyRecovery17中文版是一款强…...

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

C/C++开发---全篇
1、统筹 学习目标: C/C、python精通。 就业匹配方向:专精一个领域,延长职业生涯。 (1)适配行业; (2)量化; (3)安全; (4&…...

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

WPS真题题库导入刷题小程序:百思考个人使用经验分享
这篇文章的诞生,是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅! WPS的分值: 单项选择题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()的参数表示坐标系坐标轴线段尺寸大小,你可以根据需要改变尺寸 const axesHelper new THREE.AxesHelper(200)//数值是坐标的尺寸 scene.add(axesHelper)//添加到场景里 坐标系包含三个坐标轴&…...

基于 Android studio 实现停车场管理系统--原创
目录 一、项目演示 二、开发环境 三、项目页面 四、项目详情 五、项目完整源码 一、项目演示 二、开发环境 三、项目详情 1.启动页 这段代码是一个简单的Android应用程序启动活动(Activity),具体功能如下: 1. **延迟进入登…...

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

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

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?
作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满,几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代,AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现,同样值得业界关注&…...
Java进阶篇之包的概念及其应用
引言 在前面的文章中,我们介绍了抽象类和抽象方法(Java进阶篇之抽象类和抽象方法),在Java编程中,包(Package)是管理类和接口的重要工具。包不仅提供了一种层次化的命名空间机制,还可…...

短剧出海,赚钱新途径,掌握海外短剧CPS分销的秘诀
国内短剧发展的如日中天,需要的资质也是越来越严格,不少人已经将目标瞄向海外短剧市场,海外短剧这块相对来说并没有那么严格,但很多人在海外推广的道路上举步维艰,推广异常困难,重点讲下目前海外短剧的推广…...
uniapp小程序openid和unionId
1. openid 1. 用户的openid在小程序中的固定不变的; 2. 用户在不同的小程序里的openid是不一样的; 3. 只要appid不变,openid就不变。 获取openid 1. 使用uni.login获取code 2. 使用code调接口换取 用户唯一标识 OpenID 、 用户在微信开放平台…...

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

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

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

Gin框架接入pyroscope完美替代pprof实现检测内存泄露
传统检测内存泄露可以看一下我这篇文章Gin框架接入Prometheus,grafana辅助pprof检测内存泄露-CSDN博客 pyroscope被Grafana收购,GPT来总结一下pyroscope的强大之处🐶 pyroscope github地址 pyroscope与grafana的安装 docker compose安装,这里我们其实…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...