相信不少人在看内核内存管理部分的时候,都有这样一个疑问,为何物理页面的大小选择4K,而不是大一些或者小一些呢?
这个问题没有固定的答案,仁者见仁智者见智,每一个人的关注点不同。因此这篇文章不是说给出一个固定的答案,更多的只是一篇讨论性的文章。
内核的页面大小首先跟CPU有关,不一样的架构支持的页面大小也不相同,但有一个共同点,那就是确定支持4K的页面大小。为何处理器在设计的时候会选择4K,而不是其余,这个只有熟悉CPU历史的人才能给出答案,本人才疏学浅,回答不上来,有兴趣的本身找一找。固然处理器的设计者在考虑页面大小的时候,也不是凭空就选择了这个大小,除了历史因素,确定综合了考虑了大页面、小页面的优缺点,因此这里主要列出这些优缺点,经过这些比较来发现内核为何将默认的页面大小选择为4K。
如今更多争论的是大页面仍是维持如今的页面4K大小,因此小页面的状况咱们就不考虑了,经过比较前二者也能够得出小页面的状况。支持大页面的人一般认为大页面有如下好处:
一、减少page table占用的内存。
假设内存必定的话,页面大小越大,管理页面占用的内存也越小。如今内核中每一个页面假设是4K的话,这4K不是全均可用,还有一部分用做struct page(大约是64bytes),若是是2.6.32的话,每一个页还有一个page_cgroup(32bytes),也就是说内存大小的2.3%(96/4096)会被内核固定使用。若是页面大小是4M的话,这个比率大约是0.0006%。假设内存时64G的话,页面大小是4K,管理页占用的内存为1.472G,而页面大小是4M,管理页面占用的内存为0.393M。因此页面比较大时,节省的内存比较多。
二、提升TLB的命中率
每次访问内存的时候,都要将虚拟地址转换为物理地址,若是每次都访问页表的话,消耗比较大。所以,一般使用TLB来加速这个过程。可是TLB的能够直接转换的地址范围是有限的(具体就是项数乘以页面大小),一旦出现TLB miss,这时就必须去页表中查找。因此,若是是大页面的话,一样TLB项数的状况下,能够跟踪更大的内存。
三、提升磁盘I/O
咱们知道在访问磁盘时,最耗时的操做就是查找写入盘区的起始位置,也就是在磁盘盘片上将读写头置于正确的位置上。因此若是是大页面的话,能够减小写入磁盘的次数。好比要写入4M的缓存,页面大小是4M的话,只需写入1次,而页面大小是4K的话,则须要写入4次。
四、提供缓存利用率
若是是大页面的话,能够减小访问伙伴系统的次数。调用伙伴系统的操做队系统的数据和指令高速缓存有至关的影响。内核越浪费这些资源,这些资源对用户空间进程就越不可用。
除了上面提升的好处,确定还有的好处,就不一一列举了。那既然有这么好处,并且如今内存愈来愈大,为何不更多地采用大页面呢?好比4M?
软件开发中,历来不会有很是完美的方案,都是在优缺点之间找到平衡点。一样,大页面有这样那样的好处,缺点也很明显。
一、最大的问题就是内存浪费,并且这个问题很是严重。好比这时要分配的内存是4M+1byte,这时须要两个页面才能知足分配的须要,这个时候浪费的内存为4M-1byte。若是页面是4K的话,浪费的内存数量为4k-1byte。页面太大,可能致使每一个页面都只使用了部分空间,剩余的空间就被浪费了。固然对于数据库这样的系统来讲,页面越大会越好,可是内核要考虑到通用的状况,而不是专一于特殊的应用场景。再好比,如今系统都是只分配虚拟地址空间,虚拟地址空间只有在真正被访问的时候,才映射物理页面,并且为了减小物理页面的浪费,对不访问的部分,则不做映射。若是页面太大,在映射很小的部分时,分配的内存会越大,浪费也就越大。系统在运行时,会频繁地请求内存页的操做,这样致使潜在的浪费会很是严重。这样的浪费会彻底抵消减少page table的优点。
二、页面太大,会致使大量的内存碎片。由于底层的内存管理是以页面为单位。若是系统运行了很长时间,空闲的内存不少,可是连续的内存块都小于要分配的页面数。这时能够经过移动内存块或者利用swap来获取可用内存,可是会致使分配内存的操做很慢,这种慢会造成恶性循环,严重影响系统的性能。若是是小页面的话,内存的利用会比较紧凑,分配页面时须要的连续内存块的大小不像大页面那样须要的那么大。
三、若是CPU崩溃,TLB能够访问的内存越大,对系统的影响也越大。这时一把双刃剑,大页面能够提供TLB访问的内存数量,可是CPU崩溃时,会致使不少内存访问要去页表中请求物理地址。
四、兼容性问题。X86处理器支持的页面大小只有4K,因此若是页面过大的话,会致使兼容性问题。
五、若是页面太大,在将内存页换出到swap分区时,须要换出的内存也就越大,会影响性能。
总之,这个页面大小4K是在计算机发展过程当中选择的,也是在实践中通过检验的,如今看来这个页面是合适的。
若是你仍是想找到更多的证听说服本身的话,能够看看Linus Torvalds是怎么解释这个问题的: