从用户
角度来考察文件
。用户如何使用文件
,文件
有那些特性。
文件
一种抽象机制,提供了一种在磁盘上保留信息而且以后方便读取的方法。
有的文件系统区分大小写,有的则不区分
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)
。
creat
delete
open
close
read
write
append
seek
get attributes
set attributes
rename
完成了copyfile abc xyz
的操作
目录本身也是文件
。
目录系统
最简单形式就是一个目录包含所有的文件。
绝对路径
分隔符
开头 \
/
>
相对路径
工作目录
一起使用。.
: 当前目录..
:上一层目录~
: Linux
中自己用户的根目录~user
: Linux
中 user
的根目录-
: Linux
中上一次最近访问的目录creat
delete
opendir
closedir
readdir
rename
link
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