读书-程序员的自我修养-链接、封装与库(13: 第六章:可执行文件的装载与进程(1)进程虚拟地址空间,4GB,和 装载方式,局部性原理,页映射)
1. 进程虚拟地址空间
1.1 4GB虚拟地址空间
每个程序都有自己的虚拟地址空间,32位下虚拟地址空间为
0-2^32-1,即0x00000000 ~ 0xFFFFFFFF,也就是4GB大小。
1.2 4GB虚拟地址空间不能任意使用
那么32位下的4GB虚拟空间,程序是否能任意使用呢?
答案是否定的。
因为操作系统需要监管程序的运行,程序只能使用OS分配的地址。如果访问非法地址,OS就会干掉程序,如windows下的“进程因非法操作需要关闭”;linux下的段错误等。
1.2.1 4GB虚拟地址空间分配
linux下,进程虚拟空间分为:操作系统占1GB,进程占3GB。
如下图所示:
其中,进程从0x00000000 ~ 0xBFFFFFFF 3GB使用;
操作系统从 0xCFFFFFFF ~ 0xFFFFFFFF 1GB使用。
1.2.2 3GB空间不够用怎么办? PAE出现
- 在大型数据库,图像处理程序中,3GB空间不够用,那应该怎么办呢?
解决办法就是 PAE(Physical Address Extension)地址扩展。 - 空间的含义:
2.1 指的是虚拟地址空间,就是4GB。
2.2 指的是物理地址空间,不止4GB,可以很大。
如36位的物理地址,最高64GB物理内存。
这种使用Intel新的映射方式可以访问更多的物理内存的方法就叫做PAE。
1.3 虚拟地址空间-详细
参考:
https://blog.csdn.net/lqy971966/article/details/119378416
2. 装载的方式
2.1 局部性原理的出现
最简单的装载就是将程序运行的所有指令和数据全部装入内存中。但是,很多时候程序需要的内存大于物理内存。
怎么办?加内存?-太贵
那就只装部分进内存 - 局部性原理。
2.1.1 局部性原理(动态装入的基本原理)
程序运行时是有局部性原理的,所以可以将最常用的部分驻留内存中,其他放在硬盘里,这就是动态装入的基本原理。
2.1.2 局部性的两种形式:时间和空间局部性
1.时间局部性(temporal locality)
在一个具有良好时间局部性的程序中,
被引用过一次的存储器位置很可能在不远的将来再被多次引用。
2.空间局部性(spatial locality)
在一个具有良好空间局部性的程序中,如果一个存储器位置被引用一次,
那么程序很可能在不久的将来引用附近的一个存储器位置。
参考:
深入理解操作系统(15)第六章:存储器层次结构(1)存储技术+局部性+层次结构(包括:存储器系统/RAM,ROM,SRAM,DRAM,闪存flash/磁盘/(时间和空间)局部性/缓存命中)
https://blog.csdn.net/lqy971966/article/details/121954379
2.2 两种动态装入方法
覆盖装入和页映射是两种很典型的动态装入方法。
他们采用的思想都是:局部性原理。
2.2.1 覆盖装入/overlay
1.在没有发明虚拟存储之前,都是使用覆盖装入的。
2.覆盖装入:
程序员需要将程序手动分割成若干块,
然后编写一个覆盖管理器程序来管理哪些模块应该驻留内存,哪些应该被替换掉。
3.简单的覆盖装入的例子:
一个程序有主模块main,main分别调用A和B。但是A和B之间不会调用。
他们的大小分别是:1024kb,512kb和256kb。
在不考虑内存对齐,装载地址限制情况下,理论上需要1024+512+256=1792kb的空间。
如果使用覆盖装入,只需要1024+512=1536kb的空间。
装入如下图所示:
2.2.2 页映射/paging
1.页映射是虚拟存储机制的一部分,它是虚拟存储的诞生而出现。
页映射的原理和覆盖装入一样,都是使用局部性原理。
2.页:
OS将内存和磁盘中的数据和指令按照页/page为单位划分成若干个页。以后所有的装载和操作的单位就是页。
3.页大小:4kb,8kb,2M,4M。
例如::2G内存,拥有210241024*1024/4096 = 524288个页大小。
2.2.3 页映射例子:
我们假设我们的32位机器只有16kb的内存,每个页4kb。
则页分配如下所示: