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就直接返回。采用缺页中断的方式

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...