分页管理是将进程逻辑空间进行划分,对物理内存也进行划分。进程划分称为页,内存划分称为页框、内存块。
进程、内存进行划分之后,就需要有一个数据结构记录进程的哪一个页被放到了内存的哪一个页框去了。操作系统通过页表来进行记录。
页表根据页号按顺序进行存储。因为物理内存进行划分后,每一块大小固定,那么数额也就是固定的。所以块号的位数就是固定的。那么就可以利用数组的思维方式进行记录。
下标为0的存储0号页存放到哪一个物理块号。
所以页表大致基础的数据结构为一个线性表,下标为页号,内容为页框号的线性表。
虽然分页进行了离散存放,但离散是对于页来说的,但是每一个页内的地址都是连续存放的。
所以一个逻辑地址可以理解为
逻辑地址=页号∗页大小+页内偏移量逻辑地址 = 页号*页大小 + 页内偏移量 逻辑地址=页号∗页大小+页内偏移量
那么将这个逻辑地址转为物理地址可以采取以下步骤
页号=逻辑地址/页面长度页内地址=逻辑地址%页面长度页号 = 逻辑地址 / 页面长度\\ 页内地址 = 逻辑地址 \% 页面长度 页号=逻辑地址/页面长度页内地址=逻辑地址%页面长度
而如果页面大小为2的整数幂,那么就相当于高位为逻辑地址,低位为页内地址。那么就可以直接取前面几位就是页号,后面几位就是页内地址。
同时
物理块号=页框号∗页面长度+页内地址物理块号 = 页框号 * 页面长度 + 页内地址 物理块号=页框号∗页面长度+页内地址
所以如果页大小为2的整数次幂,可以让页表查询出的页框号直接代替高位,就可以得到物理地址。
正常情况下,对于一个地址的访问需要访问两次内存。第一次去内存中查询页表,第二次取真正的数据/指令。
通过快表可以优化第一次访问内存。
快表是类似于cache的存储设备,存储速度在内存之上。
可以将近期访问的页表项放入快表之中,在进行逻辑页表到物理页框的转换时候,可以先访问页表。如果快表命中就不需要访问内存页表。只要访问一次内存,寻找真实的数据即可。
运用原理:时间局部性原理,空间局部性原理。
所以可以进行一个二级划分。将页表进行等大拆分,常驻内存的为页目录表。页目录表存放二级页号存放的页框号。然后调二级页表进入内存,查询页框号,得到最终的物理地址。
那么驻留内存只需要为页目录表。
注意点:各级页表不应该超过一页。
进程的地址空间按照程序自身逻辑关系划分为若干个段。每个段从0编址。每个段在内存中占据各个连续空间,段之间可以互不相连。
那么一个逻辑地址就可以表示为高位段号,低位段内地址。
而段号位数决定进程最多可以有几个段号,段内地址位数决定一个段最大的大小。
与页表类似,进程分为一个一个段,也需要有数据结构对于每个段进行记录。
段表结构为段长与基址。基址表示这个段在内存当中的起始地址为多少。段长表示这个段有多长。因为每一个段的段长不固定。
PCB中会有段表的起始地址与段表长度,在进程调入CPU运行时候,会将这个值加载进CPU的段表寄存器。
分段有利于用户逻辑维护,分页能够提高内存利用率。
如果单纯使用分段管理,与动态分区分配很类似,对内存空间的利用率并不好。
可以先对进程进行分段,然后对于一个段进行分页管理,就可以让进程即保持逻辑性,也能保证内存利用率较高。
段页式地址转换改变为先进行段号转换,再进行页转换。
上一篇:TCP/IP三次握手和四次挥手