文件是以硬盘为载体的,存储在计算机上的信息集合。在系统运行时,计算机以进程为基本单位进行资源的调度和分配,在用户进行输入输出中,是以文件为基本单位的。
首先了解文件的结构,通过自底向上的方式来定义:
1.文件的属性
就平时那些创建者、名称、大小等之类的
2.文件控制块
文件控制块(FCB)是用来存放控制文件需要的各种信息的数据结构。FCB的有序集合称之为文件目录。创建一个新文件,系统将会分配一个FCB并且存放在目录中,称为目录项。
FCB主要包含以下信息:
基本信息:比如文件名、文件物理地址、文件逻辑结构
存取控制信息:包括文件主的存取权限等信息
使用信息:比如文件创建的时间,上次修改时间等
3.索引节点
在检索文件的时候,其实只需要使用到文件名,其余信息不需要用到。因此有的系统比如UNIX会采用文件名和文件描述分开的方法,从而节省系统索引文件开销。
磁盘索引节点
存放在磁盘上的索引节点
内存索引节点
存放在内存中的索引节点
1.文件的基本操作
创建、读写、重定位等
2.文件的打开和关闭
当用户访问文件的时候,总是从检索文件开始,大多数操作系统会要求文件使用前要用open函数打开文件。而操作系统会维护一个打开文件表,用于保存最近打开的文件。当用户再次需要访问这个文件的时候,可以直接访问打开文件表,从而避免一个文件多次重复检索目录。每个进程也会维护一个进程级的打开文件表,用于保存当前进程打开的文件的记录。而系统级打开文件表中还有个打开次数的表项,用于记录有多少个进程打开了该文件。
关闭时将进程打开文件表删除表项,然后系统打开文件表-1
读文件:使用read系统操作,需要知名时哪个文件和读入多少数据,读入的数据放置在内存的哪个位置
写文件:将更改过的文件数据写回外存,也就是调用write系统调用。需要指明是哪个文件,以及需要写出的数据是多少,放在哪个位置。
每个打开文件都具有如下的关联信息:
1.访问类型
读、写、执行、添加、删除、列表清单。
2.访问控制
访问控制最常见的方法就是根据用户身份进行控制,现实中给予身份访问最基本的方法为,为每个文件和目录增加 一个访问控制表(ACL),以规定每个用户可以进行的操作。优点是可实现复杂的访问控制,缺点是表大小可能很大。因此可以使用精简的访问控制表来解决这个问题。精简访问控制表有三个表项:
另外还有两种访问控制方法:
文件的逻辑结构指的是文件内部,数据逻辑上是如何组织起来的。
按照逻辑结构,文件可以分为以下两种:
1.无结构文件(流式文件)
2.有结构文件(记录式文件)
(1)顺序文件
(2)索引文件
索引文件本身是一张定长记录的顺序文件,该文件中存储着索引号、对应的变长记录的长度以及该记录的物理地址。通过索引文件,可以讲对变长记录的顺序检索转变成对定长记录索引文件的随机检索,因此可以大大提升对变长记录的处理效率。此外,索引文件的记录存储可以是离散的,不要求连续存储,因此也提高了空间利用率
(3)索引顺序文件
索引顺序文件是索引文件和顺序文件的结合,传统索引文件在文件项多的情况下会出现非常庞大的索引表,导致空间效能不好。因此可以将若干个记录划分为一个组,每个组对应一个索引号。在访问记录的时候,先通过索引表定位到所在的组,再在组内进行顺序查找实现精确定位。
在外存中,文件的逻辑地址也被分为了一个个文件块,一般块大小和内存的页大小一致。文件的逻辑地址也可以表示为**(逻辑块号、块内地址)**
1.连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块
物理块号=逻辑块号+起始块号
支持顺序访问和随机访问。如果使用的是机械硬盘,因为顺序存储在物理位置上存储也是临近的,所以机械硬盘的磁头不需要移动太远,存取速度快。
缺点在于如果需要在中间插入数据,会要将后续的数据整体后移,因此扩展性很差。磁盘中的小块的存储空间会难以利用,使得存储空间利用效率低。
2.链接分配
采用离散分配方式,可为文件分配离散磁盘块。消除了文件的外部碎片,提高了磁盘利用率,可以动态分配磁盘块。由于链式结构的特性,数据的删除和插入都十分方便,可分为隐式链接和显式链接两种
3.索引分配
链接分配也存在一些问题,比如链接分配不能有效支持直接访问(FAT除外),而FAT又会占用比较大的内存空间。事实上在打开某个文件的时候,并不需要将整个FAT调入内存,只需要调入本文件的对应盘的块号就可以了。因此索引分配为每一个吻在所在的盘块号都集中放在了一个**索引块(表)**中。每个文件都有自己的索引块,在使用该文件的时候可以直接读入其索引块,索引块就如同书的目录,指示了该文件的每一部分在磁盘的位置。
索引分配优点在于支持直接访问,没有外部碎片问题。缺点是索引块的分配增加了系统开销。如果是大文件,索引块的大小会难以接受,有以下几种解决方案:
从用户的角度看,目录需要在用户所需的文件名和文件之间建立一种映射关系。实现按名存取,并且需要提高检索速度,在多用户系统中让用户互斥的访问文件
1.单级目录结构
在整个文件系统中只有一张目录表,每个文件占用一个目录项。
新建文件的时候,需要遍历表确定没有重名文件,并且删除文件的时候也需要遍历表找到文件才进行删除。单级目录实现了最基本的按名存取,但是效率低下,文件不允许重名,并且不适用多用户
2.两级目录结构
该方法将目录分为主文件目录和用户文件目录两级,主文件目录项纪录用户名以及用户文件目录所在的位置。用户文件目录记录了该用户文件的FCB信息,某用户准备反问文件的时候,只需要搜索该用户对应的用户文件目录。因此提高了检索速度,解决了重名问题,
3.树形目录结构
我们常用的windows操作系统采用的就是树形文件系统。树形结构可以方便对文件进行分类,也可以高效地进行文件的管理和保护。
4.无环图目录结构
常见的那些删除新增,是人都会
1.线性列表
2.哈希表
文件共享使得多个用户共享同一个文件,系统中只保存该文件的一个副本。如果操作系统没有共享功能,那每个需要该文件的用户都要有副本,会对存储空间造成极大的浪费。
1.基于索引节点的共享方式(硬链接)
将共享文件或者子目录链接到两个或者多个用户的目录中,方便找到该文件。
在这种方式中,诸如文件的物理地址及其文件属性,不再放在目录中,而是放在索引节点中。在文件目录中只设置文件名以及指向相应索引节点的指针。同时,在链接中还有个计数器count,用于表示连接到本文件上的用户目录项数目。如果尚有其它用户在使用该文件,则无法执行诸如删除之类的操作。
2.利用符号链实现文件共享(软链接)
为了B用户可以共享B用户的一个文件F,可以由系统创建一种LINK文件,也取名为F,并且放入B的目录中。当B要访问文件F的时候,操作系统发现是访问LINK文件,则根据文件中的路径名去找A中的F,然后进行读,这种连接方法又称为符号链接。