磁盘构成
磁道:一个个同心圆。
柱面:相同大小的磁道。
扇区:字面意思,但不同于图中是等分的。
磁盘工作原理
处理器经由数据总线与主存和磁盘控制器(小处理器)进行通信。
磁盘通过磁盘控制器进行读写,可以在主存中缓存一部分扇区避免磁头额外读。
磁盘控制器读写过程
- 磁盘控制器寻找磁道所在柱面。
- 磁盘控制器寻找磁道的第一扇区。
- 磁头划过扇区以及其间隙进行读取。(总时长一般为10ms)
提高磁盘吞吐量
吞吐量:每秒磁盘访问次数。
- 把要一起访问的块放在同一柱面:磁头的第一次移动+第一扇区寻找的时间约等于一次磁盘读写的时间。(比起操纵主存数据要快得多)
- 将一个大磁盘的数据存到多个小磁盘。(多磁盘多磁头)
- 将数据副本存到多个磁盘。(物理镜像)
- 磁盘调度算法。(独立的进程对于块的读写顺序可以调节)
- 预先将待访问块放进主存。
定长记录在磁盘中的存储
为了内存的读写效率,记录的大小往往是4或者8的倍数。
如下图的MovieStar:
一条MovieStar关系的记录由:
指向模式的指针:4字节;
记录长度:4字节;
时间戳:4字节;
name:30字节->32字节;
address:256字节;
gender:1字节->4字节;
birthdate:10字节->12字节;
一共316字节构成。
我们假设一块为4KB,该块只保存MovieStar关系的元组,块首部为12字节,一共可以保存12条关系,剩下的292字节是被浪费的。关系的元组被存放在磁盘中,当需要对某条记录读写,整个块都要被加载到内存之中。
数据库地址
在经典的CS架构中,将服务器当做二级存储器,客户端进程作为主存(暂时忽略虚拟地址的映射)。
那么服务器的数据处于数据库地址空间,其中用于表示地址的有:物理地址与逻辑地址。
物理地址:表示块或者记录在数据库地址空间中的位置,一个字符串。它保存了块或者记录对应的磁盘,柱面,磁道等等信息。
逻辑地址:每个块或者记录都有的一个定长字符串,通过映射表与物理地址对应,其作用为方便块的组织以及更新操作。
指针混用
数据项的地址有两种表现形式:数据库地址或者内存地址。
当数据项在二级存储器时,只能使用数据库地址;
当数据项在内存时,两者皆可用,但优先用内存地址。这是因为数据库地址需要先通过虚拟内存映射成内存地址,这个过程是很耗时的。
为了避免将数据项多次移动到内存中产生的数据库地址->内存地址的重复转换,在将数据项从二级存储器加载到内存时,可以把数据库地址空间转为虚拟地址空间。
需要注意的是,当数据项从主存中返回二级存储器,其混写必须被取消,内存地址->数据库地址。
举个例子:
块1存了两个记录,块2存了一个记录。
现将块1放到主存中,块1的两个记录都混写成内存地址,可以发现块1的记录1指向了块1记录2的内存地址。
而块2由于还在二级存储器中,无法混写,因此块1还是指向了它的数据库地址。
可变长度记录在磁盘的存储
如下:我们将name和address改为可变长度的字段。
那么从记录长度会有多个指针指向除了第一个以外的所有可变长度属性的首地址。(很显然第一个可变长度属性就在最后一个固定长度属性的后面)
跨块存储
用于单个记录过大,也有可能为单块存储多个记录。
前者可以将单个记录存在多个磁盘的磁块中,通过多磁头加快读取速度。
后者需要给记录添加额外的信息:
是单个记录还是片段;
是否是第一个片段否则最后一个片段;
若是中间的片段,提供连接前后的指针。
举个例子:
3个记录存在块1和块2中,可以看到记录2通过指针相连。