直观地想,当逻辑地址比物理地址少时就不会存在冲突问题,更不需要多级页表机制了,为什么逻辑地址要设计的比物理地址多呢?


其实完全没有必要更多。其实是你想反了。不是逻辑地址更多,而是物理地址更少。

为啥物理地址比逻辑地址更少呢?因为大家买不起那么多物理内存啊。


有mmu这个东西,可以分配虚拟地址(题中逻辑地址,下同),再加上内核的支持,可以提升物理内存的利用率。

讲一下Linux Kernel的处理,当运行一个程序时,内核并不会把整个程序完全载入到物理内存中,而是分配好虚拟地址,载入可执行文件的部分到物理内存,只分配了虚拟地址而程序未载入到物理内存的部分,会在页表上做标记。

当程序运行到只有虚拟地址而没有对应物理内存的地方时,处理器会发生异常,然后内核就分配对应的物理内存页,把磁碟上的数据载入到物理内存,再从异常中返回,程序就能继续运行。这个过程,用户态的程序是无法感知到的。

这样,就算分配的虚拟地址大于实际的分配的物理内存也是没有问题的。通过这种机制,假设我有一个远大于物理内存的程序,也是能运行的。在系统物理内存用光的情况下,当程序运行到新的地方,而这部分只分配了虚拟地址,没有对应物理内存时,内核在缺页异常中搜索最不常执行的地方,断开物理内存与原来虚拟地址的连接,把这块物理内存分配给当前程序将要运行的新的虚拟地址,然后把磁碟上的程序载入到物理内存,这样程序又能快乐的运行了。

综上,虚拟地址会比物理地址多,而且也是有必要。计算机里有一个重要的情况,基本上很多东西都是局部的,一个程序虽大(比如我们的假设,磁碟上的程序远大于物理内存),但经常执行的地方却不多。cache也是根据这个情况设计出来的,虽然可能只有几十兆,但是性能提升非常高。

上面说了单进程的情况,下面说说多进程的情况。多进程时,活跃的进程可能就那么几个,其他基本上在睡大觉。32位机上,每个进程都分了4g虚拟地址空间,但是真正需要全部把程序载入到物理内存的不多,或者,我一个程序原来用了很多内存,但后面不怎么运行,内核在内存紧张时,会把这部分物理内存释放掉,分配给其他用途。

前面说的是程序部分,现在说说数据部分,或者说是堆内存这块(malloc分配的)。如果这部分内存不常使用,内核会把他们丢入交换空间(swap,位于磁碟上)这个冷宫。等到真正需要时,才把数据从交换空间拿到物理内存。

综上,这几种情形,使用了虚拟地址,可以让物理内存可以使用得更高效。逻辑地址比物理地址多不言而喻了吧。

ps:我深入到细节的这种讲述不知道好不好理解,文字又比较多。


那假如你机器物理内存2G,开机操作系统占用1G多,剩下几百兆内存,你觉得还能干啥?


逻辑地址比物理地址少的时候也不代表就不会存在冲突了啊.你要知道每个进程都是拥有独立的虚拟地址空间的,而且理论上进程数量是无限的,你就算一个进程的逻辑地址空间设的再小,多个进程对应的还是那一个物理地址空间,怎么分?

再说多级页表机制也不是为了防止冲突的,而是因为虚拟地址空间太大了,如果用一级页表,光页表就可能几百兆,这还是一个进程的,多个进程就更别说了.


你提的问题本身就有问题,本末倒置了。先好好学学操作系统的存储管理机制,段式,页式,段页式是怎么回事。你那不是直观的想,是臆想。


highmem了解一下。如果逻辑地址比物理地址多,只会增加更多复杂度。这就是普及64位机器和操作系统的重要原因之一


反正是虚拟的,为啥不大点呢,万一哪天改需求。


让程序觉得内存够用,使命载入数据进来让CPU满负荷运转,充分利用处理机。


就跟账本和现金流的关系一样,账上钱大手大脚转来转去,前面刚还了后面又借了,真是大方,可真正死到临头了得看现金流


线性地址空间大-&>程序写起来爽

物理地址空间小-&>穷

而且,即使线性地址空间小于物理地址空间,也没有办法避免地址冲突。为了实现地址独立,引入了分段和分页等机制,和地址空间的相对大小没有关系


推荐阅读:
相关文章