文件系统接口
概述
文件系统的组成:
- 文件:存储相关数据
- 目录:组织系统内的文件并提供有关文件的信息
相关概念:
文件是记录在外存上得相关信息的具有名称的集合。其具有连续的逻辑地址空间
通常,文件表示数据和程序。
数据文件可以包括,数字、字符、字符串或二进制。文件可以是自由形式,如文本文件,也可以具有严格的格式。
文件必须具有可以长期信息存储的性质、必须能够保存大容量数据、在进程终止后信息能够保留下来、能够多进程并发访问文件中的信息。
文件属性
名称:按人们易读的方式保存的信息
标识符:用户不可读,用于在文件系统内进行该文件的标识
类型:用于操作系统辨认并执行
位置:文件位于硬盘上的位置的指针
大小:大小
保护:控制谁可以读、写、执行
时间、日期和用户标识:创建,上次修改,上次访问时间等信息,用于保护,安全,使用跟踪。
文件操作
- Create 创建
- Write 写
- Read 读
- Reposition within file – file seek 定位
- Delete 删除
- Truncate 截断
- Open(Fi) 打开– search the directory structure on disk for
entry Fi, and move the content of entry to memory. - Close (Fi) 关闭– move the content of entry Fi in memory
to directory structure on disk.
文件读写方式
顺序访问
顺序访问就是打开文件后,一个字节一个字节的读,一个20Kb的文件,必须先读完前10Kb(即使不做任何操作),才能访问到第11Kb。
顺序访问是通过一个指针操作的,指针可以按顺序移动(有的系统允许向前或者向后跳过n个记录),也可以重新设置到开始位置(reset)
read next
write next
reset
no read after last write(rewrite)
直接访问
直接访问也叫相对访问,其原理是基于磁盘的特性的,磁盘能够随时访问其任意位置。
支持直接访问的文件中,文件由固定长度的逻辑记录组成,通过这种逻辑记录(如每一个块的编号,记录等)能够做到访问文件的任意位置。
直接访问可以立即访问大量信息,所以极为有用
read n(块,直接读写)
write n
position to n
read next
write next
rewrite
其他访问方式
其他访问方式可建立在直接访问方式上,这些访问通常涉及创建文件索引。索引包括各块的指针。为了查找文件中的记录,首先搜索索引,再根据指针直接访问文件,以查找所需要的内容。
索引及其对应文件关系如下图所示。
目录结构
为了管理数据,需要合理的组织方式
目录和文件都保存在磁盘上。逻辑卷(可跨磁盘)的概念
有时候需要在一个磁盘上装多种文件系统,这些部分称为分区(partition)或者片。
对目录的操作
- Search for a file查找文件
- Create a file创建文件
- Delete a file删除文件
- List a directory罗列目录内容
- Rename a file文件重命名
- Traverse the file system遍历文件系统
组织目录的目标
- 高效(Efficiency)–locating a file quickly.
- 命名(Naming)–convenient to users.
Two users can have same name for different files.
The same file can have several different names. - 分组(Grouping)–logical grouping of files by properties, (e.g., all Java programs, all games, …)
单层结构目录(Single-Level Directory)
在一个目录下存在:
- 命名问题:文件位于同一个目录下,他们必须具有唯一名称。
- 分组问题
双层结构目录(Two-Level Directory)
对于双层结构目录的结构,每个用户都有自己的用户文件目录(user file directory,UFD)。
因此在每个UFD中所有的文件名称唯一即可,不同的用户可以有相同拥有文件名的问题。
虽然双层结构目录解决了名称冲突问题,但是它仍有缺点。这种解耦股有效地对用户加以隔离。这种隔离在用户需要完全独立时是优点,但是在用户需要在某个任务上进行合作和访问其他文件时却是一个缺点。
为了访问指定的文件唯一,用户必须知道要访问文件的路径名(path name)。
树状结构目录(Tree-Structured Directories)
树是最常用的目录结构。树有根目录,并且系统内的每一个文件都有唯一路径名。
当前目录:通常情况下,一个进程都有一个当前目录,包含了进程当前感兴趣的绝大多数文件。子进程的当前目录通常是创建子进程的父进程的当前目录。
路径名:路径名有绝对路径和相对路径两种形式,绝对路径从根路径开始,相对路径从当前目录开始
如何处理删除目录:如果目录为空,那么可以简单的删除条目,如果目录不为空,可以有两个选择:
- 强制要求如果目录不为空就无法删除目录。如MS-DOS系统
- 递归删除目录下的所有子目录和文件。如linux下的rm命令
- 高效的搜索(Efficient searching)
- 分组能力(Grouping Capability)
- 当前目录(Current directory / working directory)
- 路径名有两种形式:绝对路径和相对路径。
上图表示的是树状目录。树状结构禁止共享文件和目录,因此允许共享文件和目录后,树就变成了图。
无环图目录(Acyclic-Graph Directories)
无环图是树状目录结构的一个扩展,允许目录含有共享子目录和文件
这样对于相同的文件可能有不同的名字,因此有别名。一个文件也可有多个绝对路径名。
如果文件被删除,这样可能会留下悬挂指针指向不再存在的文件,更为糟糕的是,这些剩余文件指针可能指向包括实际磁盘地址,而该空间可能正在被其他文件使用。
在无环图中,常用的实现共享文件和目录所采用的方法有两个:
- 创建一个称为链接的新条目,链接实际上是另一个文件或目录的指针。
当访问时,根据所给的目录搜索,如果指向的条目为链接,则根据链接进行二次解析。
采用这种方法的一个主要的问题就是删除文件时对链接的处理,处理方法为:删除链接本身不影响原文件,只有在删除原文件会释放文件对应空间。在删除原文件时,链接会无效化。 - 在共享目录中重复所有被共享文件的信息
这会使得原来的文件和复制品无法区分,一个主要的问题是维护这两者的一致性。
采用无环图的问题是:
(1)一个文件可以有多个路径名,如果试图遍历整个文件系统,那么理想的结果应该是共享文件只出现一次,但如何去重并不好解决。
(2)如何正确的删除?UNIX下,当删除链接不影响文件,当删除文件时链接作为非法文件名处理;另一种方法是保留文件直到删除所有引用为止,这需要一个引用列表或者计数器。
(3)确保文件没有环,无环图的主要优点是可以用简单算法遍历图,并确定是否存在文件引用。
如何保证没有环?
- 只允许链接到文件而不是子目录
- 使用垃圾收集方案确保目录中没有自我引用
- 当产生新链接的时候使用算法检测是否有环产生。
通用图目录(General Graph Directory)
相比于无环图,这里强调通用图可能存在环,那么高效的遍历算法就是通用图看重的了。
采用五环图解耦股的一个特别重要的问题是如何保证没有环。
- Allow only links to file not subdirectories.
只允许连接到文件 - Garbage collection.
垃圾收集 - Every time a new link is added use a cycle detection
algorithm to determine whether it is OK.
建立新连接时进行循环检测
文件系统安装
文件系统在被系统使用前必须安装(mount,也叫挂载)
安装步骤:
- 操作系统需要知道设备名称和文件系统的安装位置(称作安装点,mount point)
- 操作系统验证设备是否包含一个有效的文件系统:通过设备驱动程序读入设备目录,验证目录是否含有期望的格式
- 操作系统在其目录结构记录:一个文件系统已安装在给定安装点上。
通常,系统不允许在包含文件的目录上安装文件系统,或者安装后目录中其他已存的文件不可见,直到文件系统被卸载,如上图,users目录下的文件在文件系统被安装后被隐藏了。
文件共享
- Sharing of files on multi-user systems is desirable.
对多用户系统尤其必要 - Sharing may be done through a protectionscheme.
通过“保护”系统实现 - On distributed systems, files may be shared across a
network.
在分布式系统中,文件甚至可通过网络共享 - Network File System (NFS)网络文件系统is a common
distributed file-sharing method.
NFS是一种普遍的分布式文件共享方式
保护
文件的属主(owner)应该能够控制
- what can be done对文件可做什么
- by whom 谁来做
访问的类型
- Read读
- Write写
- Execute执行
- Append追加
- Delete删除
- List罗列