文件系统详细描述

/ns/wz/sys/data/20020612133148.htm

http://www.20cn.org/~xiyang
小组原创作品,如果转载,请标明出处
文件系统
文件:具有一定名称的一组相关数据的集合
文件命名:可是理解为是一表识。有了它,user不必去关心file的特定的细节,如物理位置等。
文件结构:文件的数据和文件的属性
文件的数据大家都清楚,文件的属性如下:
1.文件名称
2.文件的内部表识
3.文件的物理位置
4.文件的拥有者
5.文件的权限
6.文件的类型
7.文件的长度
8.文件的时间
文件分类
按照用途分:系统文件,库文件(动态连接库,静态连接库),用户文件
按照性质分:普通文件,目录文件,特殊文件
按照保护级别分:r,w,x,等
按照数据形式分:源文件,目标文件,可执行文件
文件存取
顺序访问,随机访问,索引访问
文件操作
对文件自身操作(open,close,read,write….)
对记录的操作(delete,find ,insert…..)
这里澄清二个概念:
删除:先清空该记录的目录项(记录了文件属性),释放空间。是创建文件的逆过程
截断:将文件的长度设为0。
文件结构
指文件的组织形式:逻辑结构,物理结构(存储结构)
文件实现:
空间分配策略
连续空间分配
链接空间分配
索引空间分配
组合空间分配
前三种都比较简单,我们来看一下组合空间分配(广泛用于unix)

这里涉及到一个概念I节点(inode),i节点用来描述一个文件的物理位置,他包括除了名字外的一个文件的所有信息,名字与i节点数目一起存在目录中,目录项包括文件名和文件的i节点数目。 i节点包括几个数据块的数目,用于存储文件的数据。 i节点中只有少量数据块数的空间,如果需要更多,会动态分配指向数据块的指针空间。这些动态分配的块是间接块;为了找到数据块,这名字指出它必须先找到间接块的号码。I节点共有15个指针可以用来分配,前12个指向可以直接access的block,
最后三个指针有点特殊,一般用不到,是指向间接块的。
为了提高文件的操作的速度等,unix使用了缓冲的概念,系统还将磁盘上的inode读进内存。
需要特别指出的是文件存在多重链接.



空闲空间的管理
文件系统必须随时掌握磁盘空闲空间的情况,因为要实现删除文件后得到的空闲空间 的再分配。
方法:
1. 空间块位示图
由位图和位矢量来实现,每个block由1位来表示,如果该bolck,则该位为1,否则为0 。优点:简单,寻找n个连续的空间块很高效,缺点:耗内存
2. 空间块链表
通过链表指针将空闲块连接在一起
优点:消耗内存小
缺点:遍列效率低
………..
目录
上面已经多次提到目录,目录最基本的功能就是通过文件名可以快速方便的获取文件的信息(上面所说的文件属性)
图(目录和索引节点之间的关系):


目录是一个列表文件名,其他文件的相关节点号以及目录名的文件集合。每个文件有单一的信息节点,一个目录实际上也是一张表,每个目录输入项由文件名和信息节点号组成,信息节点号是节点表的偏移量。目录项构成:文件名,索引节点号,文件名长度,目录项长度。
从这个图我们也可以看出,文件是可以有多重连接的,举个例子:假如我的姓名叫A,那么
大家叫A是指我,叫夕阳也是指我,或者同事叫小A,也是指我。
图(目录项布局)

目录项内容包括索引节点编号, 目录项名称长度以及名称本身
在上图中i1就是索引节点号,15是目录项的长度,file是名称。
图(文件的定位)

该图讲述的是系统怎样一步一步的定位/usr/WeiYM/nbox的。
这里补充一下:对于绝对路径:根目录----路径名的下一个分量的inode----block
对于相对路径:当前目录中寻找下一个分量的inode--------block
目录结构
单级目录。
优点:简单。:)
缺点:文件不可以重名(因为是一个目录),查找速度慢。
二级目录
多用户的情况下,把用户作为第一级目录,这样对同一个用户来说,文件仍然不可以重名。
多级层次目录
二级目录的推广,解决了文件重名的缺陷,但是,却不直接支持实现文件or目录的共享。
无环结构目录
多级目录的推广,解决了文件共享问题,但是实现比较困难。为什么?大家可以想想,这样一来,一个文件不是有多个绝对路径了吗?那么,我想delete这个文件不就要把所有的链接都被删除时,文件才会真正的删除掉了吗?问题还不止这些。譬如说,不可以出现环。等等…….有兴趣者可以自己专门研究一下。
图状目录结构
是在无环的基础上形成的。此结构实现目录的遍列and删除时也有可能出现问题,当然可以通过一些措施来解决,如:垃圾收集的机制来解决delete的问题。
目录的操作(unix)
目录创建:在外部存储介质中创建一个目录文件以备存取文件属性的信息。
目录删除:只有目录为空时,才能将其删除。
目录检索:find顺序:文件名------得到文件属性-------得到物理位置----(可选项)启动磁盘驱动-------将所需要的文件读入memory
目录打开:if 目录不在memory中 then 从外存中open,并且读入相应的目录文件。
目录关闭:while 目录使用结束,关闭目录to释放内存空间。
目录的实现
线形表算法
简单,可是很消耗时间,系统的开销比较大。
hash表算法
目录项存储在一个HASH表中,进行目录find时,由目录名计算出一个hash值,然后得到一个指向表中文件的指针。Unix使用。
B+树算法(NTFS采用)
呵呵,到现在还没有说文件系统的概念
文件系统的概念:操作系统用于明确磁盘或分区上的文件的方法和数据结构
看完了上面的分析和基础知识,理解文件系统好一点了吗?
文件系统里面还有很多的东西,譬如说,虚拟文件系统(VFS),各种文件系统(FAT12,FAT16,FAT32,NTFS,EXT2,等),安全性,可恢复性,等。当然还有具体的算法描述,我正在写。。。
欢迎大家给出意见。

(BY 夕阳)