文件管理
1、文件的概念
通过自底向上的方法定义:
-
数据项。数据项是文件系统中最低级的数据组织形式,可分为以下两种:
基本数据项。用于描述一个对象的某种属性的一个值。是数据中可命名的最小逻辑单元,即原子数据。
组合数据项。由多个基本数据项组成。
-
记录。记录是指一组相关数据项的集合,用于描述一个对象在某方面的属性。
-
文件。文件是指由创建者所定义的一组相关信息的集合,逻辑上可分为有结构文件和无结构文件两种。有结构文件中,文件由一组相似的记录组成,又称为记录式文件;而无结构文件则被视为一个字符流,又称流式文件。
1.1、文件的属性
所有文件的信息都保存在目录结构中,而目录结构保存在外存上。文件信息在需要时调入内存。通常,目录条目包含文件名称及其唯一的标识符,而标识符定位其他属性的信息。
1.2、文件的基本操作
文件属于抽象数据类型。操作系统提供系统调用,它对文件进行创建、写、读、重定位、删除和截断等操作。
- 创建文件。两股步骤:(1)在文件系统中为文件找空间;(2)在目录中为新文件创建条目;
- 写文件。执行一个系统调用。系统维护一个写指针。
- 读文件。系统维护一个读位置的指针。
- 文件的重定位(文件寻址)。
- 删除文件。先从目录中找到要删除的文件目录项,然后再回收文件所占的存储空间。
- 截断文件。
1.3、文件的打开与关闭
系统在首次使用文件的时候,使用系统调用 open 将指明文件的属性(包括该文件在外存上的物理位置)从外存复制到内存打开文件表的一个表目中,并将该表目的编号(也称索引)返回给用户。操作系统维护一个包含所有打开文件信息的表(打开文件表)。当用户需要一个文件操作时,可通过该表的一个索引指定文件,因此省略了搜索环节。
大多数操作系统要求在文件使用之前就被显式地打开。操作 open 会根据文件名搜索目录,并将目录条目复制到打开文件表。若调用 open 的请求得到允许,则进程就打开文件,而 open 则返回一个指向打开文件的一个条目的指针。通常通过指针(而非)文件名进行所有的 I/O 操作。
每个打开的文件都有如下的信息:
- 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
- 文件打开计数。
- 文件磁盘位置。
- 访问权限。
2、文件的逻辑结构
按逻辑结构,文件可划分为无结构文件和有结构文件:
-
无结构文件(流式文件)
无结构文件将数据按顺序组织成记录并积累、保存,它是有序相关信息项的集合,以字节为单位。遍历无结构文件,只能通过穷举的方式。
-
有结构文件(记录式文件)
有结构文件按记录的组织形式可以分为如下几种:
- 顺序文件。文件中的记录一个接一个地顺序排列,记录通常是定长的,可以顺序存储或以链表的形式存储。
- 索引文件。
- 索引顺序文件。
- 直接文件或散列文件。
3、目录结构
3.1、文件控制块
与进程管理一样,为实现目录管理,操作系统引入了文件控制块的数据结构。
-
文件控制块
文件控制块(FCB)是用来存放控制文件需要的各种信息的数据结构,以实现 “按名存取”。FCB 的有序集合称为文件目录,一个 FCB 就是一个文件目录项。为了创建一个新文件,系统将分配一个 FCB 并存放在文件目录中,称为目录项。
FCB 主要包含以下信息:
- 基本信息。如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等;
- 存取控制信息。如文件的存取权限等;
- 使用信息。如文件的创建时间等。
-
索引结点
在检索目录文件时,只用到了文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读取文件的物理地址。也就是说,在检索目录时,文件的其他描述信息都不会用到,也不要调入内存。因此,有的系统采用了文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,称为 i 结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的 i 结点的指针组成。
3.2、目录结构
-
单级目录结构
在整个文件系统中只建立一张目录表,每个文件占一个目录项。但查找速度慢、文件不允许重名、不便于文件共享;
-
两级目录结构
将文件目录分为主文件目录和用户文件目录。但缺乏灵活性,不便于文件分类。
-
多级目录结构(树形目录结构)。类似于 Linux 的目录树结构。绝对路径和相对路径。
-
无环图目录结构
3.3、文件共享
- 硬链接
- 软链接
4、文件系统的实现
4.1、文件系统的层次结构
4.2、目录实现
目录的实现是为了查找
- 线性目录
- 哈希表
4.3、文件实现
4.3.1、文件分配方式(对磁盘非空闲块的管理)
怎么实现 | 目录项结构 | 优点 | 缺点 | |
---|---|---|---|---|
顺序分配 | 为文件分配的必须是连续的磁盘块 | 起始块号、文件长度 | 顺序存取速度快、支持随机访问 | 会产生碎片,不利用文件扩展 |
隐式链接 | 除文件的最后一个盘块之外,每个盘块中都存在指向下一个盘块的指针(单链表) | 起始块号、结束块号 | 可解决碎片问题,外存利用率高,文件扩展实现方便 | 只能顺序访问 |
显式链接 | 建立一张文件分配表(FAT),显式记录盘块的先后顺序(开机后 FAT 常驻内存) | 起始块号 | 还可以通过查询内存中的 FAT 实现随机访问 | FAT 需要一定的内存空间 |
索引分配 | 为文件数据块建立索引表。若文件过大,可采用链接方案、多层索引、混合索引 | 链接方案记录的是第一个索引块的块号,多层/混合索引记录的是顶级索引块的块号 | 支持随机访问,易于文件的扩展 | 索引表需要占用一定的内存空间。访问数据之前需要先读入索引快。若采用链接方案,查找索引块时可能需要多次读磁盘操作 |
4.3.2、文件存储空间的管理(对磁盘空闲块的管理)
- 空闲表法
- 空闲链表法
- 位示图法
- 成组链表法
5、磁盘组织与管理
5.1、磁盘的结构
磁盘盘面上的数据存储在一组同心圆中,称为磁道。磁道又划分为几百个扇区,每个扇区固定存储大小 512Bytes,一个扇区又称为一个盘块。所有盘片上相对位置相同的磁道组成柱面,扇区是磁盘寻址的最小单位,磁盘地址用 “柱面号·盘面号·扇区号(或块号)” 表示。
5.2、磁盘调度算法
- 先来先服务算法
- 最短寻找时间优先算法
- 扫描算法
512Bytes**,一个扇区又称为一个盘块。所有盘片上相对位置相同的磁道组成柱面,扇区是磁盘寻址的最小单位,磁盘地址用 “柱面号·盘面号·扇区号(或块号)” 表示。
5.2、磁盘调度算法
- 先来先服务算法
- 最短寻找时间优先算法
- 扫描算法
- 循环扫描算法(C-SCAN 或 LOOK),改进的 C-LOOK 算法