操作系统笔记:(二)物理内存分配2:非连续内存分配

本文组织结构如下:

  • 动机
  • 段式
  • 页式
  • 段页式

非连续内存分配动机

  • 提高内存利用率(没有外碎片)
  • 允许程序使用非连续地址
  • 共享代码和数据
  • 动态加载和链接

需要实现的依然是从逻辑地址到物理地址的转换。

段式

段式就是将内存分成很多个段,段与段之间不连续,但每个段是连续的。(e.g.: 代码段,数据段,堆栈段…)

下图是一种硬件实现方式
操作系统笔记:(二)物理内存分配2:非连续内存分配_第1张图片

逻辑地址是一个段号和段偏移,OS维护一个段表(<段基址,段长度>)

页式

页帧

物理地址被划分为大小相同的块,称为帧(frame),通常是 2n 2 n 个字节(e.g.:4KB)
帧的结构如下图
操作系统笔记:(二)物理内存分配2:非连续内存分配_第2张图片

逻辑页面

顾名思义是把逻辑页面分成大小相同的页,大小与帧大小相同,保证页内偏移与帧内偏移相同
如下图:
操作系统笔记:(二)物理内存分配2:非连续内存分配_第3张图片

页表: 从页面到帧

页表就是一个从页面到页帧的映射
操作系统笔记:(二)物理内存分配2:非连续内存分配_第4张图片

页表项

  • 页表项包括: 帧号和标志位(存在位,引用位,修改位,只读位)
  • 每个页面对应一个页表项
  • 每个进程维护一个页表
  • 页表基地址寄存器(PTBR): 将页表放在内存中需要知道它的起始地址.

性能问题

  • 需要两次访存 ,页表再内存中需要访存一次,再根据帧号访问物理地址又是一次
  • 页表可能会很大

解决方案一个就是 缓存 (TLB),另一个可以用多级页表

TLB

由于TLB放在CUP中所以很快,而根据程序访问内存的局部性可以利用很好的命中策略提高命中率。
操作系统笔记:(二)物理内存分配2:非连续内存分配_第5张图片

页表的一些实现方式

多级页表

操作系统笔记:(二)物理内存分配2:非连续内存分配_第6张图片

多级页表就是建立页表树,做多级访存,通过设置存在位减少页表项,当然这种策略会带来访存次数的代价

下面是一个二级页表的例子
操作系统笔记:(二)物理内存分配2:非连续内存分配_第7张图片

反置页表

待填坑

HASH页表

待填坑

段页式

这个比较好理解就是在段式的基础上给每个段加一级页表
操作系统笔记:(二)物理内存分配2:非连续内存分配_第8张图片

有一个优点就是 容易实现共享代码段共享
操作系统笔记:(二)物理内存分配2:非连续内存分配_第9张图片

你可能感兴趣的:(system&software,engineer)