文件是操作系统为磁盘提供的抽象。
磁盘原理
磁盘就是形状像盘子的磁性存储介质。
磁盘的结构:
磁盘由多个盘片组成,每个盘片有两个盘面,正反两面都可以存放数据。
每个盘面一个读写磁头,所有读写磁头连在一根共享的磁臂上。
盘面的结构:
每个盘面分为磁道和扇区。
磁道是一个个同心环。
磁道又分为扇区。
数据以扇区为单位进行存储。
数据访问时间=寻道时间+旋转时间+传输时间
寻道时间:磁头转到要求的磁道的平均时间。
旋转时间:磁头到达磁道后,扇区旋转到磁头下面的时间。
传输时间:读、写盘面上的数据的时间。
这三个时间里,最慢的是寻道时间,这又和磁盘调度算法有关:
先来先服务
短任务优先
短寻道优先
电梯调度
单向电梯调度
操作系统访问磁盘的界面:
操作系统将磁盘驱动器里的各种细节屏蔽。
操作系统按磁盘块进行访问,磁盘块通常为扇区的整数倍。
操作系统使用逻辑块地址访问磁盘:设备号+盘面号+磁道号+扇区号+盘面个数
磁盘控制器将这些参数转换为一系列底层磁盘操作。
固态盘:
将机械运动从磁盘中去除。
使用与内存相同或相仿的存储介质。
文件系统
从用户角度看文件系统
根据磁盘原理可知,直接使用磁盘是非常困难的。
这就需要操作系统这个魔术师了,操作系统为磁盘提供一个抽象,就是文件系统。
用户访问文件,不需要知道文件内容存放在哪,如何存放以及磁盘如何工作。只需给出文件路径即可,无需知道磁道、扇区等信息。
操作系统将文件名翻译成磁盘位置。
文件系统专注于数据存储功能,不管数据的语义。对文件系统来说,数据都是01比特流,而数据的意义由用户或应用程序去理解。
文件系统内的文件分三类:
目录:记录文件的文件,保存其它文件的信息,包括其它文件存储在那些磁盘块。
普通文件:保存数据。
块文件:是对输入输出设备的抽象,通过块文件可以直接访问输入输出设备(磁盘本身也是输入输出设备)。
文件访问类型:
顺序访问:必须从文件头开始访问
随机访问:可以从文件任意位置开始访问(现代操作系统都是随机访问)
内存映射文件:
解决读写文件慢的问题(因为访问的是磁盘)
把文件映射到进程的虚拟地址内,访问虚拟地址就相当于访问文件。把磁盘访问变成内存访问。
文件系统原理
从操作系统设计人员看待文件系统。
模板:就是要把文件的内容存在合适的位置,在需要的时候能够读出来。
数据在磁盘上的存放方式:
连续
非连续
连续存放:
读写效率高,减少磁盘寻道、旋转次数。
文件到磁盘的映射变成,文件到在磁盘上的第一个数据块的映射。
缺点:造成碎片、文件大小不易扩展。
非连续存放:
需要记录文件的所有磁盘块位置。
链表:文件的每个数据块包含一个指针,指向下一个数据块。问题:每个数据库里存的内容大小不再是2的幂次,效率低。
文件分配表(FAT):准备一张包含所有磁盘块的表,表项记录当前磁盘块的下一个磁盘块位置。下一磁盘块位置为-1,表示文件尾。缺点:文件分配表占用大量空间,没有被文件占用的磁盘,也要有空白表项。
索引文件:为每个文件分配一个索引表,记录该文件占用的所有磁盘块的位置。不用为整个磁盘都分配表,没有文件占用的磁盘块,就不占用表项。
空闲空间管理:
管理磁盘上的空闲空间。
和内存管理一样,两方法:位图、链表。
文件访问控制:
访问控制表:每个文件一张表,记录对该文件具有权限的用户拥有什么权限。不在表上的用户无权限。
能力表:每个用户一张表,记录用户有哪些文件的权限。删除文件困难。
可使用保护域减少表的大小。将访问权限相同的文件和对象组成一个域。
文件可靠性:
备份:保证文件持久存在。
日志:保证不因为意外情况,导致对文件的操作只进行一半,产生不正确的状态。(比如删除了文件数据,没删除目录里的文件iNode)。将文件操作都写到日志后再执行,发生异常后。如果日志内容不完整,则回到文件操作前的状态。如果日志内容完整,则根据日志完成所有文件操作。