文件是操作系统为磁盘提供的抽象。



磁盘原理

磁盘就是形状像盘子的磁性存储介质。


磁盘的结构:


磁盘由多个盘片组成,每个盘片有两个盘面,正反两面都可以存放数据。


每个盘面一个读写磁头,所有读写磁头连在一根共享的磁臂上。


盘面的结构:


每个盘面分为磁道和扇区。


磁道是一个个同心环。


磁道又分为扇区。


数据以扇区为单位进行存储。


数据访问时间=寻道时间+旋转时间+传输时间


寻道时间:磁头转到要求的磁道的平均时间。


旋转时间:磁头到达磁道后,扇区旋转到磁头下面的时间。


传输时间:读、写盘面上的数据的时间。


这三个时间里,最慢的是寻道时间,这又和磁盘调度算法有关:


先来先服务


短任务优先


短寻道优先


电梯调度


单向电梯调度


操作系统访问磁盘的界面:


操作系统将磁盘驱动器里的各种细节屏蔽。


操作系统按磁盘块进行访问,磁盘块通常为扇区的整数倍。


操作系统使用逻辑块地址访问磁盘:设备号+盘面号+磁道号+扇区号+盘面个数


磁盘控制器将这些参数转换为一系列底层磁盘操作。


固态盘:


将机械运动从磁盘中去除。


使用与内存相同或相仿的存储介质。



文件系统


从用户角度看文件系统


根据磁盘原理可知,直接使用磁盘是非常困难的。


这就需要操作系统这个魔术师了,操作系统为磁盘提供一个抽象,就是文件系统。


用户访问文件,不需要知道文件内容存放在哪,如何存放以及磁盘如何工作。只需给出文件路径即可,无需知道磁道、扇区等信息。


操作系统将文件名翻译成磁盘位置。


文件系统专注于数据存储功能,不管数据的语义。对文件系统来说,数据都是01比特流,而数据的意义由用户或应用程序去理解。


文件系统内的文件分三类:


目录:记录文件的文件,保存其它文件的信息,包括其它文件存储在那些磁盘块。


普通文件:保存数据。


块文件:是对输入输出设备的抽象,通过块文件可以直接访问输入输出设备(磁盘本身也是输入输出设备)。


文件访问类型:


顺序访问:必须从文件头开始访问


随机访问:可以从文件任意位置开始访问(现代操作系统都是随机访问)


内存映射文件:


解决读写文件慢的问题(因为访问的是磁盘)


把文件映射到进程的虚拟地址内,访问虚拟地址就相当于访问文件。把磁盘访问变成内存访问。



文件系统原理


从操作系统设计人员看待文件系统。


模板:就是要把文件的内容存在合适的位置,在需要的时候能够读出来。


数据在磁盘上的存放方式:


连续


非连续


连续存放:


读写效率高,减少磁盘寻道、旋转次数。


文件到磁盘的映射变成,文件到在磁盘上的第一个数据块的映射。


缺点:造成碎片、文件大小不易扩展。


非连续存放:


需要记录文件的所有磁盘块位置。


链表:文件的每个数据块包含一个指针,指向下一个数据块。问题:每个数据库里存的内容大小不再是2的幂次,效率低。


文件分配表(FAT):准备一张包含所有磁盘块的表,表项记录当前磁盘块的下一个磁盘块位置。下一磁盘块位置为-1,表示文件尾。缺点:文件分配表占用大量空间,没有被文件占用的磁盘,也要有空白表项。


索引文件:为每个文件分配一个索引表,记录该文件占用的所有磁盘块的位置。不用为整个磁盘都分配表,没有文件占用的磁盘块,就不占用表项。


空闲空间管理:


管理磁盘上的空闲空间。


和内存管理一样,两方法:位图、链表。


文件访问控制:


访问控制表:每个文件一张表,记录对该文件具有权限的用户拥有什么权限。不在表上的用户无权限。


能力表:每个用户一张表,记录用户有哪些文件的权限。删除文件困难。


可使用保护域减少表的大小。将访问权限相同的文件和对象组成一个域。


文件可靠性:


备份:保证文件持久存在。


日志:保证不因为意外情况,导致对文件的操作只进行一半,产生不正确的状态。(比如删除了文件数据,没删除目录里的文件iNode)。将文件操作都写到日志后再执行,发生异常后。如果日志内容不完整,则回到文件操作前的状态。如果日志内容完整,则根据日志完成所有文件操作。