文件系统:
文件是进程创建的信息逻辑单元,每个文件之间相互独立。而操作系统中处理文件的部分称为文件系统,其主要解决了以下几个问题:
- 如何找到信息
- 如何防止一个用户读取另一个用户的数据
- 如何知道哪些块是空闲块
4.1文件:
4.1.1文件命名:
许多文件系统支持文件名用圆点分隔开成为两部分,圆点前是作为索引的任意的帮助用户迅速找到这个文件的名字,圆点后是文件扩展名。4.1.2文件结构:
- 无结构方式:操作系统不提供任何帮助,也不会构成任何障碍。
- 记录方式:文件是具有固定长度记录的序列,每个记录都有其内部结构。读操作返回一个记录,而写操作追加一个记录。
- 树方式:文件及这种结构中由一个记录树构成,每个记录并不具有同样的长度,而记录固定位置上有一个“键”字段。这棵树按照“键”字段进行排序。
4.1.3文件类型:
- 字符特殊文件
- 块特殊文件
4.1.4文件存取:
- 顺序存取
- 随机存取
4.1.5文件属性:
包括文件创建的日期和时间、文件大小等的附加信息称为文件属性。4.2目录
文件系统通常提供目录或文件夹用于记录文件,在很多系统中目录本身也是文件。4.2.1一级目录系统:
一个目录中包含所有的文件,该目录有时也成为根目录。4.2.2层次目录系统:
一个目录树以分组的方式将不同用户分隔开,不同的用户可以为自己的目录树创建自己的私人根目录。4.2.3路径名:
- 绝对路径名:由从根目录到文件的路径组成。
- 相对路径名:和工作目录一起使用。
文件系统的实现:
4.3.1文件系统的布局:
文件系统放到磁盘上。多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统,磁盘的0号扇区称为主引导记录(MBR),用来引导计算机。在MBR的结尾是分区表,该表给出了每个分区的起始和结束地址。4.3.2文件的实现:
文件存储实现的的关键问题是记录各个文件分别用到哪些磁盘块。 - 连续分配:每个文件作为一连串连续数据块存储到磁盘上。
- 链表分配:为每个文件构造磁盘块链表,每个块的第一个字作为指向下一个块的指针,块的其他部分存放数据。
- 在内存中采用表的链表分配:链表分配的指针会占块的一部分字节,使得一个块存储的字节数不再是2的幂次方,解决方法是把每个磁盘块的指针字放在内存中的一个表中。
- i节点:给每个文件赋予一个称为i节点的数据结构,其中列出了文件属性和文件快的磁盘地址。(最常用)
4.3.3目录的实现
目录项中提供了查找文件磁盘块所需要的信息。目录系统的主要功能是把阿斯克码文件名映射成定位文件数据所需的信息。与此密切相关的问题是在何处存放文件属性。 - 一种方法是把文件属性直接存放在目录项中。
- 另一种方法是把文件属性存放在i节点而不是目录项中。
4.3.4共享文件:
- 第一种方法是将一个用户目录中的共享文件的磁盘地址赋值到另一个用户的目录中。
- 让系统建立一个类型为LINK的新文件,并把该文件放在另一个用户的目录下。
4.3.5日志结构文件系统:
将整个磁盘结构化为一个日志。每隔一段时间,或是有特殊需要时,被缓冲在内存中的所有未决的写操作都被放到一个单独的段中,作为日志末尾的一个邻接段写入磁盘。4.3.6日志文件系统:
- 保存一个用于记录系统下一步将要做什么的日志。这样当系统在完成它即将完成的任务前崩溃时,重新启动后,可以通过查看日志,获取崩溃前计划完成的任务。
4.3.7虚拟文件系统
抽象出所有的文件系统都共有的部分,并且将这部分代码放在单独的一层,该层调用底层的实际文件系统来具体管理数据。4.4文件系统管理和优化
4.4.1磁盘空间管理:
存储n个字节的文件可以有两种策略:分配n个字节的连续磁盘空间,或者把文件分成很多个连续(或者不一定连续)的块。现在几乎所有的文件系统都把文件分割成固定大小的块来存储,各块之间不一定相邻。 - 块大小:大的块浪费空间,小的块浪费时间。大的块性能高但是空间利用率低,而小的块的相反。
- 记录空闲块:一种方法将空闲块用磁盘链表链接起来,另一种方法是使用位图。
- 磁盘份额:系统管理员分给每个用户拥有文件和块的最大数量,操作系统确保每个用户不超过分给他们的配额。
4.4.2文件系统备份:
物理转储:
从磁盘的第0块开始,将全部的磁盘块按序输出到磁带上,直到最后一块复制完毕。逻辑转储:
从一个或几个指定的目录开始,递归的转储其自给定基准日期后有所更改的全部文件和目录,步骤如下: - 标记所有目录和修改过的文件。
- 取消不包含修改过文件的目录。
- 转储目录。
- 转储文件。
4.4.3文件系统的一致性
4.4.4文件系统性能:
- 高速缓存。
- 块提前读。
4.4.5磁盘碎片整理:
移动文件使文件相邻填补空洞,把所有的空闲空间放在一个或多个大的连续的区域内。