操作系统-分页与分段储存管理方式

内存的连续分配方式都存在明显缺陷,如果允许将一个进程分散地装入到许多不相邻的分区中,便可充分地利用内存,从而产生非连续分配方式。 非连续分配:为用户进程分配的可以是一些分散的内存空间。 # 基本分页存储管理 思想:把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分。 - 每个内存分区称为“页框”、“页帧”、“内存块”、“物理块”; - 每个页框有一个编号,成为“页框号”、“页帧号”“内存块号”、“物理块号”; - 每个用户进程拆分成的部分称为“页”、“页面”,页面与页框一一对应,页面编号称为“页号”; - 进程的最后一个页面小于页框,会产生内部碎片; ## 页表与页表项 为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。 - 一个进程对应一张页表; - 页表项:进程的每一页对应一个页表项,每个页表项由页号块号组成; - 页表记录进程页面(页号,连续)和实际存放的内存块(块号,非连续)之间的对应关系; - 各页表项会按顺序连续地存放在内存中(因此页号是隐含的,只需要存放块号的空间),实际中通常使一个页框放入整数个页表项; ## 地址转换 逻辑地址由页号+页内偏移量组成。假如由32个二进制位表示逻辑地址,页面大小为4KB,则前20位表示页号,后12位表示页内偏移量(212B=4KB),且最多有220个页面。 逻辑地址转换成物理地址: - 根据逻辑地址计算页号(逻辑地址/页面长度)、页内偏移量(逻辑地址%页面长度); -页号合法性检查(与页表长度对比); -根据页表起始地址、页号找到对应页表项; - 根据页表项记录的内存块号、页内偏移量得到物理地址; - 访问内存单元; ## 两级页表 页表必须连续存放,在单级页表中,当页表很大时,需要占用很多个连续的页框。 可以将页表再分页,形成两级页表多级页表(为页表建立页表)。 - 逻辑地址结构:一级页号+二级页号+页面偏移量; - 页目录表、外层页表、顶级页表; 两级页表的地址转换 - 根据逻辑地址得到一级页号、二级页号、页面偏移量 - 从PCB中读出页目录表始址,根据一级页号查找页目录表,找到下一级页表在内存中的存放位置; - 根据二级页号查表,找到最终想访问的内存块号; - 结合页内偏移量得到物理地址; # 基本分段存储管理 分段:将地址空间按程序自身的逻辑关系划分为若干个段,每段从0开始编址。每个段在内存中占据连续空间,但各段之间可以不相邻。 逻辑地址:段号(段名)+段内地址(段内偏移量) - 段号的位数决定了每个进程可以分几个段; - 段内地址位数决定了每个段的最大长度是多少; ## 段表 - 每个段对应一个段表项,记录了该段在内存中的起始位置(基址)、段的长度; - 各个段表项的长度是相同的,段号是隐含的; ## 地址转换 - 由逻辑地址得到段号、段内地址; - 段号与段表寄存器中的段表长度比较,检查是否越界; - 由段表始址、段号找到对应段表项; - 根据段表中记录的段长,检查段内地址是否越界; - 由段表中记录的基址、段内地址得到物理地址; - 访问内存单元; ## 分段、分页管理的比较
分页管理 分段管理
页是信息的物理单位 段是信息的逻辑单位
分页对用户不可见 分段对用户可见
页的大小固定 段的大小决定于用户编写的程序
地址空间一维 地址空间二维
空间利用率高,不会产生外部碎片 会产生外部碎片
分段更容易实现信息的共享和保护
访问一个逻辑地址都需要两次访存

段页式管理方式

段页式管理:将进程按逻辑模块分段,再将各段分页,再将内存空间分为大小相同的内存块。 逻辑地址:段号+页号+页内偏移量 ## 段表、页表 - 每个段对应一个段表项,由段号(隐含)、页表长度、页表存放块号组成; - 每个页面对应一个页表项,每个页表项由页号(隐含)、页面存放的内存块号组成 ## 地址变换 - 由逻辑地址得到段号、页号、页面偏移量; - 段号与段表寄存器中的段长度比较,检查是否越界; - 由段表始址、段号找到对应的段表项; - 根据段表中记录的页表长度,检查页号是否越界; - 由段表中的页表地址、页号查询页表,找到对应页表项; - 由页面存放的内存块号、页内偏移量得到最终的物理地址; - 访问目标单元;