一 . 文件的基本概念
- 文件(File):以硬盘为载体的存储在计算机上的信息集合。可以是文本文档、图片、程序等。
- 用户输入输出的基本单位。
- 文件系统(File System):用于实现用户对文件的访问,修改和保存和维护管理等。
文件的结构
实际上关于文件并没有严格的结构化定义。
- 数据项。文件系统中最低级的数据组织形式。分为以下两种类型:
- 基本数据项。用于描述一个对象的某种属性的一个值,数据中最小的逻辑单位。
- 组合数据项。由多个数据项组成。
- 记录:一组相关数据项的集合,用于描述一个对象在某方面的属性。
- 文件:由创建者定义的、具有文件名的一组相关元素的集合,可以分为有结构文件和无结构文件。
- 有结构文件中,文件由若干个相似的记录组成。
- 无结构文件被视为一个字符流,比如一个二进制文件或字符文件。
文件的属性
除文件数据外的附加信息,称为文件的属性或文件元数据。
- 名称。同一路径下文件名唯一,以容易读取的形式保存。
- 类型。被支持不同类型的文件系统所使用。
- 创建者。文件创建者的 ID。
- 所有者。文件当前所有者的 ID。
- 位置。文件的存放路径(用户使用),在外存的地址(OS 使用,用户不可见)。
- 大小。当前文件大小(用字节、字或块表示),也可以包含文件允许的最大值。
- 保护。对文件进行保护的访问控制信息。
- 创建时间、最后依次修改时间和最后一次存取时间。文件创建、上次修改和上次访问的相关信息,用于保护和跟踪文件的使用。
OS 通过文件控制块(FCB)来维护文件的元数据。
文件的分类
常见的文件分类方法:
- 按性质和用途分类
- 系统文件
- 用户文件
- 库文件
- 按文件中数据的形式分类
- 源文件
- 目标文件
- 可执行文件
- 按存取控制属性分类
- 可执行文件
- 只读文件
- 读/写文件
- 按组织形式和处理方式分类
- 普通文件
- 目录文件
- 特殊文件
二. 文件控制块和索引节点
文件控制块(FCB)
文件控制块(File Control Block,FCB)用来存放控制文件需要的各种信息的数据结构,以实现按名存取。
文件目录:FCB 的有序集合。一个 FCB 就是一个文件目录项。
通常,一个文件目录也被视为一个文件,称为目录文件。
典型 FCB 如下图:
文件名 |
类型 |
文件权限(读,写) |
文件大小 |
文件数据块指针 |
FCB 主要包含信息:
- 基本信息
- 文件名
- 文件的物理位置
- 文件的逻辑结构
- 文件的物理结构等
- 存取控制信息
- 文件主存取权限
- 核准用户存取权限
- 一般用户存取权限
- 使用信息
- 文件建立时间
- 上次修改时间等
索引节点
文件目录通常存放在磁盘上,文件很多时,文件名目录就会大量占用磁盘块。
查找目录过程需要将存放目录的盘块依次调入内存,然后逐一匹配文件名。而文件的其他描述信息不会用到,也不需要调入内存。
因此,有的操作系统(如 UNIX)采用文件名和文件描述信息分离的方法,使得文件描述信息单独形成一个称为索引节点的数据结构,简称 i 节点(innode)。
在文件目录的每一个目录项仅有文件名和相应的索引节点号(或索引结点指针)构成。
索引节点的使用可以减少文件目录项的大小,节省存储空间和查找的系统开销。
磁盘索引节点
- 是指存放在磁盘上的索引节点。
每个文件只有一个唯一的磁盘索引节点,主要 包括以下内容:
- 文件主标识符。拥有该文件的个人或小组标识符。
- 文件类型。普通文件,目录文件,特别文件。
- 文件存取权限。各类用户对文件的存取权限。
- 文件物理地址。
- 每个索引节点包含 13 个地址项,即 iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号(见 文件的物理结构 部分)
- 文件长度。以字节为单位的文件长度。
- 文件链接计数。本文件系统中所有指向该文件的文件名的指针计数。
- 文件存取时间。本文件最近被进程存取、修改的时间及索引节点最近被修改时间。
内存索引节点
- 是指存放在内存的索引节点。
文件被打开时,需要将磁盘索引节点复制到内存索引节点中,以便后续使用。内存索引节点新增了以下内容:
- 索引节点号。用于标识内存索引节点。
- 状态。指示 i 节点是否上锁或被修改。
- 访问计数。每当有一个进程访问此 i 节点,计数加 1;访问结束减 1。
- 逻辑设备号。文件所属文件系统的逻辑索引号。
- 链接指针。设置分别指向空闲链表和散列队列的指针。
FCB 或索引节点相当于图书馆的图书索引号,根据索书号查找相要的图书。
三. 文件的操作
文件的基本操作
文件属于抽象数据类型。为了正确定义文件,需要考虑对文件执行的操作
OS 提供一系列系统调用,实现对文件的创建,删除,读,写,打开和关闭等操作。
- 创建文件
- (create 系统调用)
- 为新文件分配外存空间
- 在目录中为新文件创建一个目录项,记录新文件名、文件在外存中的地址信息。
- 删除文件
- (delete 系统调用)
- 根据文件名查找目录,删除指定文件对应的目录项和 PCB (文件控制块)。
- 回收该文件占用的存储空间。(磁盘空间和内存缓存区)
- 读文件
- (read 系统调用)
- 根据文件名查找目录,找到文件对应的目录项,得到被读文件在外存的地址。
- 在目录项中,有一个指针用于对文件进行读操作。
- 写文件
- (write 系统调用)
- 根据文件名查找目录,找到指定目录的目录项,利用目录项的写指针对文件进行写操作。
- 每当发生写操作时,更新写指针。
文件的打开与关闭
文件打开
当用户对一个文件实施多次读/写等操作时,每次都要从检索目录开始。
为了避免多次重复地 检索目录,大多数操作系统要求,当用户首次对某文件发出操作请求时,须先利用系统调用open 将该文件打开。
系统维护一个包含所有打开文件信息的表,称为打开文件表。
所谓“打开”,是 指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目 中,并将该表目的索引号(也称文件描述符)返回给用户。
当用户再次对该文件发出操作请求时, 可通过文件描述符在打开文件表中查找到文件信息,从而节省了大量的检索开销。
当文件不再使 用时,可利用系统调用close关闭它,则系统将会从打开文件表中删除这一表目。
文件关闭
在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表。
通常,系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打 开了该文件。
当文件不再使用时,利用系统调用close关闭它,会删除单个进程的打开文件表中 的相应条目,系统表中的相应打开计数器也会递减。当打开计数器为0时,表示该文件不再被使 用,并且可从系统表中删除相应条目。图4.3展示了这种结构。
文件名与文件描述符的应用
- 文件名不必是打开文件表的一部分,因为一旦完成对 FCB 在磁盘上的定位,OS 就不再需要文件名。
- 对于访问打开文件表的索引号。
- UNIX 称之为文件描述符
- Windows 称为文件句柄。
因此,只要文件未被关闭,所有文件操作都是通过文件描述符(而不是文件名)来进行的。
Tips:因此,只要完成了文件打开 open()系统调用,后面再使用 read(),write(),Lseek(),close() 等文件操作的系统调用。都不再使用文件名,而是文件描述符。
四. 文件的保护
文件系统中,建立文件保护机制用于解决对文件的读,写,执行的许可问题。
实现方式
- 口令保护。防止用户文件被他人存取或窃取。
- 加密保护。
- 访问控制。控制用户对文件的访问方式。
- …
访问类型
可以加以控制的访问类型由以下几种:
- 读。从文件读出数据。
- 写。向文件写入数据。
- 执行。将文件装入内存并执行。
- 添加。将新信息添加到文件结尾部分。
- 删除。删除文件,释放空间。
- 列表清单。列出文件名和文件属性。
此外,还可以对文件的重命名,复制,编辑等加以控制。这些高层的功能可以通过调用底层系统调用来实现。
保护只可以在底层提供。
例如:复制文件使用一系列读请求来完成。
这样,具有读访问权限的用户同时也就具有了复制和打印权限。
访问控制
解决访问控制常用方法是根据用户身份进行控制。
实现基于身份访问的最普通方法:为每个文件和目录增加 访问控制列表(Access-Control List,ACL),以规定每个用户名以及所允许的访问类型。
- 优点:可以使用复杂的访问方法
- 缺点:长度无法预计并且可能导致复杂的空间管理。可以使用精简访问列表解决。
精简的访问控制列表
可以采用拥有者、组和其他三种用户类型。
- 拥有者。创建文件的用户。
- 组。一组需要共享文件且具有类似访问的用户。
- 其他。系统内所有其他用户。
访问控制列表实例如下图:
口令和密码
- 口令。
- 建立一个文件时,系统为其建立 FCB 时候附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时候要提供口令。
- 优点:时间空间开销不大。
- 缺点:口令直接存储在系统内部,不够安全。
- 密码
- 是指用户对文件进行加密,被访问时需要使用密钥。
- 优点:保密性强,节省了存储空间。
- 缺点:编码译码需要花费时间。
口令和密码都是防止用户被他人存取或窃取,没有控制用户对文件的访问类型。
对于多级目录结构而言,还需要保护目录子文件【即提供目录保护机制】。目录的操作与文件不同,保护机制也不一样。
五. 文件的逻辑结构
无结构文件
有结构文件
- 定长记录
- 文件中所有记录长度相同,各数据项在记录中的相同位置,具有相同长度。
- 检索记录的速度快,方便用户对文件进行处理。
- 广泛用于数据处理中。
- 变长记录
- 文件中各个记录长度不一定相同。原因可能是记录中包含的数据项数目不同,也可能是数据项本身长度不固定。
- 只能顺序查找,速度慢。
有结构文件又可以按记录的组织形式分为顺序文件,索引文件,索引顺序文件。
顺序文件
索引文件
索引顺序文件
直接文件或散列文件(Hash File)
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。散列文件具有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值可能相同。
可以类比数据结构的哈希查找,会有这样的感觉:有结构文件逻辑上的组织,是为在文件中查找数据服务的(顺序查找、索引查找、索引顺序查找、哈希查找)。