linux地址空间

news2024/10/1 5:39:56

地址空间

  • 内存空间示意图
  • 虚拟地址空间
    • 虚拟地址
    • 进程地址空间生命周期图解
    • 为什么要有地址空间呢?
  • 小结

内存空间示意图

进程是在内存中运行的,为了便于管理,不同的数据会存储在不同的区域,因此内存就被分为几部分,如下图所示:

在这里插入图片描述
而这些区域都存什么东西呢?我们有下面一段程序:

#include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 int un_g_val;
  5 int g_val = 2;
  6 
  7 
  8 int main(int argc, char* argv[], char* env[])
  9 {
 10   printf("adress: %p\n",main);
 11   printf("init: %p\n",&g_val);
 12   printf("uninit: %p\n",&un_g_val);
 13   char *p1 = (char*)malloc(10);
 14   char *p2 = (char*)malloc(10);
 15   char *p3 = (char*)malloc(10); 
 16 
 17   printf("heap_p1: %p\n",p1); // 堆地址
 18   printf("heap_p2: %p\n",p2);
 19   printf("heap_p3: %p\n",p3);
 20   printf("stack_p1: %p\n",&p1); //栈地址
 21   printf("stack_p2: %p\n",&p2);
 22   printf("stack_p3: %p\n",&p3);
 23 
 24   int i = 0;
 25   for(i=0;i<argc;i++)
 26   {
 27     printf("argv[%d]:%p\n",i,argv[i]);
 28   }
 29                                                                                                                                                                         
 30   for(i=0;env[i];i++)
 31   {               
 32     printf("env[%d]:%p\n",i,env[i]);
 33   }          
 34   return 0;   
   }
                                                                                                                  

这个程序打印了各种变量的地址,印证了地址空间是确实存在的!
在这里插入图片描述


我们再看这个代码能编过吗?

 11   //常量                                                                                                                                                                
 12   "hello world";               
 13   50;                          
 14   'xxxx;       

可以编译过,并且该东西是字符常量它会硬编码进代码(因为代码也不可更改),所以字符常量会在代码区。

虚拟地址空间

看下面一段代码:该程序创建了一个子线程,共享父进程的全局变量,子进程会更改全局变量。

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int g_val = 2;
  5 
  6  
  7 int main()
  8 {
  9   pid_t id = fork();
 10 
 11   if(id == 0)
 12   {
 13     //child
 14     int cnt = 0;
 15     while(1)
 16     {
 17       printf("I am a child, pid_id:%d,  ppid_id:%d , g_val:%d, &g_val:%p\n",getpid(),getppid(), g_val,&g_val);
 18 
 19       sleep(1);
 20       cnt++;
 21       if(cnt==5)
 22       {
 23         g_val = 200;
 24         printf("child chamge g_val 2 -> 200 success\n");
 25       }
 26     }
 27   }
 28   else
 29   {                                                                                                                                                                     
 30     //father
 31     while(1)
 32     {
 33       sleep(1);
 34       printf("I am a father, pid_id:%d,  ppid_id:%d , g_val:%d, &g_val:%p\n",getpid(),getppid(), g_val,&g_val);
 35     }
 36   }

I am a child, pid_id:20414,  ppid_id:20413 , g_val:2, &g_val:0x60105c
I am a father, pid_id:20413,  ppid_id:18692 , g_val:2, &g_val:0x60105c
child chamge g_val 2 -> 200 success
I am a child, pid_id:20414,  ppid_id:20413 , g_val:200, &g_val:0x60105c
I am a father, pid_id:20413,  ppid_id:18692 , g_val:2, &g_val:0x60105c

我们从运行的结果可以看出来,子进程修改全局变量后,子进程的值改变,父进程的值没变,但是全局变量的地址空间一样!!!

为什么会产生这种情况呢??
我们大胆猜测,程序打印的地址,一定不是物理地址,因为同一地址不可能存储两个不一样的值 。因为打印出来的是虚拟地址!!!

虚拟地址

每一个程序都有自己的虚拟地址空间,就像PCB一样,每一个程序都有一个属于自己的虚拟地址空间,记录着各种数据的位置,供操作系统使用。
如下图所示:代码在准备执行时,会编译成可执行程序,此时程序里面,即代码与代码是有地址的(这个地址就是虚拟地址),程序被加载到内存后:

  1. 首先系统会创建PCB
  2. PCB会有一个指针,指向程序虚拟内存
  3. 根据虚拟内存的地址所对应的物理内存地址,填充页表,完成映射。

在这里插入图片描述
页表 :页表的作用就是完成虚拟地址到物理地址的转换

下图是解释上面代码例子的虚拟空间问题:子进程创建后,获得父进程一模一样的地址空间,当触发写时拷贝时,才复制资源。这样会节省空间。
在这里插入图片描述

进程地址空间生命周期图解

  1. 程序被读进内存的过程
    在这里插入图片描述

  2. 程序执行的流程
    在这里插入图片描述

为什么要有地址空间呢?

1.为了保护物理内存,页表将各个进程隔离起来了。因为地址空间和页表是OS创建并且维护的,意味着想要使用地址空间和页表映射,必须在OS的监管之下进行访问。因此保证了进程之间的独立性,互不影响。

  1. 因为有地址空间和页表的存在,OS可以实现,对未来的数据进行任意位置的加载,只需根据页表即可找找到杂乱无章的数据。这样物理内存的分配和进程的管理就可以分开进行管理。内存管理模块和进程管理模块就完成了解耦合。

  2. 如果我申请了物理空间,但是我不立马使用,我会造成空间的浪费!但是如果我在虚拟空间上申请,当我没使用时,也没有为我开物理空间 。当我使用时,OS才帮我开辟空间,这样可以保证内存的使用率是100%。

  3. 物理内存上的数据理论上可以在任意位置加载,这会导致物理内存上的所有数据都是乱序的。但是有VA+页表的存在,我们可以方便的直接找到各种数据,在进程的视角,数据是那么的竟然有序!因此,可以将内存分布有序化!

小结

OS的系统是深而庞杂的,此文章只是浅显的谈论了以下内存空间的概念及其分布。更详细的内容,还请读者自行查阅。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中访问修饰符

类和类之间的关系有如下几种: 以Hero为例自身&#xff1a;指的是Hero自己同包子类&#xff1a;ADHero这个类是Hero的子类&#xff0c;并且和Hero处于同一个包下不同包子类&#xff1a;Support这个类是Hero的子类&#xff0c;但是在另一个包下同包类&#xff1a; GiantDragon 这…

相关性分析——Pearson相关系数+热力图(附data和Python完整代码)

相关性分析&#xff1a;指对两个或多个具有相关性的变量元素进行分析 1.散点图和相关性热力图 2.相关系数 相关系数最早是由统计学家卡尔 皮尔逊设计的统计指标&#xff0c;是研究变量之间线性相关承兑的值&#xff0c;一般用字母 r 表示。 2.1Pearson相关系数 Pearson相关…

蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣

你好&#xff0c;我是安然无虞。 文章目录 哈希基础概念哈希相关题目 有效的字母异位词 赎金信 字母异位词分组 两个数组的交集 快乐数 两数之和 四数相加 II 最长连续序列 查找共用字符 同构字符串 单词规律 字节跳动面试&#xff1a;缺失的第一个正数 哈喽哈喽&#xff0c;好…

vr航空博物馆综合展馆趣味VR科普体验

第十期广州科普开放日 10月28日周六上午九点半&#xff0c;广州卓远VR科普基地再次迎来一批前来体验的亲子家庭&#xff0c;陆续到达的市民朋友让整个基地都热闹了起来&#xff0c;他们在这里开启了一场别开生面的VR科普体验。 一期一会&#xff0c;趣味VR科普 10月广州科普开放…

Pinia 是什么?Redux、Vuex、Pinia 的区别?

结论先行&#xff1a; Pinia 是 Vue 官方团队开发的一个全新状态管理库。与 Redux、Vuex 相同&#xff0c;核心都是解决组件间的通信和数据的共享问题。 Pinia 和 Vuex 类似&#xff0c;但使用起来更加简单和直观。因为 Pinia 基于 Vue3 的 Composition 组合式 API 风格&…

【k8s】数据存储

一、数据存储的概念 pod的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;kubernetes引入了Volume的概念。…

【Linux】 OpenSSH_9.3p2 升级到 OpenSSH_9.4p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

异常处理流程

1.什么是异常源&#xff1f; 引发处理器进入对应的异常模式 2.异常源和异常模式的对应关系 1.五种异常模式&#xff0c;七种异常源 &#xff1b; 2.根据不同的异常源&#xff0c;引发处理器进入不同的异常模式&#xff0c;执行异常处理函数 3.异常源具有优先级&#xff0c;复…

PLC常用的几种编程语言

PLC的软件编程语言与一般计算机语言相比&#xff0c;具有明显的特点&#xff0c;它既不同于高级语言&#xff0c;也不同于一般的汇编语言&#xff0c;它既要满足易于编写又要满足易于调试的要求。 早期的PLC仅支持梯形图编程语言和指令表编程语言&#xff0c;现根据国际电工委员…

log4j CVE-2021-44228 RCE漏洞复现

一、漏洞特征 Apache Log4j 是 Apache 的一个开源项目&#xff0c;Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架&#xff0c;并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等&#xff0c;通过定义每一条日志信息的…

推荐系统设计与实现 协同过滤推荐算法 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 推荐系统设计与实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1…

高效节省IT资源,WorkPlus让企业轻松实现业务场景的快速移动化

在企业的业务移动化进程中&#xff0c;维护iOS、安卓、桌面端不仅需要专业的技术支持&#xff0c;更需要投入大量的IT人力资源。然而&#xff0c;选择WorkPlus作为移动化解决方案&#xff0c;企业可以轻松省去iOS、安卓、桌面端工程师的维护成本&#xff0c;只需借助H5工程师的…

搅拌站排队叫号系统 | 混凝土智慧物流管理平台

思伟软件 智慧物流管理平台 混凝土 用砼行 在线下单。工地通过砼行小程序下单&#xff0c;搅拌站通过砼行APP接单。 智能调度。手机打卡&#xff0c;自动排队。大小车自动分列&#xff0c;拌台生产随时看。电子小票直达司机手机。自动收到砼行APP推送的电子小票与广播发车提…

C 数据类型

C 数据类型 在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&#xff1a; 序号类型与描述1基本数据类型 它们是算术类型&#x…

数字化转型:2023零售业的新机遇,亿发零售云系统释放无限可能

零售业的数字化转型不仅能够为顾客带来卓越的购物体验&#xff0c;同时也能为零售企业提供丰富的数据分析、销售预测和生产管理的机会。通过这些分析&#xff0c;企业能够更准确地了解市场需求和消费者的购买行为&#xff0c;进而制定更具针对性的营销策略&#xff0c;从而增强…

妙享中心升级,小米电脑管家 v1.0.0.489,非小米笔记本安装教程

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;适合想要了解和入门的朋友&#xff1a;点击访问链接 十月底&#xff0c;小米新品发布会发布了新的年度旗舰&#xff0c;小米14和14 Pro&#xff0c;同时发布了最新的自研系统——小米澎湃…

如何在在线Excel文档中对数据进行统计

本次我们将用zOffice表格的公式与数据透视表分析样例&#xff08;三个班级的学生成绩&#xff09;。zOffice表格内置了大量和Excel相同的统计公式&#xff0c;可以进行各种常见的统计分析&#xff0c;如平均值、标准差、相关性等。同时&#xff0c;zOffice也有数据透视表功能&a…

Flutter 第三方 flutter_screenutil(屏幕适配)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

深入浅出 JetPack Compose UI 自动更新原理

为什么需要学习 Compose 的底层原理&#xff1f; 我想学习底层原理的主要原因是我对 Jetpack Compose 是如何运作的非常感兴趣。相对于传统的 View 系统&#xff0c;JetPack Compose 写起来相当神奇。具体来说&#xff0c;Composable 函数不会有返回值&#xff1b;它会自动更新…

NVIDIA Jetson SOC 内存分配策略

CPU 是Host, GPU 是Device, 系统内存分配策略如下: 这段话的翻译如下&#xff1a; 集成的GPU会和CPU以及其他Tegra引擎共享DRAM&#xff08;动态随机存储器&#xff09;&#xff0c;并且CPU可以通过将DRAM的内容移动到交换区域&#xff08;SWAP area&#xff09;或者相反来控制…