【Linux:地址空间】

A,B进程是一对父子进程,子进程能够拷贝父进程的数据。操作系统通过页表的映射找到该变量在物理内存中的地址。而当两个进程中有一个进程需要对数据进行修改时,操作系统会给其在物理内存中重新分配一个空间地址,然后再重新修改页表虚拟地址所映射的物理空间地址。如下图:

当B进程需要修改g_val时,虽然虚拟空间还是一样,但是其页表重新映射的物理空间却发生了改变(写时拷贝)。

问题:为什么父子进程在数据不一样的情况下,虚拟地址却是一样的?

  • 子进程创建时会拷贝父进程的PCB
  • 当子进程对全局变量g_val修改时,操作系统会重新分配一块物理空间
  • 把新的物理空间重新映射到子进程的页表中

地址空间的概念:

地址空间就是一个结构体,通过结构体将我们所虚拟化出的栈、堆、数据段、代码段等组织起来的一个结构体

  • 在linux中,每一个进程都有自己的虚拟地址空间,该地址空间是进程能看到并且可操作的内存的抽象模型
  • 虚拟地址空间使得每一个进程都认为自己拥有独立的内存,从而提供了进程之间的隔离
  • 虚拟地址空间通常分配了几个区域,分别是:代码段,数据段,堆,栈和映射区域。

程序本身就是一个地址,这就是为什么一开始页表中就有数据的原因

地址空间的意义:

  1. 节省空间:有的空间开辟出来并不着急使用,于是利用虚拟地址(相当于一个记账本)等需要用时,再在物理内存中开辟通过页表映射找到物理空间地址使用
  2. 物理内存并不是按照区域存放的,他的存放是乱序的,不像虚拟地址那样,分区域的挨着存放,因此,通过虚拟地址和页表的配合就能很好的管理物理内存,让"无序"变为"有序"
  3. 拦截非法的请求:例子:你有一百块钱,去商店买东西,很有可能因为年纪小,于是花出去很多不该花的钱,这时候你妈就说帮你保管钱,以后买东西先找他要钱,再去买东西,你妈妈同时也能帮你拦截你乱花钱的非法请求,这里的虚拟地址就是如此,当请求不合理,就不会把你的地址映射到页表中,那么你也分配不了物理空间

地址空间的分配与回收:

  • 进程创建时,操作系统会为它分配虚拟地址空间
  • 进程结束时,操作系统会回收其地址空间
  • 进程运行过程中,根据需要,操作系统可能会动态地分布或回收物理内存页面

页表:

  • 每一个进程都有自己的页表
  • 页表映射的物理空间也是有权限的(rwx)
相关推荐
云泽8082 小时前
从零搭建 WSL2 + Ubuntu C/C++ 开发环境:原理、实践与底层架构解析
linux·c++·windows·ubuntu·wsl2
bosins8 小时前
彻底解决 WSL 2.7+ 空闲自动关闭/内存回收导致 Docker 中断的问题
linux·docker·wsl·dashboard
LongRunning8 小时前
【Linux】H3网络(二)
linux
国际云,接待9 小时前
华为云 EVS 性能诊断:用 CES、ECS QoS 与 fio 定位 IOPS 和吞吐瓶颈
服务器
xx~t10 小时前
嵌入式学习——ARM1
linux·arm开发·嵌入式硬件·arm
xx~t10 小时前
嵌入式——ARM1(详细篇)
linux·arm开发·嵌入式硬件·arm
我要见SA姐110 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
Elastic 中国社区官方博客11 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
fengkai454512 小时前
八、Docker详解4-5
运维·docker
智恒百亿13 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090