过去, 只有操作系统和一个程序在内存中.

现在, 操作系统和多个程序都在内存中. 程序等待 I/O 时, 为了避免处理器等待, 需要进行优化, 使得更多的程序可以加载入内存.

内存管理: 在多程序设计系统中, 内存的 “用户部分” 应该被进一步划分以适应多个程序, 这是由系统动态决定的.

加载更多程序的途径

  • 增大内存

  • 使用交换和重叠技术

    • 当没有程序就绪的时候, 系统载入程序

    • 分区分页

  • 虚拟内存

    • 请求分页
    • 虚拟地址

分区

固定大小分区

系统: 固定的大小

用户程序: 固定的大小, 但各不相同. 当加载一个程序的时候, 将其载入刚好能够容纳下这个程序的最小的区中.

缺点: 产生大量内部碎片.

可变大小分区

系统: 固定的大小

用户程序: 按需分配

缺点: 产生大量外部碎片

分页

基本思想:

  • 将内存分为固定大小的块, 称为页框(页帧), 将程序分为固定大小的块, 称为

  • 将页加载入页框中

逻辑地址: 指令中的地址

物理地址:主存中的地址

虚拟内存

内存的大小是有限的,但是对内存的需求在不断增加

基本思想:请求分页,一个进程的页只有在需要的时候才被调入

本质:

  • 在比内存大的逻辑地址空间中编程
  • 只调入需要的程序和数据
  • 通过硬件将逻辑地址转化为物理地址
  • 当发生页缺失的时候在内存和硬盘之间交换信息

一些问题

  • 页的大小: 4KB, 8Kb…
  • 映射函数: 关联映射
  • 类型:
    • 基于页的虚拟内存
    • 基于段的虚拟存储器
    • 基于段和页的虚拟内存
  • 写策略: 写回

基于页的虚拟内存

将主存和虚拟内存分成相同大小的页

  • 虚页(Virtual page)/逻辑页(Logical page): 虚拟内存中的页
  • 物理页(Physical page)/页框(page frame): 主存中的页

页表:

  • 包含着所有虚页的信息, 包括位置, 有效位, 脏位, 可读写位
  • 存储在主存中
  • 虚拟地址 $<-$ 虚页号 + 页内地址 (偏移量)

页表

快表 (TLB)

页表的使用增加了主存的访问

为了减少访问主存, 将最常用的页表项加载进 cache

TLB: 页表项被载入 cache

  • 全相联映射, 组关联映射
  • 随机替换策略

No. TLB page table cache possibility
1 hit \ valid ————- hit possible, in cache
2 hit \ invalid ————- hit impossible
3 hit \ invalid ————- miss impossible
4 hit \ valid ————- miss possible, in memory bu not in cache
5 miss valid hit possible, in cache
6 miss invalid hit impossible
7 miss valid miss possible, in memory bu not in cache
8 miss invalid miss possible, not in memory

ps: 快表中只有 valid 情况下才能算 hit

分析:

  • 最好: 1, 未访问内存
  • 好 4, 5 只访问一次内存
  • 坏 7 两次访问主存
  • 最坏 8 两次访问主存, 并访问硬盘

基于段的虚拟存储器

将程序和数据分成不同长度的段, 并将需要的段载入主存

虚拟地址: 段号 + 段内偏移量

与基于页的虚拟内存相比:

  • 基于页的虚拟内存
    • 优势: 简单, 成本低
      • 劣势:指令和数据可能跨页
  • 基于段的虚拟内存
    • 优势: 数据和程序自然划分
    • 劣势: 长度并非固定

基于段和页的虚拟内存

将程序和数据划分为段, 并进一步将段划分为页, 每一个段都有它自己页表

虚拟地址: 段号 + 页号 + 偏移量

优势: 程序在段中可以共享和保护

劣势: 需要多次查表

补充 PA 中的内存管理部分

实模式

8086的实模式

  • 寄存器长度:16 位
    • 访问内存需要结合段寄存器(segment register)进行
  • 地址线:20 根
  • 物理地址计算方式
    • physical address = (seg_reg<<4)+offset,offset 为 16 位的偏移量
    • 可寻址空间:$2^{20}$=1MB

分段机制

x86 的机器开机后首先进入实模式

  • 加载操作系统
  • 操作系统初始化段表
  • 拨动一个”开关”, 从实模式切换到保护模式

进入保护模式后

  • 程序给出 48 位逻辑地址(16位段选择符 + 32 位有效地址)
  • 使用段选择符来查段表
  • 进行段级地址转换得到线性地址

分段机制(地址转换)

80386 保护模式下的地址转换

  • 逻辑地址到线性地址的转换

    • 逻辑地址: 48 位, 又叫虚拟地址,其中

      段选择符: 16 位(sreg对应的段寄存器的内容)

      段内偏移量(有效地址): 32 位(vaddr给出的32位地址)