【Linux:地址空间】

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

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

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

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

地址空间的概念:

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

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

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

地址空间的意义:

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

地址空间的分配与回收:

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

页表:

  • 每一个进程都有自己的页表
  • 页表映射的物理空间也是有权限的(rwx)
相关推荐
释怀不想释怀几秒前
Linux命令--echo~反引号符~重定向符(>>)~tail命令
linux·运维·服务器
Max_uuc12 分钟前
【C++ 硬核】给单片机装上“反射”:手写极简属性系统 (Property System) 自动化 CLI 开发
运维·自动化
云小逸24 分钟前
【Nmap 设备类型识别技术】整体概况
服务器·c语言·网络·c++·nmap
路由侠内网穿透.43 分钟前
fnOS 飞牛云 NAS 本地部署私人影视库 MoonTV 并实现外部访问
运维·服务器·网络·数据库·网络协议
Doro再努力1 小时前
【Linux05】Linux权限管理深度解析(二)
linux·运维·服务器
鱼跃鹰飞1 小时前
Leetcode:97.交错字符串
linux·服务器·leetcode
Gofarlic_oms12 小时前
通过Kisssoft API接口实现许可证管理自动化集成
大数据·运维·人工智能·分布式·架构·自动化
Suchadar2 小时前
Docker基础命令(二)——数据卷管理端口映射与容器互联
运维·docker·容器
firstacui2 小时前
Docker容器网络管理与容器数据卷管理
运维·docker·容器
Doro再努力2 小时前
【Linux操作系统07】包管理器与Vim编辑器:从理论到实践的全面解析
linux·编辑器·vim