Linux - 进程地址空间
创始人
2025-05-30 05:38:02
0

引入

在学习C语言的时候,内存包括栈区、堆区、静态区

这个布局是内存吗? 不是!! 这是进程地址空间!

下面测试一下:

11540是bash进程

我们修改一下源程序,在观察下结果

发现父进程的g_value的值不变,这里得出一个结论:

子进程对全局数据修改,并不影响父进程
进程具有独立性 进程 = 内核数据结构+代码和数据
保证进程的独立性的方法是写时拷贝

这里还有一个问题,就是我们可以发现子进程和父进程的地址是一样的,那么地址相同为什么变量的结果不同呢?

如果假设是物理地址,结果会不同吗? 答案肯定是不可能读取同一变量的地址,读到不同的数值!

所以这里的地址绝对不是物理地址

我们在语言层面用的地址,不是物理地址

我们称这种地址叫做虚拟地址or线性地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

OS必须负责将虚拟地址转化成物理地址 。

进程地址空间

故事1

故事2

小花VS小胖,两个小学生,闹了矛盾,最后在桌子上化了个线,画线的本质:区域划分!

区域划分:对线性区域进行1指定的start和end即可完成区域划分

两人相安无事了一阵子,过了一段时间,双方中的一方通过暴力扩张,已经占有整个桌面的70%甚至80%,该种行为我们称为扩大区域 ,修改start\end值即可。

所以之前说‘程序的地址空间‘是不准确的,准确的应该说成进程地址空间 ,那该如何理解呢?看图

上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了 不同的物理地址!

fork在返回的时候,父子都有了,return两次,返回的本质就是写入、谁先返回,谁就让OS发生写实拷贝

扩展1 如果没有进程地址空间,os如何工作

如果没有进程地址空间,代码和数据存储在物理内存,那么会造成一些问题,如果寻址的地址出现越界,会影响到其他程序,无法保证进程的独立性。

为什么要有进程地址空间?

1 防止地址随意访问,保护物理内存与其他进程
2 将进程管理和内存管理进行解耦合
3 可以让进程以统一的视角,看待自己的代码和数据

扩展2 malloc本质

申请空间成功但是暂时不用,闲置状态,也会造成浪费

malloc先申请一个空间,假设我们在堆区上申请一个空间,即将堆区扩大,往上申请,然后将虚拟地址填入页表,但是物理地址暂时不填,同时也不在物理地址中申请空间,调用malloc就直接返回。采用缺页中断的方式

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...