曾经小,不懂事儿,敲下了rm -rf,那种感觉,可能今生今世不会再忘了......
[toc]
1. 文件
1.1 文件的分类
文件能有什么分类,无非是流式文件或者就是结构化的文件(记录式)这两种, 我们说,分类的差别就只是不同分类下的组成形式不一样,流式文件的组成是一个一个的信息项,可能是单字节的信息,也有可能是多字节的信息,这个具体就是看写入的信息项是什么了,结构化的文件组成是一个一个的结构体,根据结构体的内容才有了不同的结构体文件。
学过C语言就知道结构体是什么东西,这个结构化的文件就可以理解为一个个的结构体组成,当这个结构体记录的信息为单一的,那么这个文件就退化到了流式文件。
举个例子:
struct Student
{
int ID;
char* name;
}//简单的结构体(记录式)
char* name;//简单的流式文件信息项
struct Student
{
char* name;
}//当结构体中的信息单一时,该结构体可视为单一的信息项
本节所述的文件的分类依据为文件的逻辑组织结构。文件的分类依据不同的原则可以分成不一样的类型,正如Unix中目录,设备等均被视为特殊的文件,因此可以从设备类型上分类成磁盘文件和磁带文件等,从用途上分类成目录文件和普通文件,不同的角度分类可以得到不同的分类结果。
1.2 文件的组织
组织其实就是结构,文件的结构,上述的文件的分类是从文件的逻辑结构出发的。
关于逻辑结构,这里还有一点需要提到,文件存在一个读写指针,指向文件的某一个位置,简单的说来就是一个数组的索引序号了。
struct Student Stu[100];//假设创建了一个存放一百个学生信息的数组
int read = write = 0;//初始时读写指针指向文件开始处
有逻辑组织,就一定存在物理组织,文件的物理组织即是如何将文件保存在物理设备上,这涉及到记录格式,空间开销,存取速度,长度等,这些因素会影响到文件系统的性能。
物理设备,如磁盘,是被划分为块来保存文件信息的,我们称这个块为物理块。
基于上述因素,便产生了几种常用的物理组织形式:
-
顺序结构
这种结构下,文件保存在物理设备上是占用连续存储块的。这种方式简单,访问速度很快,但文件长度的增加会比较困难。
顺序结构 -
链接结构
这种结构和链表的思想一致,各个物理块之间通过指针相连,优点和链表类似,长度变化方便,缺点就是随机访问速度慢。
链接结构 -
索引结构
这种结构继承了顺序和链接的优点,访问速度快,长度变化方便,只是索引也是有长度限制。
索引结构 -
散列结构
这种结构是通过散列函数进行块选择的,如果散列函数结构出现冲突,则可以通过拉链法(顺序探查法)来实现冲突处理。 -
倒排结构
Java中的Map存储数据是通过K,V键值对来进行的,倒排结构与之相类似,只是在其中存在一个主键和多个次键,当主键冲突无法索引时,相同主键的元素通过对比次键来进行查找。
可以看出,这种结构的查找的速度很快,但是开销要大些。
2. 文件目录
文件目录是由目录项构成的,这个目录项我们又称文件控制块(FCB),这玩意儿存储系统对文件管理所需要的全部信息。
2.1 文件目录与目录文件
用于检索文件的目录称为文件目录,是由目录项构成的有序序列。
说的挺玄乎,但其实就是一个顺序的表格,表格中顺序的存储着文件对应的目录项而已。
文件目录经过改进后,其目录项被划分为主部和次部,分别用来保存文件名称,文件号(主部),除文件名称外的所有信息外加一个连接计数器(次部),这样划分的好处是为了提高查找速度,先通过文件名称查找主部,在通过主部的文件号去查找相应的次部。
貌似并没有提高速度?先查主部,再查次部怎么都应该会减少速度,怎么能提高速度呢?
之前说过,物理设备的存储时以物理块划分的,查找文件时需要将外存的物理块读入内存,如果不进行主次部的划分,一次读入的文件目录项会很少,如此一来便需读入更多的物理块进入内存。速度也就会变慢。
目录文件就是被保存在外存空间的文件目录,且目录文件是长度固定的记录式文件。
文件目录和目录文件都是一个东西,就是存储的位置不一样而已,换个称呼。
2.2 目录的分级
目录有单级目录,也有多级目录,平常所用的Windows目录就是属于多级目录。
同一级目录下的文件不可以重名,但是不同目录下的文件是可以重名的,所谓单级目录,就是整个系统中只有一个目录,其中存储的是普通文件,不能重名。而多级目录则是允许系统中有多个目录,二级目录是可以在一级目录下创建目录,三级目录则是允许在第二级目录下创建目录,依次类推。
多级目录
由于目录分级,产生了根目录与目录层次的概念,文件查找时也有了不同的方式,即从根目录查找或是从当前目录开始向深层次的目录查找。
无论是Linux还是Windows,都存在根目录的概念,在Linux下,根目录表示为"/",而在Windows则一般表示为"C:/Windows"。
3. 文件共享与保护
对于一个文件,我们可能会有多个进程同时使用的情况,我们分为同步和异步。
同步就是同时对某一个文件进行操作,异步就是同时只有一个进程可以进行操作。至于如何实现文件共享,各个系统都有其不同的方式,不过大多都是通过公共目录进行文件的共享,或是通过链接指向同一个文件,或是为文件增加共享属性说明。
不过无论哪一种方式,都会涉及到文件的安全性。
这里安全性的定义就比较广泛了,并不是单指被黑客盗取。多个进程同时对同一个文件进行读写,那么这个文件就可以说是不安全的状态,而且我们有时候也不想让某个文件被别人读取或是写入时,就会加个密,或是变更其他用户的权限。
我们常说,数据是无价的,所以为了文件的安全,我们会经常对重要文件进行备份处理,而备份文件又有完全转储、增量转储以及差分转储三种,这了就不展开说明了。
在Linux中,通过分组保证文件的安全性,即文件所有者,组用户,其他用户三组,赋予不同的权限来进行读写的限制。
4. 文件系统的实现
为了实现一个文件系统,我们需要设计文件系统的表目信息,如系统打开文件表,用户打开文件表以及其之间的联系。
文件系统的表目底层的实现就不说了。
5. 外存空间的管理
外存空间的管理方式有空闲块表,空闲块链,位示图等方式,这个与存储系统中的外存空间的管理方式相同,这里就不一一叙述了。
网友评论