【Linux:地址空间】

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

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

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

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

地址空间的概念:

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

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

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

地址空间的意义:

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

地址空间的分配与回收:

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

页表:

  • 每一个进程都有自己的页表
  • 页表映射的物理空间也是有权限的(rwx)
相关推荐
烛.照1031 小时前
Nginx部署的前端项目刷新404问题
运维·前端·nginx
安静的做,安静的学2 小时前
网络仿真工具Core环境搭建
linux·网络·网络协议
m0_742155433 小时前
linux ——waitpid介绍及示例
linux·c++·学习方法
华纳云IDC服务商3 小时前
超融合服务器怎么优化数据管理?
运维·服务器
会飞的土拨鼠呀3 小时前
Prometheus监控minio对象存储
运维·prometheus
hy____1234 小时前
动态内存管理
linux·运维·算法
ks胤墨4 小时前
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
运维·docker·容器
小度爱学习4 小时前
数据链路层协议
运维·服务器·网络·网络协议·网络安全
龙之叶4 小时前
Android13源码下载和编译过程详解
android·linux·ubuntu
hhzz4 小时前
Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)
运维·自动化·ansible