当前位置: 首页 > 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;这里我们其实…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...