做网站哪家公司/域名访问网站
前言
在操作系统中,内存分为以下几个区域,从下往上按照从小到大排列
一、程序地址的分布
代码
#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安装,这里我们其实…...

记录一个lombok和mybatisplus的问题,@Data注解失效
刚开始我这里一直爆红,Article实体类也加了Data注解 依赖也导入了lombok,后来觉得是版本的问题,换了几个版本也是不行 后来最后还是在各种资料下,找到了原因 首先使用lombok不是只要导入依赖就行的,还要有插件&#…...

React学习-初始化react项目
目标: reactv18:->1.核心的22中api2路由3.数据状态管理:redux项目: 1.b端业务闭环:登录方案、权限设计、用户管理方案、业务功能、系统架构设计、路由设计流程闭环:开发环境、生产环境、测试环境、代码规范、分支管理规范、项…...

ubuntu查看CPU、内存、硬盘
1、查看CPU cat /proc/cpuinfo 我这台机器CPU是2核,所以这里是2核 或者使用如下命令也可以查看 lscpu 查看CPU使用率 top 2、查看内存 查看内存信息: free -h 查看内存使用情况: vmstat 3、硬盘 查看硬盘使用情况: df -…...

第5章 使用Intent和IntentFilter通信
第5章 使用Intent和IntentFilter通信 本章要点 理解Intent对于Android应用的作用使用Intent启动系统组件Intent的Component属性的作用Intent的Action属性的作用Intent的Category属性的作用为指定Action、Category的Intent配置对应的intent-filterIntent的Data属性Intent的Typ…...

AI产品经理需要了解的算法知识
这篇文章给大家系统总结一下AI产品经理需要了解的算法知识。 1、自然语言生成(NLG) 自然语言生成(Natural Language Generation,简称NLG)是一种人工智能技术,它的目标是将计算机的数据、逻辑或算法产生的…...

OD C卷 - 结对编程
结对编程(200) 某部门计划通过结队编程来进行项目开发,部门有N名员工,每个员工有唯一的职级,三个员工为一组,结队分组规则如下:选出序号为i,j,k的员工,职级分别为level[i], level[j…...

AcWing 723. PUM
输入两个整数 NN 和 MM,构造一个 NN 行 MM 列的数字矩阵,矩阵中的数字从第一行到最后一行,按从左到右的顺序依次为 1,2,3,…,NM1,2,3,…,NM。 矩阵构造完成后,将每行的最后一个数字变为 PUM。 输出最终矩阵。 输入格式 共一行…...

编译安装php7.4.33正确开启opcache,不只是去掉opcache.enable=1前面的分号
编译安装php7.4.33正确开启opcache,不只是去掉opcache.enable1前面的分号 要成功开启 必须增加zend_extensionopcache.so 请看下面的样例: [opcache] zend_extensionopcache.so; Determines if Zend OPCache is enabled opcache.enable1; Determines …...

ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/141140498 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 ComfyU…...

MySQL中的distinct和group by哪个效率更高?
前言 大家好,我是月夜枫~~ 一、distinct和group by的区别 1.1.作用方式和应用场景 group by和distinct的主要区别在于它们的作用方式和应用场景。 group by用于对数据进行分组和聚合操作,通常与聚合函数(如COUNT、SUM、AVG等…...