运行中的应用程序使用所谓的虚拟内存地址来保存数据。数据仍然保存在内存中,但应用程序使用的不是数据保存在内存芯片中的确切地址,而是虚拟地址,该虚拟地址随后被转换为物理内存的实际地址。图1-16是从虚拟内存转换为物理内存的过程示意图。 这种使用内存的方式看似复杂得毫无必要,但确有不少相当重要的优点。 虚拟内存最初的目的是使处理器能在比系统上的物理内存更大的内存范围进行寻址,推出这个技术的时候,物理内存价格极为昂贵。虚拟内存的工作原理是以页面为单位分配内存,每个页面可能保存在物理内存中或存储在磁盘上。当要访问的地址不在物理内存中时,如某个内存页面包含一段时间内未被使用的数据,机器就将该页面写到磁盘,然后再从磁盘提取所需的数据放入刚才释放的物理内存页。这样,相同的物理内存页面就可保存不同的虚拟内存页。 现在,将分页数据写入磁盘或从磁盘上提取的速度并不快,但这样做有一个好处:某个应用程序在用完分配给它的所有空闲物理内存后,仍能在系统上继续运行。 磁盘分页还有其他用途。一个特别有用的功能就是访问文件。整个文件可映射到内存(可为其保留某个虚拟内存地址范围),但该文件中的各个页面只有在实际用到时才需要从磁盘上提取。在这种情况下,应用程序用最少的物理内存就能保存大得多的数据集。 使用虚拟内存还有一个优点,即多个应用程序可重复使用相同的地址。例如,假设所有的应用程序都是通过调用0x10000处的代码启动。如果我们只有物理内存地址,那么只有一个应用程序可以驻留在0x10000,这样我们一次就只能运行一个应用程序。然而,有了虚拟内存寻址,无论我们想运行多少应用程序,都可将其置于相同的虚拟地址,并将此虚拟地址映射到不同的物理地址。因此,以调用0x10000启动应用程序为例,所有的应用程序可使用相同的虚拟地址,但每个应用程序都对应不同的物理地址。 有趣的是,当虚拟CPU的数量增加时,产生虚拟内存的早期动因反而变得更加重要了。一个系统如果有许多活动线程,则系统上会有不少应用程序保留大量实际上很少用到的内存。如果没有虚拟内存,那么保留内存的行为会阻碍其他应用程序获取所需的内存。此外,假如无需将应用程序安排到一个物理地址空间,也就更容易产生能运行多个应用程序的系统。因此,虚拟内存对于任何可以同时运行多个线程的系统来说几乎都是不可或缺的。
多核应用编程实战——1.2.4 用虚拟内存存储数据
书名: 多核应用编程实战
作者: [美] Darryl Gove
出版社: 人民邮电出版社
原作名: Multicore application programming:for windows,linux,and Oracle Solaris
副标题: 多核应用编程实战
译者: 郭晴霞
出版年: 2013-6
页数: 345
定价: 79.00元
装帧: 平装
ISBN: 9787115317506