分层存储体系(memory hierarchy):高速缓存(cache)、内存、磁盘。
操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。
1.无存储器抽象
最简单的存储抽象就是根本没有抽象。存储器的模型是简单的物理内存。
在这种情况下,程序被读入到内存中,产生的数据在内存中是如何工作的???
在不使用存储器抽象的情况下运行多个程序:
使用静态重定位技术避免绝对物理地址的碰撞。
2. 一种抽象存储地址空间
物理地址暴露带来的问题:
- 用户程序容易破坏操作系统
- 同时运行多个程序是困难的
2.1 地址空间的概念
地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间
动态重定位简单的把每个进程的地址空间映射到物理内存的不同部分。
给每个CPU配置两个特殊硬件寄存器,通常叫作基址寄存器和界限寄存器。
当一个进程运行是,程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中。
缺点: 每次内存访问都需要进行加法和比较运算。
2.2 交换技术
处理内存超载的通用策略:交换技术和虚拟内存
交换技术: 把一个进程完整调入内存,使该进程运行一段时间,然后把它存回磁盘。
内存分配策略
如果预留空间用完了,进程必须移动到足够大的空闲区中(它可以被交换出内存直到内存有足够的空间),或者结束该进程。
2.3 空闲内存管理
- 使用位图的存储管理
特点:分配单元越小,位图越大。
缺点:查找位图中指定长度的连续0串是耗时的操作(因为在位图中该串可能跨越字的边界)
2.使用链表的存储管理
维护一个记录已分配内存段和空闲内存段的链表
按照地址顺序在链表中存放进程和空闲区域时,有几种算法可以用来为创建的进程分配内存:
- 首次适配算法
- 下次适配算法
- 最佳适配算法 最佳适配算法要搜索整个链表,所以它比首次适配算法慢。产生大量无用的小空闲浪费更多的内存
- 最差适配算法 仿真程序表明最差适配算法不是一个好主意
为空闲区和进程维护各自独立的链表,这四个算法的速度都能得到提高。
快速适配算法 为那些常用大小的空闲区维护单独的链表。
3. 虚拟内存
使程序只有一部分被调入内存的情况下运行。
把程序分割成许多片段,称为覆盖。
虚拟内存的基本思想: 每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或页面。虚拟内存使得整个地址空间可以用相对较小的单元映射到物理内存,而不是为正文段和数据段分别进行重定位。
3.1 分页
虚拟地址按照固定大小划分成被称为页面(page)的若干单元。在物理内存中对应的单元称为页框(page frame)。
MMU 的内部结构
如果在不在位是1,则将在页表中查到的页框号复制到寄存器的高3位,再加上输入虚拟地址中的低12位偏移量。如此就构成了15位的物理地址。输出寄存器的内容随即被作为物理地址送到内存总线。
3.2页表
虚拟地址到物理地址的概括: 虚拟地址被分成虚拟页号和偏移量两部分。
页表项的结构
在写入一页时由硬件自动设置修改位。
不论是读还是写,系统都会在该页面被访问是设置访问位。
虚拟内存的实现,是将虚拟地址空间分解成页,并将每一页映射到物理内存的某个页框或者(暂时)解除映射。
页表存在何处???
3.3 加速分页过程
分页系统中的主要问题:
- 虚拟地址到物理地址的映射必须非常快。
- 如果虚拟地址空间很大,页表也会很大。
每个进程都需要有自己的页表(因为它有自己的虚拟地址空间)。
方式一: 由“快速硬件寄存器”阵列组成的单一页表,每一个表项对应一个虚拟页面。当启动一个进程时,操作系统吧保存在内存中的进程页表的副本载入到寄存器中。
优点: 简单并且在映射过程中不需要在访问内存。
缺点: 页表很大时代价昂贵。每次上下文切换都必须装载整个页表,这样会降低性能。
方式二: 整个页表都在内存中
优点: 在上线文切换时,进行“虚拟地址到物理地址”的映射只需要重新装入一个寄存器。
缺点: 在执行每条指令时,都需要一次或多次内存访问来完成页表项的读入,速度非常慢。
1. 转换检测缓冲区(Translation LookAside Buffer, TLB)。
现象: 只有很少的表现会被反复读取,而其他的表项很少被访问。
为计算机设置一个小型的硬件设备,将虚拟地址直接映射到物理地址,而不必在访问页表。这种设备称为转换检测缓冲区,相联存储器,块表。
TBL 就是在MMU中缓存少量页表项的小型硬件设备
2. 软件TLB管理
软失效: 当一个页面访问在内存中而不再TLB中时, 将产生软失效,此时只要更新MMU中的TLB
硬失效: 当页面不在内存中,也不在TLB中时将产生硬失效。
优点: TLB大到(如64个表项)可以减少失效率时,TLB的软件管理就会变的足够有效。获得一个非常简单的MMU,这就在CPU芯片上为高速缓存以及其他改善性能的设计腾出了相当大的空间。
3.4 针对大内存的页表
1.多级页表
引入多级页表的原因是避免把全部页表一直保存在内存中。