| date | comments | categories | tags | permalink | title | |||
|---|---|---|---|---|---|---|---|---|
2020/3/3 |
true |
|
|
3.19 |
内存分区与分页(多级分页和快表) |
操作系统把程序加载到内存的时候,肯定是要分配内存区间。如果直接粗暴的采用,要多少给多少的“切割”方法, 会造成内存碎片的问题。即空闲的总空间是可以加载一个进程,但是由于这些内存的地址并不连续,造成实际上不能非配。有足够的内存,却不能分配,这就造成了内存的浪费。
这时就引入了内存分页的概念,就是像切面包一样,把内存切割成4K等分的“页”,页是分配内存的最小单位,也就是说当操作系统为一个程序非配内存的时候,只能分配整数个“页”内存。这样每个进程就最多浪费4k的空间。
我为什么是4k,4k就是2的12次方,给定一个内存地址,进行移位操作,右移12位,就是页框的地址。
如上所说的用4k作为一页来划分内存,虽然避免了碎片太多等问题,但是又引入了新的问题。 那就是页表有可能太大,会浪费掉一部分内存。如32位机,页表的大小就会达到4M,也就是说哪怕再小的程序,至少也要占4M以上的内存。为了解决这个问题,就引出了多级分页的概念——不止按4K为大小分割,可以用类似于书籍目录的方式,分为“章”——较大粒度内存,分为“节”——较小粒度内存。这样多级页表,相当于一级目录,二级目录,三级目录,如此就可以很快定位到物理内存,而不用保存一个4M大的页表。
多级分页的应用节省了内存,但也占用了更多的时间,在只有一级分页的情况下,只需要寻址一次就可以定位到物理内存,多级分页就需要多次寻址,这就造成了更多的时间消耗。虽然操作内存的时间相对于人来说很短,但是寻址的动作几乎无时无刻不在进行着,所示多级页表造成的时间浪费不可忽略,为了解决这个问题,计算机在硬件上引入了 快表的概念。 快表的实质就是用一个寄存器保存经常用到的内存地址,通过寄存器直接定位到物理内存地址。当然快表能够奏效也是有前提的,那就是通常情况下经常被操作的内存位置是相对稳定的。