Main Memory

Main memory

Background

首先提两个概念,这两个寄存器是由操作系统载入的:

  • base register:存着最小的合法物理地址
  • limit register:存着可用范围
img
  • address binding:用户程序的相对地址被绑定到物理地址上,可以在编译期、加载期和运行期进行
  • logical address:由CPU定义的,用户程序生成
  • physical address:真实的物理地址
  • memory-management unit(MMU):负责将逻辑地址映射到物理地址
  • dynamic loading:为了更好地管理内存,使得进程不受物理内存的限制
  • dynamically linked libraries:通常是系统库,在执行前动态链接进来,避免占用太多内存

swapping

进程可以在内存和后台存储区(通常是磁盘)中交换。把需要的进程换进来,把暂时不用的进程替换出去

  • swapping是非常耗时间的,因为在内存和外存之间的传输非常耗时间

contiguous memory allocation

通常而言,贮存会被分为两部分,一部分是给操作系统,另一部分给用户空间。

  • 内存保护:limit register有一个地址空间范围,在进程被CPU执行时,这个范围会被加载进去,由操作系统进行验证;
  • multiple-partition allocation:给每个进程分一个分区
  • fixed partition(固定分区)
    • 超过内存大小的进程无法进行
    • 分区内部无法利用的内存变成内碎片,无法解决
  • dynamic partition(动态分区)
    • 在程序装载进内存时,系统将内存划分一块大小适合的连续区域给进程
    • 操作系统自行管理已分配和空闲分区
    • 为了减少碎片:可以通过紧缩和拼接的方法
    • 三种分配算法:
      • first fit:逐个寻找适合的分区
      • best fit:选择剩下内存最小的适合分区
      • worst fit:选择剩下内存最大的分区
      • next fit:从上次查找结束并内存足够大的区域开始划分

paging

概念先行:

  • frames:将物理内存分成帧
  • pages:将逻辑地址分为页
    • 每个地址被分为了page number(代表着页表的项数)和page offset(代表着页的大小)
    • page number构成了page table的索引表,表中存着frame number,对应着内存中的frame
img
  • 分页不会产生外部碎片,但有可能产生内部碎片,即每一页中的缺失

TLB

访问过程:

  • 传统上需要访问物理内存两次,一次是访问获取页表的内容,另外一次是根据页表的指引去访问内存
  • TLB是页表的一部分,只存有页表的部分条目,但不同于页表,TLB一般是存在cache,这样满足快速读取。
  • 在进程被加载进来时,TLB会被填充,寻找frame时,CPU同时在TLB和page table中寻找。找到则返回frame,找不到则在page table中寻找
img
  • 有效访问时间
    • TLB访问时间a
    • 内存页表访问时间b
    • 命中率c
    • 平均访问时间(有TLB):(a+b)c + (b+b+a)(1-c)
    • 没有TLB:2*b
  • 页表有一个有效位,指示该页是否在内存中有映射,否则都需要到磁盘中去找

structure of the page table

Hierarchical Paging

假如有一个32位的系统,页表大小是4KB(212),那么一个页表会含有1MB(220)条索引,如果一条索引4个字节,那么会产生4MB大小的页表

因此,我们可以使用二级页表,将页表分页。一个地址将会如下图所示:页目录是页表的索引,页表是进程物理空间本身的索引。

img

(P1是外部表的索引,P2是二级表的索引)

hashed page tables

超过32位地址空间通常是使用哈希页表

哈希页表的每一条目都包括一个链表的元素,每个元素有三个域:虚拟页码,物理帧号,指向下一个元素的指针。

通过页码途径哈希函数得到对应的条目,从而获得物理帧号。

img

inverted page tables

真正被使用的帧才会记录到在反向表的条目中。整个系统只有一张页表,对每个物理内存帧都只有一个条目,包括了逻辑地址和进程号。