计算机组织结构(十) 内存管理
过去, 只有操作系统和一个程序在内存中.
现在, 操作系统和多个程序都在内存中. 程序等待 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位地址)