磁盘相关
来自计组
磁盘存储器的组成
- 磁盘驱动器:磁头和盘片。温彻斯特盘是一种可移动磁头固定盘片的磁盘。
- 磁盘控制器:与主机的接口。主流标准有IDE、SCSI、SATA等。
存储区域
- 磁头数:一个记录面对应一个磁头
- 柱面数:盘面上有多少磁道,不同记录面的相同编号的磁道构成一个柱面
- 扇区数:磁道上有多少扇区
磁盘属于机械性部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能同一时刻读两组数据或写两组数据。
磁盘结构
磁盘的最小读写单位为一个扇区,按块存取。
磁盘的物理地址 —— (驱动器号,柱面或磁道号,盘面号,扇区号)
其余的磁盘性能指标:
- 记录密度
- 盘片上单位面积上记录的二进制信息量,有道密度、位密度、面密度。道密度是沿磁盘半径方向单位长度上的磁道数。位密度是磁道单位长度上记录的二进制代码位数。面密度是位密度和道密度的乘积。
- 磁盘容量
- 分为格式化容量和非格式化容量。非格式化容量是指磁记录表面可利用的磁化单元总数,由道密度和位密度计算得来。格式化容量是指按照某种特定的记录格式所能存储的信息总量。格式化后的容量比非格式化容量要小。
- 数据传输率
- 单位时间传输的字节数。Dr=rN (r为转速 N为每个磁道上的字节数)
磁盘调度算法
减少磁盘延迟的方法
磁盘管理
磁盘阵列
RAID(独立冗余磁盘阵列)是指多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
RAID有以下分级方案:
- RAID0:无冗余和无校验的磁盘阵列
- RAID1:镜像磁盘阵列——使用两个磁盘同时进行读和写,互为备份。
- RAID2:采用海明码纠错的磁盘阵列
- RAID3:位交叉奇偶校验的磁盘阵列
- RAID4:块交叉奇偶校验的磁盘阵列
- RAID5:无独立校验的奇偶校验磁盘阵列
RAID1~RAID5中,无论何时有磁盘损坏,都可以随时拔出受损的磁盘再插入好的磁盘,数据不会损坏。
RAID,通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取,提高了吞吐量;通过镜像功能,提高了可靠性;通过数据校验,提供了容错能力;
SSD固态硬盘
SSD基于闪存技术,与U盘并无本质上的差别。一个SSD由一个或多个闪存芯片和闪存翻译层组成。
闪存芯片 = 磁盘驱动器
闪存翻译层 = 磁盘控制器
SSD由许多块组成,每块由许多页组成,以页为单位读写。
如果要往某页内写入数据,只有将这一页所属的块整个擦除后,才能写入(其他页再写一次,和刷新一样)。每个块重复写10万次后,就磨损掉了。
SSD的随机写很慢,有两个原因:
- 擦除块很慢 1ms 级,比访问页高一个数量级
- 写一个页,需要把该页所在块的所有数据复制到一个新的被擦除的新块里,才能写入
SSD 优点:
- 抗震好、能耗低、安全性好
- 读写、随机访问比机械磁盘快很多
SSD 缺点:
- 容易磨损(不过可以通过平均磨损最大化每个块的寿命,很多年SSD才会磨损坏)
文件与文件目录
文件是以硬盘为载体的存储在计算机上的信息集合,形式多样。
文件的属性:
- 名称:唯一
- 类型
- 创建者
- 所有者
- 位置
- 大小
- 保护
- 时间(创建时间、最后一次修改时间、最后一次存取时间)
文件的属性维护在文件控制块里。
文件的基本操作:
- 创建文件 create:1.分配必要的外存空间;2.在目录中为之创建一个目录项(FCB)
- 写文件 write:对于给定文件名,搜索目录找到文件。系统为其维护一个写指针,写操作就是在更新写指针。
- 读文件 read:对于给定文件名,搜索目录找到文件。系统为其维护一个读指针,读操作就是在更新读指针。读和写可以使用同一个指针。
- 文件定位:将当前文件位置指针重定位到给定值,不涉及读和写。
- 删除文件 delete:对于给定文件名,搜索目录找到文件。释放文件所占内存空间,并删除FCB。
- 截断文件:允许文件属性不变,仅删除文件内容,将其长度置位0并释放其空间。
文件的打开与关闭 open / close
最初对文件的操作都需要从搜索目录开始,所以为了避免多次重复地检索目录,文件操作之前都需要显式地通过open打开。
系统维护一个总的打开文件表,包含所有的打开文件的属性(FCB/索引结点)。
各进程维护一个自己的打开文件表,记录着进程对文件的操作信息。
当第一个进程open文件时,系统打开文件表包含相应文件属性(FCB/索引结点),该进程以及后来打开该文件的进程都只是在各自的打开文件表中增加一个条目,指向系统打开文件表的结点。系统为该结点维护一个打开计数器(open count),到0时才可删除。
结点中包括:
- 文件指针: 系统跟踪上次的读写指针
- 打开计数
- 磁盘位置
- 访问权限
FCB = 文件目录项
FCB的有序集合 = 文件目录
用户要访问某个文件时,使用相对路径标识文件。
每个用户都有各自的“当前目录”,登录后自动进入“当前目录”
目录的基本操作:
- 搜索
- 创建文件
- 删除文件
- 创建目录
- 删除目录:有两种方式——1.不删除非空目录:删除时先删除目录中的文件,再递归地删除子目录;2.可删除非空目录:目录中的文件和子目录同时被删除。
- 移动目录
- 显示目录
- 修改目录
目录实现:
- 线性列表
采用文件名和数据块指针的线性列表。
新建文件时,搜索有无同名文件,然后在目录中增加一个新的目录项(FCB)。
删除文件时,根据文件名搜索到FCB,然后释放其空间。如果要重用目录项还可以:1.将目录项标记为不再使用;2.将其加到空闲目录项的表上。采用链式结构可以减少删除文件的时间。
- 哈希表
根据文件名进行哈希函数并返回一个指向线性列表中元素的指针。查找十分迅速,插入和删除也简单。需要一些额外措施避免哈希冲突。
目录查询是通过在磁盘上反复搜索完成的,I/O开销很大,所以可以将当前使用的文件目录复制到内存进行操作,可以降低磁盘I/O次数。
索引结点
UNIX中的索引节点叫做inode
文件保护
文件共享
硬链接
将共享文件或子目录链接到多个用户的目录中。
文件属性等信息不再放在目录项中,而是放在索引结点中。索引结点中还要有一个链接计数count,用于表示链接到本索引结点(文件)上的用户目录项的数目。
用户删除时,只是删除自己的目录项,共享文件的链接计数count-1。
软链接(符号链接)
要使用共享文件,在用户的目录中创建一个LINK类型的文件,该文件中只包含共享文件的路径名(不包含指向其索引结点的指针)。
用户访问该LINK文件时,会根据路径去访问共享文件(可能多次访存),LINK文件也会额外占用空间(索引结点)。
用户删除LINK文件,共享文件不受影响。
共享文件被删除,LINK文件会访问失败。
硬链接和软链接都是静态共享。
动态共享:多个进程同时对同一个文件进行操作。
文件的逻辑结构
对记录进行批量操作是效率最高的。
对于顺序存储设备(如磁带),只有顺序文件才能存储并有效工作。
在经常需要查找、修改、增加或者删除单个记录的场合,顺序文件的性能比较差。
补充 : 哈希文件 (直接文件)HashFile
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。
这种结构不同于顺序文件和索引文件,没有顺序的特性。
散列文件有很高的存取速度,但是会有哈希冲突,即不同关键字的散列函数值相同。
文件的物理结构
顶级索引表 :一级索引表 2次读磁盘
一级间接索引(单层索引表):二级索引表 3次
二级间接索引(两层索引表):三级索引表 4次
文件逻辑结构 VS 物理结构
单个文件的逻辑结构与物理结构之间有什么制约关系?
无明显关系。不过如果物理结构与逻辑结构不搭,就很难体现出逻辑结构的特点(物理结构倒是不受影响,反正它看到的也是一串二进制数据)。例如,一个逻辑结构是顺序文件的文件,其物理结构是隐式链接分配方式,则即使该顺序文件里的记录是定长的(理论上可以随机存取),但实际在存取时还是要一块块顺着链接找。
文件存储空间管理
空闲盘块链
空闲盘区链
文件系统的层次结构
创建新的文件时,应用程序调用逻辑文件系统。逻辑文件系统知道目录结构的格式,它为新文件分配一个FCB。然后系统将目录读入内存,使用新的文件名和FCB进行更新,并将其写回磁盘。
打开文件时,open将文件名传给逻辑文件系统。首先搜索整个系统的打开文件表,看是否已被其他进程打开。若未被打开,搜索目录结构。(部分目录结构通常缓存在内存中,以加快内存操作)。open返回一个指向单个进程的打开文件表中对应条目的指针(文件描述符/文件句柄)。
当进程关闭一个文件时,就会删除该进程打开文件表中相应的条目,整个系统的打开文件表打开的数量也会递减。当所有进程都关闭该文件后,任何更新的元数据都会写回到磁盘的目录结构中,整个系统的打开文件表也会删除相应条目。
虚拟文件系统
虚拟文件系统(VFS)为用户程序提供了文件系统操作的统一接口,屏蔽了不同文件系统的差异与操作细节。
以Linux中调用write()为例,它在VFS中通过调用sys_write()函数处理,sys_write()找到具体文件系统,将控制权交给该文件系统,最后由具体文件系统与物理介质进行交互。
Linux抽象除了4种对象类型:
- 超级块对象:表示一个已安装(或称挂载)的特定文件系统
对应磁盘上特定扇区的文件系统超级块,用于存储已安装文件系统的元信息。元信息中包括文件系统的基本属性信息,如文件系统类型、文件系统基本块大小、文件系统所挂载的设备、操作方法(函数)指针等。其中操作方法指针指向该超级块的操作方法表,包含一系列可在超级块对象上调用的方法函数。
- 索引结点对象:表示一个特定的文件
只有当文件被访问时,才在内存中创建索引结点对象,每个索引结点对象都会复制磁盘索引结点包含的一些数据。
该对象中有一个状态字段表示是否被修改。除此之外还提供了许多方法接口,如创建新索引结点、创建硬链接、创建新目录等。
- 目录项对象:表示一个特定的目录项
由于VFS经常执行切换到某个目录这种操作,所以为了提高效率,便引入了目录项的概念。
目录项对象是一个路径的组成部分,它要么是目录名,要么是文件名。
目录项对象包含指向关联索引结点的指针,还包含指向父目录和子目录的指针。
目录项对象在磁盘上没有对应的数据结构,而是在VFS遍历路径的过程中,将它们逐个解析成目录项对象的。
- 文件对象:表示一个与进程有关的已打开文件
文件对象与物理文件的关系类似进程和程序的关系。同一物理文件可能对应多个文件对象,但是对应的索引结点和目录项是唯一的。
包含指向索引结点和目录项的指针,还包含该文件的文件系统,物理文件指针等。提供在该文件对象上调用的一系列方法函数。
VFS将最近常使用的目录项对象放在目录项高速缓存中,加速从文件路径到最后一个路径分量的索引结点的转换过程,提高文件系统性能。
严格来说,VFS并不是一个文件系统,因为它只存在于内存之中,不存于任何外存空间中。VFS在系统启动时建立,在系统关闭时销毁。
文件系统在内存中的结构
内存中的信息用于管理文件系统并通过缓存来提高性能。这些数据在安装文件系统时被加载、在文件系统操作时更新、在卸载时被丢弃。
可能包括:
- 内存中的安装表(mount table):包含每个已经安装的文件系统的信息
- 内存中的目录结构的缓存包含最近访问目录的信息。对安装分区的目录,它可以包括一个指向分区表的指针。
- 整个系统的打开文件表
- 每个进程的打开文件表
文件系统的分区与安装
分区
- 主引导记录(MBR)
位于磁盘0号扇区,用来引导计算机。MBR后面是分区表,该表给出每个分区的起始地址和结束地址,表中的一个分区被标记为活动分区。当计算机启动时,BIOS读入MBR并执行,MBR扫描分区表并确定活动分区,将活动分区的引导块读入内存。
- 引导块(boot block)
引导块负责启动该分区的操作系统。为统一起见,无论分区内是否有操作系统,分区都从引导块开始。除了引导块开始,分区内其他的布局随着文件系统的不同而变化,不一定是上图所示的布局。
- 超级块(super block)
包含文件系统的关键信息。该文件系统被首次使用时,超级块会被读入内存。关键信息主要包括:分区内块的数量、块大小、空闲块数量和指针、空闲FCB数量和指针等
- 空闲空间管理区
可以用位示图或指针链接的形式给出。
- i结点
索引结点区,每个文件对应一个索引结点,索引结点中包含多个指针,指向属于该文件的各个数据块(文件的物理结构)。
由上图可以看出来,磁盘可以划分为多个分区,每个分区都可以用于创建单独的文件系统,每个分区还可以包含不同的操作系统、
分区可以是原始的,即不创建文件系统,使用原始磁盘。如Unix的swap分区。
安装
如文件在使用之前必须打开一样,文件系统在进程使用前必须先安装,也称挂载。
Windows系统维护一个扩展的二级目录结构,用驱动器字母表示设备和卷。
卷具有常规树结构的目录,与驱动器号相关联,还含有指向已安装文件系统的指针。
文件路径形式 driver-letter:\path\to\file
操作系统找到已安装的相应文件系统的指针,遍历其目录结构来查找文件。
新版本Windows允许文件系统安装在目录树下的任意位置,就像Unix一样。在启动时,Windows自动发现所有设备,安装所有找到的文件系统。
Unix使用系统的根文件系统,由内核在引导阶段直接安装。其他文件系统要么由脚本安装,要么由用户安装在已安装文件系统的目录下。
在根目录系统的目录树中,每个文件系统都拥有自己的根目录(称为安装点,mount point),进入该目录就可以读取该分区的数据。
已安装文件系统属于安装点目录的一个子文件系统。安装的实现是在目录inode的内存副本中加上一个标志,表示该目录是安装点。
根文件系统还包含一个指向安装表的指针,表示哪个设备安装在哪里,这个条目还包括该设备的文件系统超级块的一个指针。