首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux 虚拟存储器的了解(转http://www.avivchen.com/?p=36)

2013-11-25 
linux 虚拟存储器的理解(转http://www.avivchen.com/?p36)左边的图片可以理解为一个linux 进程的虚拟存储

linux 虚拟存储器的理解(转http://www.avivchen.com/?p=36)

左边的图片可以理解为一个linux 进程的虚拟存储器,它的虚拟地址空间(即计算机指令的地址范围)为:0-2的32次方(64位机器就是2的64次方),这个虚拟地址空间范围告诉大家可以去使用这个空间的任何地址,但是一般一个程序只会使用其中一部分。既然是“虚拟”,说明它不是真实存在的,是逻辑上的概念,用于说明计算机中如何去组织这些信息。在计算机中不存在实际空间存放图片中左边这样的结构。操作系统是这样实现的:利用数据结构分别记录.text 段,.data段等的相关信息,当程序执行的时候,再利用这些记录的信息去将可执行文件的信息加载到内存中进行运行(具体参考深入理解计算机系统的9.7.2)。

a、可执行文件中的text 段的内容如何知道对应到左边的哪个地址范围之内?

这是因为可执行文件中的text段中有虚拟地址信息。所有进程能使用的虚拟地址空间范围都是一样的(0-2的32次方),所有可执行程序的text 段中的地址完全有可能相同。它通过这些虚拟地址信息,映射到进程的虚拟地址空间的相应范围,实际的实现过程就是在数据结构中记录这个地址范围。

b、为什么同样的地址在内存中不会产生冲突呢?

这是因为这些地址都是虚拟存储器中的地址,程序在运行的过程中,操作系统通过一定的地址翻译机制(参考深入理解计算机系统9.6节)将虚拟地址翻译为实际内存中的地址。

3、虚拟内存(linux中叫交换空间)

a、内存才256M,为什么运行比256M 大的可执行文件都能运行呢?

操作系统运行程序的时候,并不是将所有的信息都加载到内存中,它是按需加载,先加载程序现在运行所需的代码和数据到内存中,当程序运行一段时间后,如果需要别的代码和数据时,操作系统会将该进程目前在内存的某一部分代码换出来存储在磁盘的某个空间(也就是虚拟内存或交换空间,注意这个空间并不是可执行文件的硬盘空间),并将所需的代码加载到内存中。这种方式就解决了程序比内存大的情况,而刚才的那个交换空间默默地作为内存的扩展,因此称为虚拟内存。

4、参考文献

a、Playing with Virtual Memory? (这篇文章从程序的角度讲解了虚拟内存)

翻译地址:http://blog.nosqlfan.com/html/2956.html

b、Computer Systems-A Programmer’s Perspective(深入理解计算机系统第二版,主要参考第7章和第9章)–很好的一本书,强烈推荐

看完这篇文档,大家可能还是云里雾里,希望大家留言进行交流!

热点排行