标签:
从用户角度来考察文件。用户如何使用文件,文件有那些特性。
文件一种抽象机制,提供了一种在磁盘上保留信息而且以后方便读取的方法。
有的文件系统区分大小写,有的则不区分
Unix是前者,MS-DOS是后者FAT-16,FAT-32,NTFS。
FAT-16(File Allocation Table,文件配置表) : Windows 95FAT-32 : Windows 98NTFS(New Technology File System,新技术文件系统):之后所有Win系列的文件系统文件可以有很多构造方式,列出常用的三种方式。

字节序列
Unix和Winodws都是用这种方式。记录序列
记录为单位80列的穿孔卡片还是主流的时候。
80个字符 = 一个记录。现在已经没有这种方式了。
树
map,key-value对,并利用平衡树来维护key值。 key值。普通文件(regulr file):包含用户的信息
ASCII文件
由多行正文组成
Unix系统每行以换行符(/n)结束。Win系统采用回车符(/r)和换行符(/n)。优势
二进制文件 目录(directory):管理文件系统结构的系统文件。
顺序存取(sequential access)
adsadasdsaxdas中第7位,必须从头开始找到第7位。磁带的工作方式。现在已被淘汰。随机存取文件(random access file)
read操作中给出开始读文件的位置。文件位置。利用seek设置。与文件相关的信息,如创建日期,大小等。这些信息称为文件属性(attribute),有些人称之为元数据(metadata)。

creatdeleteopen
close
read
writeappendseekget attributesset attributesrename完成了copyfile abc xyz的操作

目录本身也是文件。
目录系统最简单形式就是一个目录包含所有的文件。


绝对路径
分隔符开头 \/>相对路径
工作目录一起使用。. : 当前目录.. :上一层目录~ : Linux中自己用户的根目录~user: Linux中 user的根目录- : Linux中上一次最近访问的目录creatdeleteopendirclosedirreaddirrenamelink
i节点计数器的个数(记录含有该文件的目录树目)。硬连接(hard link)。 硬链接不占用磁盘空间硬链接只能作用于文件,不可跨越分区。硬链接和原来的文件没有什么区别,而且共享一个 inode 号。硬连接是完全平等的,都掌控的真实的,而不是一个快捷方式。unlink
Unix中,用于删除文件的系统调用实际上就是unlink符号连接 : 类似于快捷方式,又叫软连接
实现者的角度考察文件。
文件系统存放在磁盘上
多数磁盘被划分为一个或多个分区。
分区都有独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record,MBR),用来引导计算机。
MBR的结尾是分区表。
活动分区。在计算机被引导的时候
BIOS读入并执行MBR。MBR做的第一件事是确定活动分区,读入它的第一个块,叫做引导块(boot block),并执行之。引导块中的程序将装载该分区中的操作系统。 分区的开始都是引导块,即使没有操作系统。
之后的磁盘分区的布局随着文件系统的不同而变化。以上是一个可能的布局。
第一个是超级块(superblokc)
超级块包含文件系统的所有关键参数。
魔数。计算机启动,或文件系统首次使用时,超级块被读入内存。
文件系统空闲块的信息。
i节点 文件一个。i节点说明了文件的方方面面。根目录文件和目录文件存储实现的关键问题
跟malloc的动态存储分配是一模一样的模型。(但是malloc可以忽视这几个缺点)

优点:
实现简单
读性能好
寻道和旋转延迟。缺点:
外部碎片太多,需要维护一个空闲列表来存储文件。
但是为了能在空闲列表中找到一个合适的块
必须要知道文件最终的大小。
大多数时候对于文本文档不知道文件的最终大小,所以这是一个硬伤。
使用场景
存在这种情形,文件的大小都事先知道,后续使用中,也不会被改变
CD-ROM文件系统。
DVD的文件系统
多年前,连续分配由于其简单和高性能被实际用于在磁盘文件系统中,后来由于讨厌在文件创建时不得不指定最终文件的大小,这个想法被放弃了。但是随着
CD-ROM,DVD以及其他一次性写光学介质的出现,突然间连续分配又成为了一个好主意。所以研究具有清晰和简洁概念的老式系统和思想是很重要的,因为它们有可能以一种令人吃惊的方式在未来系统中得到使用。
优点:
缺点
O(n),太慢。指针占去了一些字节,使得存储数据的字节数不再是2的整数次幂。
程序都是以2的整数次幂来读写磁盘块,要读一个完整的块,可能要两个磁盘块拼接。
使得速度变慢

取出每个磁盘的指针字,把它放到内存的一个表中。这个表叫做文件分配表(File Allocation Table,FAT).
优点:
O(n)也是可以接受的。2的整数次幂了。缺点:
对于200GB的磁盘和1KB大小的块,这张表需要2亿项,每个表项4字节。
这张表要占600到800MB的内存,不太实用
所以FAT对于大磁盘不适用

每个文件赋予一个称为i节点(index-node)的数据结构
文件属性和文件块的磁盘地址优势
只有在文件打开的时候,i节点才载入内存。
类似虚拟地址空间的多级页表的方式。

i节点里的地址就是一级页表。最底层的地址才是实际的磁盘地址。索引,节约空间,完美。缺点:貌似没有
打开文件,操作系统利用用户给出的路径名找到相应目录项。
目录项提供了查找文件磁盘块所需要的信息。
i节点号无论如何,目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息。
与此密切相关的问题是在何处存放文件属性。

文件属性直接存放在目录项中。(对应于Windows)i节点的系统,还可以把文件属性存到i节点中,而不是目录项中。现代操作系统都支持可变长度的长文件名,它们是如何实现的。

图4-15(a) ,被后面那种完爆就不提了。第三种,利用堆来维护文件名。
堆的维护跟 malloc的类似。缺点
一个目录项可能会分布在多个页面里。
因此处理文件名还是可能有页面故障。
利用哈希表
利用高速缓存
文件系统本身是一个有向无环图(DAG)而不是一棵树。

有种方式共享(连接)
硬链接
目录指向i节点,并计数
只有当计数被置为0的时候,才真正被删除。
软连接(符号连接)
创建一个类型为LINK的文件,并把该文件放在B下。
访问文件,需要额外的开销
如果允许复制时不保留连接的话 (cp 没有-d)
软连接,直接复制所指向文件本身。
硬链接,复制过来后,重置i-node的计数器。
日志结构文件系统(Log-structured File System,LFS)设计的主要原因是
50us的磁道写操作需要10ms的寻道和4ms的旋转延迟操作。磁盘的效率降低到1%。零碎的写操作来源于哪里?假设写入一个新建的文件。
i节点,目录块。i节点,以及文件本身。这些写操作很慢,如果在写操作完成之前死机。
保存一个用于记录系统下一步将要做什么的日志。
即使奔溃后,也能通过日志来继续处理。
微软的NTFS,ext3和ReiserFS文件系统都是用日志。

即使在同一计算机下同一操作系统,也会使用不同的文件系统。
Windows通过指定不同的盘符来处理这些不同的文件系统,比如C:,D:等。
盘符是显示存在的,所以Windows知道传递什么样的文件系统请求。
不需要将不同类型文件整合同一模式。
相比下,所有现代的UNIX系统做了一个很认真的尝试,将多个文件系统整合到一个统一的结构中。

觉得大多数UNIX操作系统使用虚拟文件系统(Virtual File System,VFS)来将文件系统统一。
几乎所有的文件系统都把文件分割成固定大小的块来存储,各块之间不一定相邻(页式管理)。
一旦确定把文件按固定大小的块来存储,就会出现一个问题,块的大小应该是多少?
过大的块(空间利用低)
内部碎片严重。过小的块(时间利用低)
寻道和旋转延迟才能读完这个文件,性能太低。观点
从历史观点来说,文件系统将大小设在1~4KB之间。(历史时期磁盘数量少,空间利用率更重要)。
随着磁盘超过1TB,可以通过将块的大小提升到64KB接收磁盘的浪费,增加时间性能。

磁盘块链表
空闲块来存放空闲表。内存中保存一个指针块 指针块。 I/O,(即有利于创建,也有利于写) 半满的指针块,其余大多数为满的状态位图
n个块的磁盘需要n位位图。
1表示0表示位图所需要的空间很少。
隐形好处,保证很有可能存储会比较紧密,减少磁盘壁的移动。
缓存
由于位图是一种固定大小的数据结构,在支持分页的内核里
可以直接存放到虚拟地址空间,等待需要的时候进行页面的调入。
现在应该没人用这个技术了。。。
几个问题
影响文件系统的可靠性的另一个问题是文件系统的一致性。
不一致状态。为了解决文件系统的不一致问题,很多计算机都带有一个实用程序以检验文件系统的一致性。
Unix的fsck,Windows的scandisk.我们介绍一下Unix的fsck的原理。

高速缓存
块提前读
顺序存取方式随机存取方式,效率更低。减少磁盘臂运动
空闲块的分配减少磁盘臂运动
i节点的优化
读取一个很短的文件,也需要先两次磁盘访问
i节点改进
i节点。柱面组,每个柱面组有自己的i节点。
磁盘性能可以这样恢复
windows的defrag从事这个事 windows用户应该定期使用。NTFS貌似产生的碎片少很多了ext2,ext3)由于使用i节点的方式,很少需要使用手动的磁盘碎片整理。FAT和FAT32现在依旧流行于嵌入式系统。MS-DOS调用open系统调用,获得文件的句柄。
open系统调用识别一个路径。路径是一个一个分量的查找
直到找到最终的目录读入内存,搜索要打开的文件。



即便是早期版本的UNIX也是一个相当复杂的多用户文件系统,因为它是MULTICS继承下来的。

标签:
原文地址:http://blog.csdn.net/zy691357966/article/details/51573843