3. 其它考虑
3.1
虚拟内存到物理内存的映射表,可以有其它的实现方法。
上面提到的32位的地址空间用了2级的映射表,如果地址空间扩展到64位,要如何实现?映射表要占用多少空间?
其实有一种数据结构叫做Hash表,Oracle的buffer cache,library cache都用到了这个,是否有CPU用这种方式的映射表?
3.2
地址转换消耗其实是比较大的,CPU有一个专门用来Cache映射表的TLB,用硬件实现,加速地址转换。Cache无所不在。
3.3
x86的cpu即支持分页,也支持分段,分页是分段基础上的分页,为了简化,上面没有提。
3.4
物理内存如何管理?最简单的可以对物理内存的每一页做个位图映射。
3.5
每个进程都有自己的页表,进程越多,页表占用的总的空间越多。
如果每个进程需要访问相同的物理内存,那么它们是否可以公用页表呢?
比如Oracle的SGA,需要访问SGA的进程可能成百上千(假设1k),而SGA可能是相当大的(假设4G),导致页表相当大(4M),如果每个进程都要自己的页表,那么这些进程的页表占用的空间就要4G(1k*4M),而其实它们的页表的内容应当是一样的,操作系统是否会对这种情况做一个优化呢?