存储和设备¶
存储设备¶
永久设备的类型:
磁盘-硬盘、磁带、软盘
光学-CD/DVD/蓝光、激光光盘、纸张、打孔卡、照片胶片
固态-CMOS、基于NAND的闪存、电池支持的动态存储器
暂态设备的类型:
RAM、处理器缓存
IDE/ATA¶
由西部数据公司于1986年创建。已重新使用现有的磁盘接口。
由于将管理磁盘臂的责任转移到硬盘本身,因此大大改进了较旧的接口。这允许在磁盘和电机类型上有更大的变化,而不考虑主板支持。
连接器使用40个端号。
数据总线宽度为16位。
传输速率为16、33、66、100和133MB/S
向计算机呈现一组512字节的块。
ATAPI¶
通过添加额外的命令(如“弹出”)来支持其他设备,从而改进了ATA。
这些改进使CD、DVD和Zip驱动器符合ATA
还通过引入DMA来帮助提高性能。DMA允许将数据传输直接发送到物理内存,而不会中断每次总线操作的CPU
SATA-串行ATA¶
通过减少引脚数量来帮助降低成本。
允许热插拔或更换设备,而无需关闭主板电源。
支持完整的ATAPI命令界面
支持1.5G/S(1.0)、3G/S(2.0)、6G/S(3.0)的传输速率
托管SATA的主板通常实施AHCI控制器(由英特尔创建)。它支持热插拔功能和本地命令队列。未实现AHCI的主板通常将使用ATAPI命令集与SATA设备通信。
在Linux 2.6.20或更高版本、Windows Vista或7以及更新版本的OSX中最受SATA支持。即使使用AHCI控制器,较旧的操作系统通常也会恢复到ATAPI
硬盘结构-CHS¶
由柱面、磁头和扇区组成
扇区-光盘上的存储单位。通常为512、1024或2048字节。
圆柱体-一个物理的圆形圆盘。又名“拼盘”。设备中可能存在一个或多个。
头部-指圆柱体的顶面或底面。
磁盘上的CHS地址是{柱面、磁头、扇区}的元组
硬盘结构-CHS¶
![]()
图像¶
硬盘结构-LBA¶
可以使用以下公式将CHS元组转换为LBA地址: \($A = (C x Nh + H) * Ns + (S - 1)$\)
\($Nh$\) 是人头的总数
\($Ns$\) 是扇区的总数
存储和故障¶
这里有一篇关于谷歌硬盘故障率的优秀论文:
在Google,给定年限的磁盘故障率为:
3个月-2.5个月
6个月-2.0
1岁-2岁
2-8岁
3年期-8.5
最大限度地提高可用性-RAID¶
为了防止丢失数据的可用性,使用RAID(廉价磁盘冗余阵列)允许存储数据的冗余副本。
常见的RAID级别包括:
RAID 0-跨磁盘拆分数据。增加磁盘空间,不提供冗余。需要2个或更多磁盘。
RAID 1-在两个或多个磁盘上创建数据的精确副本。
RAID 5/6-跨磁盘拆分数据。使用一个或多个磁盘进行奇偶校验。这允许N个磁盘中的1-K出现故障,并允许恢复任何丢失的磁盘的数据。需要3个或更多磁盘。
RAID¶
RAID有三种常见的实施方法:
完整的硬件实施-磁盘控制器或扩展卡实施RAID。多个磁盘连接到此控制器,并将其作为单个存储设备呈现给操作系统。通常有可靠性保证。
部分硬件实施-除了奇偶校验计算和缓冲被委托给主机CPU和内存之外,与完整的硬件实施相同。通常不会有可靠性保证。
软件实施-操作系统本身管理多个磁盘,并向文件系统层呈现单个存储设备。
RAID-0¶
![]()
图像¶
RAID-1¶
![]()
图像¶
RAID-5¶
![]()
图像¶
RAID-5奇偶校验¶
size_t parityWrite(
int fd0, int fd1, int fd2,
const void *buf0, const void *buf1,
size_t count) {
for(size_t i = 0; i < count; i++) {
char byte0 = ((char*)buf0)[i];
char byte1 = ((char*)buf1)[i];
char parity = byte0 ^ byte1;
write(fd0, &byte0, sizeof(char));
write(fd1, &byte1, sizeof(char));
write(fd2, &parity, sizeof(char));
}
return count;
}
RAID-5奇偶校验¶
size_t parityRead(int fd0, int fd1, void *buf, size_t count) {
char *buff0 = (char*)malloc(count);
char *buff1 = (char*)malloc(count);
char *buff = (char*)buf;
read(fd0, buff0, count);
read(fd1, buff1, count);
for(size_t i = 0; i < count; i++) {
buff[i] = buff0[i] ^ buff1[i];
}
return count;
}
RAID-5奇偶校验¶
int main(int argc, char** argv) {
int fd0 = open("f0", O_CREAT|O_TRUNC|O_RDWR, 0666);
int fd1 = open("f1", O_CREAT|O_TRUNC|O_RDWR, 0666);
int fd2 = open("f2", O_CREAT|O_TRUNC|O_RDWR, 0666);
const char* msg0 = "hello world\n";
const char* msg1 = "testing 123\n";
parityWrite(fd0,fd1,fd2,msg0,msg1,strlen(msg0)+1);
close(fd0);
close(fd1);
close(fd2);
unlink("f1");
RAID-5奇偶校验¶
fd0 = open("f0", O_RDWR, 0666);
fd2 = open("f2", O_RDWR, 0666);
size_t msgSize = sizeof(char)*strlen(msg0)+1;
char *buff = (char*)malloc(msgSize);
parityRead(fd0, fd2, buff, msgSize);
printf("f1 contents are = %s\n", buff);
close(fd0);
close(fd2);
free(buff);
unlink("f0");
unlink("f2");
return 0;
}
RAID 5-奇偶校验和恢复¶
在上面的示例中,创建了三个文件:f0、f1和f2
向f0和f1中的每一个写入两个不同的消息。奇偶数据被写入f2。
故障场景:
删除f0-可以从f1恢复f0和f2的奇偶校验数据
删除f1-可以从f0和f2的奇偶校验数据恢复f1
删除了f2-可以通过重新计算f0和f1之间的奇偶校验来恢复f2
在每种情况下,丢失一个存储介质都不会导致数据丢失。
磁盘分区¶
操作系统将磁盘划分为多个分区(或片)。
分区是一个有用的概念,因为它们允许操作系统将磁盘的各个部分划分为不同类型的磁盘格式。其中包括文件系统实现,在某些情况下是交换分区,以及不受操作系统管理的文件系统(例如在双引导配置中)。
磁盘分区¶
在PC上,最常见的分区格式是MBR(主引导记录)方案。MBR方案允许将一个磁盘划分为最多四个分区。这些分区的偏移量和大小位于磁盘开头的MBR记录中。
为了提高对四个分区的限制,MBR模式允许将一个分区视为“扩展”分区,该分区可以进一步细分为多个“逻辑”分区。
磁盘臂/磁头¶
对于机械磁盘,有两个移动部件:
由步进电机驱动的头部。移动到盘片上的正确轨道
磁盘通过电机旋转磁头下方的盘片。
对于要从硬盘读取或写入硬盘的扇区,盘片必须旋转到正确的位置,磁头必须移动到正确的位置才能执行操作。
因此,对于给定的操作,有一个概念,即设备执行该操作必须“寻找”的物理距离。
磁盘操作的性能受以下因素的影响:
磁盘和磁头电机的速度
对一个或多个可能的磁盘操作进行排序的算法。
硬盘结构-CHS¶
![]()
图像¶
一种好的磁盘调度算法的特点¶
就像进程调度器一样,决策涉及避免饥饿以及处理延迟和吞吐量。
一个好算法的目标是:
如果同一磁道中存在另一个请求,则应避免移动磁头。
应尽量减少头部的整体移动。
应在任何给定时间最小化与头部当前位置和下一个请求的平均距离。
订购请求时,单个请求不应延迟太长时间。
磁盘调度算法¶
FIFO
最短寻道优先
电梯
FSCAN
FIFO¶
FIFO是最简单的磁盘调度算法
FIFO只是在请求到达时按顺序提供服务。
先进先出远非最优。它没有做出任何尝试来最小化对头的追求。
先进先出确实保证了公平。请求按照接收到的顺序进行响应。
最短寻道优先¶
Shorest Seek首先扫描请求队列,查找距离头部最近的请求,并首先为该请求提供服务。
该算法最小化了头部必须执行的总搜索
此算法可能会让请求处于饥饿状态。如果不断有新的请求以足够的速度进入磁头的当前位置附近,磁头将永远不会移动到足够靠近其他请求来服务它们。
最短寻道优先¶
![]()
图像¶
电梯算法¶
可视化磁盘调度算法的一个好方法是考虑如何使具有多个楼层的建筑中的电梯操作达到最佳。
为了保证每一层都有人参观,没有人永远等着,电梯算法的规则是电梯应该一直走到顶层,然后再反转方向回到底层。
这意味着算法有一个方向的概念。在给定请求列表的情况下,将被服务的请求是那些在当前轨道上的请求或那些在磁头移动方向上的请求(按顺序)。
一旦磁头到达最终磁道,方向就会反转,并重复该算法。
电梯算法¶
![]()
图像¶
电梯算法的评价¶
优点:
防止请求匮乏
缺点:
磁盘中间的扇区的平均服务速度更快,因为它们与磁头的平均距离最小。
电梯算法可以通过从最里面的轨道开始,寻找到最外面,然后返回到最里面来消除不平衡。这样,方向就不会改变。不幸的是,由于距离较远,这种特殊的搜索比其他搜索需要更多的时间。
FSCAN¶
FSCAN的工作原理是将现有的一组请求放入一个队列
在完成第一队列中的工作时接收的所有新请求被放入第二队列。
然后,FSCAN通过按顺序服务最接近头部的请求和距头部最远的请求来服务第一队列中的项
一旦第一队列为空,则来自第二队列的项被移动到第一队列,并且该算法重复
FSCAN保证不会出现饥饿,因为在提供任何给定的项目之前,最多只有N个项目需要提供的固定集合。