操作系统之内存分区与分页

内存分区

如何将程序中的代码段、数据段等内容存放在内存中?
1、采用可变分区的方法,每次存放程序段之前找到与之大小匹配的空闲内存段,然后存放进去。
2、采用此种方法需要维护2个核心数据表:空闲分区表和已分配分区表。
3、此种方法随着进程段的增多会造成大量的小空闲分区,也叫作内存碎片。如果不加以处理,会降低内存使用率。
4、当出现大量的内存碎片时,可以采用内存紧缩的方法,合并空闲分区,去除内存碎片。但这种内存紧缩的算法很耗时间,会造成用户端程序假死的现象,所以不可直接使用。

总结:载入程序段时不能直接使用内存分区这种方法。

内存分页

将内存均分为多块地址区间,然后再载入程序段。
1、通常情况下,将内存的最小块地址区间定为4K大小。这段地址区间被称为内存的一个单元,也被叫做内存的页。
2、这样内存有很多页,一个程序中有很多个程序段,将这个程序段放入这些页内存中,并记录下每个程序段的逻辑页号和对应的物理内存页框号。
3、这个逻辑页号是程序段载入内存时的序列号,从0开始,依次增大。该逻辑页号可以为后面的多级页表查找物理页码框时提供帮助。这样操作系统需要维护一个数据结构页表,关联逻辑页号与物理页码框号,这个数据结构页表会有一个页表指针,指向该表。同时PCB也会保存这个页表指针,便于该进程访问内存使用。
4、计算机每次访问前会获取该次取址对应的逻辑地址(也就是程序中使用的地址),然后将逻辑地址往右偏移12位(相当于除以4k)偏移后的结果就是对应着页表指针中的逻辑页号偏移,接着通过逻辑页号关联出物理页码框号,最后将物理页码框号往左偏移12位并加上逻辑地址,得出的结果就是计算机该次取址的物理内存地址。
5、可以看出通过程序段,内存页划分,再加以页码指针的维护,是可以正确访问到内存地址的。但是在32位机器中,程序段对应逻辑页号的范围有2的32次方大小,这样一来,每个进程维护的页码表所占用的内存就很大了,会造成内存使用率大大降低。

多级页表

单页表的占用内存空间很大,所以多级页表的出现有效地缓解了这一问题。多级页表占用的内存很小。
1、多级页表的本质是将原来的单页表整理成页目录与页表的上下级访问形式。这样假如原来10000个单页表项就会整理成100个页目录项与100个页表项级联的形式,这样做有什么好处呢?或者说与之前的单页表形式有什么优点呢?
2、我们知道我们写的程序一般不会全部占用完2的32次方的地址空间,可能就是很少的地址空间。如果是单纯的单页表形式访问,那就要2的32次方个页表项使用内存,太浪费内存了。如果采用页表级联的方式,只会占用一小部分页表项使用内存,会大大减少内存使用。这也是利用了程序中不会占满地址空间的特点。
3、不过这种多级页表会出现一个问题,虽然内存空间使用率大大提高,但是时间可能会耗时较多。当出现3、 4、 5等多级页表时,计算机每访问一次内存前都要访问5、 6、 7次的内存,浪费时间。怎样解决这个问题呢?

快表

快表的出现在一定程度上降低了通过页表访问内存地址的时间。计算机中会有一个寄存器TLB,记录快表的,是硬件做的。快表会保存最近多级页表使用的页表号-页码框号的相联,不过只能保存一定数量,因为这个硬件比较贵,而且既然是硬件做的,肯定有数量限制的。
1、快表一般保存64-1024个页表号-页码框号相联,可以实现将近访问内存一次的效果。
2、采用快表这一策略是利用了我们写程序时的地址访问的空间局部性。

总结

应该配合图文解说的,待完善。

猜你喜欢

转载自blog.csdn.net/m0_38099380/article/details/88785221