存储管理
存储管理
1. 存储介质
参考存储系统
- 按CPU访问存储介质的方式分类
- 主存储器
- 包括寄存器、高速缓存、内存
- 按字节寻址
- 二级存储器
- 磁盘/机械硬盘(HDD)
- 闪存/固态硬盘(SSD)
- 按块寻址
- 联机使用
- 三级存储器
- 磁带、光盘、网络存储
- 脱机使用
- 主存储器
- 按存储介质的易失性分类
- 易失性存储器
- 主存储器
- 非易失性存储器
- 二级存储器、三级存储器
- 持久性内存(非易失性内存,NVM)
- 易失性存储器
磁盘
- 组成
- 磁盘构件
- 扇区(sector)、磁道(track)、柱面(cylinder)
- 磁头构件
- 磁头(disk head)、磁臂(disk arm)
- 磁盘构件
- 磁盘块(页)
- 操作系统在格式化磁盘时将磁盘划分为许多大小相同的块
- 磁盘块(页)的大小是扇区的整数倍
- 通常是512B-16KB
- 一旦设置,不可以动态改变
- 磁盘控制器
- 寻道、旋转、传输、预取
固态硬盘(SSD)
- 使用NAND闪存作为存储介质
- 特点
- 随机读写速度高于磁盘、功耗低于磁盘
- 先擦除,后写入
- 写放大、寿命低
2. 面向磁盘的数据库存储
- 设计目标
- 如何存储
- 何时读写
文件存储
- 将每一个数据库存储为一个或多个文件
- 每个文件包含多个页
- 数据库文件的页中可以存储元组、元数据、索引、日志记录等
- 每个页拥有唯一的编号:页号
面向行的存储
(1)元组的表示
- 元组表示为字节序列
- 元组头
- 记录元组的元数据,包括元组的长度、最后修改的时间、可见性等等
- 元组数据
- 由元组的所有属性值拼接而成
- 元组头
(2)页布局
页头
- 记录页的元数据
- 页的大小
- 页的校验和
- DBMS的版本
- 页的可见性(与并发控制相关)
- 页中数据的数据压缩方法
页数据
- a. 面向元组的组织方法
- b. 日志结构的组织方法
(3)文件组织
- a. 堆文件组织
- b. 顺序/有序文件组织
- 元组按排序键的顺序存储(一般按照主键排序)
- c. 哈希文件组织
- DBMS使用一个哈希函数
- DBMS根据元组键的哈希值来确定元组存储在哈希文件的哪个页
面向列的存储
- 将关系的每个属性单独存储
3. 缓冲区管理
CPU无法直接读/写磁盘中的数据,必须先将文件中的页从磁盘读入内存(缓冲区);
数据库文件的大小经常超过DBMS的可用内存容量;
- 缓冲区管理器负责在磁盘和内存之间复制文件页
(1)缓冲池
(2)缓冲池的设计
- 页表(page table)
- 页框的元数据
- DBMS用两个变量记录缓冲池中每个页框的状态
- $pin\_count$:页框中的页当前被请求但未被释放的次数,即引用次数
- $dirty$:自从页框中的页被读入缓冲池后,该页是否被修改过
- DBMS用两个变量记录缓冲池中每个页框的状态
(3)缓冲区管理器的功能
- a. 请求页
- b. 释放页
- 将包含该页的页框的$pin\_count-1$
- c. 修改页
- 将被修改的页所在的页框的$dirty$值置为真
(4)页替换策略
- 最近最少使用策略(LRU)
- 运行时协议
- 用一个时间戳记录缓冲池中每个页框的最后访问时间
- 为了提高效率,可将缓冲池中$pin\_count=0$的页框按时间戳排序
- 页替换协议
- 替换$pin\_count=0$且时间戳最旧的页框中的页
- 运行时协议
- 时钟替换策略(Clock)
- 运行时协议
- 将缓冲池中所有页框组织成一个环形缓冲区(表盘)
- 为每个页框设置一个引用位
- 初始时,将所有页框的所有引用位都置为0
- 当一个页被读入一个页框时,将该页框的引用位置为1
- 当一个页框中的页被访问时,将该页框的引用位置为1
- 页替换协议
- 用一根旋转的表针搜索首个$pin\_count=0$且引用位为0的页框,替换该页框中的页
- 如果表针扫过页框的引用位为1,则将其引用位置为0
- 运行时协议
- 先进先出策略(FIFO)
- 最近最多使用策略(MRU)
This post is licensed under CC BY 4.0 by the author.