虚拟内存的最大可寻址空间是多少?

时间:2011-09-24 02:23:03

标签: memory-management operating-system virtual paging memory-segmentation

多次问这个问题。但找不到合理的答案。实际上虚拟内存的限制是什么?

它是CPU的最大可寻址大小吗?例如,如果CPU为32位,则最大值为4G?

还有一些文本将其与硬盘区域相关联。但我发现这是一个很好的解释。有人说它是CPU生成的地址。

我们看到的所有地址都是虚拟地址?例如,我们在使用GDB调试程序时看到的内存位置。

CPU生成虚拟地址背后的历史原因?某些文本可互换使用虚拟地址和逻辑地址。它有何不同?

1 个答案:

答案 0 :(得分:7)

不幸的是,答案是“它取决于”。你没有提到操作系统,但是当你提到GDB时你暗示了linux。在我的回答中,我会尽量做到一般。

基本上有三种不同的“地址空间”。

第一个是逻辑地址空间。这是指针的范围。 Modern(386或更高版本)具有内存管理单元,允许操作系统使您的实际(物理)内存出现在任意地址。对于典型的台式机,这是以4KB的块完成的。当程序访问某个地址的内存时,CPU将查找哪个物理地址对应于该逻辑地址,并将其缓存在TLB(转换后备缓冲区)中。这允许三件事:首先它允许操作系统为每个进程提供尽可能多的地址空间(直到指针的整个范围 - 或者如果有API允许程序映射/取消映射其地址空间的部分,则更高) )。其次,它允许它完全隔离不同的程序,通过切换到不同的内存映射,使一个程序不可能破坏另一个程序的内存。第三,它为开发人员提供了一个调试辅助工具 - 随机损坏的指针可能指向一些根本没有映射的地址,导致“分段错误”或“无效页面错误”或其他什么,术语因操作系统而异。

第二个地址空间是物理内存。它只是你的RAM - 你有一个有限的RAM数量。可能还有硬件具有内存映射I / O - 看起来像RAM的设备,但它实际上是一些硬件设备,如PCI卡,或者可能是视频卡上的内存等。

第三种类型的地址是虚拟地址空间。如果您拥有的物理内存(RAM)少于程序所需的内存(操作系统),操作系统可以模拟拥有更多RAM,通过让程序只有一部分实际上是RAM来获得大量RAM,其余的就是在“交换文件”中。例如,假设您的机器有2MB RAM。说一个程序分配4MB。会发生什么是操作系统将保留4MB的地址空间。操作系统将尝试在实际RAM中保留最近/经常访问的4MB的部分。不经常/最近访问的任何部分都将复制到“交换文件”。现在,如果程序触及那个实际上不在内存中的4MB的一部分,CPU将产生“页面错误”。操作系统会找到一些最近未访问过的物理内存,并在该页面中“进入页面”。它可能必须将该内存页面的内容写入页面文件,然后才能在被访问的数据中进行分页。这就是为什么它被称为交换文件 - 通常,当它从交换文件中读取内容时,它可能必须首先写出一些内容,有效地在内存中交换某些东西在磁盘上。

典型的MMU(存储器管理单元)硬件跟踪访问(即读取)和修改(即写入)的地址。典型的分页实现通常会在分页时将数据保留在磁盘上。这样,如果页面没有被修改,它就可以“丢弃”页面,避免在交换时写出页面。典型的操作系统将定期扫描页表并保留某种数据结构,使其能够智能快速地选择未修改的物理内存块,并随着时间的推移建立有关内存的哪些部分经常更改以及哪些部分更改的信息不。

典型的操作系统通常会轻轻地分页不经常更改的页面(轻轻地因为它们不想生成太多的磁盘I / O而干扰您的实际工作)。这允许它在交换操作需要内存时立即丢弃页面。

典型的操作系统将尝试使用所有“未使用的”内存空间来“缓存”(保留一份)访问过的文件。内存比磁盘快几千倍,所以如果经常读取内容,那么在RAM中使用内存的速度要快得多。通常,虚拟内存实现将与此“磁盘缓存”耦合作为内存源,可以快速回收以进行交换操作。

编写有效的虚拟内存管理器非常困难。它需要动态适应不断变化的需求。

典型的虚拟内存实现感觉非常慢。当一台机器开始使用更多具有RAM的内存时,整体性能变得非常非常糟糕。