【Linux:地址空间】

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

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

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

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

地址空间的概念:

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

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

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

地址空间的意义:

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

地址空间的分配与回收:

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

页表:

  • 每一个进程都有自己的页表
  • 页表映射的物理空间也是有权限的(rwx)
相关推荐
Wang's Blog20 分钟前
Linux小课堂: Vim与Emacs之Linux文本编辑器的双雄格局及Vim安装启动详解
linux·vim·emacs
观山岳五楼22 分钟前
unbuntu系统配置IPV6的三种模式
linux·服务器·ip·1024程序员节
运维行者_42 分钟前
AWS云服务故障复盘——从故障中汲取的 IT 运维经验
大数据·linux·运维·服务器·人工智能·云计算·aws
王道长服务器 | 亚马逊云42 分钟前
AWS Systems Manager:批量服务器管理的隐藏利器
linux·网络·云计算·智能路由器·aws
不开心就吐槽1 小时前
docker-compose方式快速安装MySQL
运维·docker·容器
青靴1 小时前
关于NGINX,你了解多少?
运维·nginx
运维行者_2 小时前
DDI 与 OpManager 集成对企业 IT 架构的全维度优化
运维·网络·数据库·华为·架构·1024程序员节·snmp监控
无聊的小坏坏2 小时前
从零开始:C++ 多进程 TCP 服务器实战(续篇)
服务器·c++·tcp/ip
命运之光2 小时前
【快速解决】Linux服务器安装Java17运行环境
linux·运维·服务器
你喜欢喝可乐吗?2 小时前
Ubuntu服务器无法显示命令行登录提示
linux·运维·服务器·ubuntu