程序地址空间
我们之前学习C/C++的时候,我们认为下面这就是内存空间
其实它知识进程虚拟地址空间,这根本不是内存。
接下来我们看一段代码
我们利用fork()创建一队父子进程,子进程在运行两秒之后将一个全局的变量val进行修改,那么我们会看到什么?
我们发现,我们将val的值更改了之后,发现它的地址依然没有改变,这里我们便能说明,C/C++打印出来的地址不是物理内存的地址。我们在C/C++打印出来的地址为虚拟地址。
进程地址空间
为何会有进程地址空间呢?
每个进程都有一个内存地址空间,每一个进程都认为自己独占物理内存。但是又可能存在很多的进程在运行,那么OS如何管理大量的地址空间呢?------>先描述,再组织。
也就是说,OS给每个进程画了一个大饼,分配给一点空间,让进程认为自己独占4GB的内存空间,每一个进程都有一个PCB,在PCB中有可以指向一个虚拟地址,**OS负责将虚拟地址转化为物理地址,**物理地址用户一概看不到,由OS进行统一管理。
页表 MMU
页表的作用是将虚拟地址转化为物理地址。虚拟地址的所有区域最终由页表映射到物理内存中,页表不仅可以映射,也有权限管理。
为什么要有页表和MMU来映射?
- 通过添加一层软件层,完成有效的对进程的操作内存进行风险管理(权限管理),本质是为了保护物理内存。
- 将内存申请和内存使用的概念划分清楚,通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进程读写内存和OS进行内存管理工作,进行软件层面上的分离。
- 站在CPU和应用层的角度,进程统一可以看作统一使用4GB空间,而且每个空间区域的相应位置是比较确定的。
写时拷贝
在写的时候(即字符串改变的时候)才会真正的开辟空间拷贝,如果只是对数据只读时,只会对数据进行浅拷贝。