程序地址空间

程序地址空间

我们之前学习C/C++的时候,我们认为下面这就是内存空间
在这里插入图片描述
其实它知识进程虚拟地址空间,这根本不是内存。
接下来我们看一段代码
在这里插入图片描述

我们利用fork()创建一队父子进程,子进程在运行两秒之后将一个全局的变量val进行修改,那么我们会看到什么?
在这里插入图片描述
我们发现,我们将val的值更改了之后,发现它的地址依然没有改变,这里我们便能说明,C/C++打印出来的地址不是物理内存的地址。我们在C/C++打印出来的地址为虚拟地址。

进程地址空间

为何会有进程地址空间呢?
每个进程都有一个内存地址空间,每一个进程都认为自己独占物理内存。但是又可能存在很多的进程在运行,那么OS如何管理大量的地址空间呢?------>先描述,再组织。
也就是说,OS给每个进程画了一个大饼,分配给一点空间,让进程认为自己独占4GB的内存空间,每一个进程都有一个PCB,在PCB中有可以指向一个虚拟地址,**OS负责将虚拟地址转化为物理地址,**物理地址用户一概看不到,由OS进行统一管理。

页表 MMU

页表的作用是将虚拟地址转化为物理地址。虚拟地址的所有区域最终由页表映射到物理内存中,页表不仅可以映射,也有权限管理。
为什么要有页表和MMU来映射?

  1. 通过添加一层软件层,完成有效的对进程的操作内存进行风险管理(权限管理),本质是为了保护物理内存。
  2. 将内存申请和内存使用的概念划分清楚,通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进程读写内存和OS进行内存管理工作,进行软件层面上的分离。
  3. 站在CPU和应用层的角度,进程统一可以看作统一使用4GB空间,而且每个空间区域的相应位置是比较确定的。

写时拷贝

在写的时候(即字符串改变的时候)才会真正的开辟空间拷贝,如果只是对数据只读时,只会对数据进行浅拷贝。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值