了解文件读写方式、目录结构、一致性语义
文章目录
概述
文件系统的组成:
- 文件:存储相关数据
- 目录:组织系统内的文件并提供有关文件的信息
相关概念:
- 文件:逻辑外存的最小分配单元?记录在外存上的相关信息的具有名称的集合。一般分为:
- 程序:包括原形式和目标形式
- 数据:数字,字符,二进制,可以是自由形式,也可以有严格的格式(xml等)
文件属性
- **名称:**按人们易读的方式保存的信息
- **标识符:**用户不可读,用于在文件系统内进行该文件的标识
- **类型:**用于操作系统辨认并执行
- **位置:**文件位于硬盘上的位置的指针
- **大小:**大小
- **保护:**控制谁可以读、写、执行
- **时间、日期和用户标识:**创建,上次修改,上次访问时间等信息,用于保护,安全,使用跟踪。
文件操作
- 创建:包含到文件系统中找到空间和在目录中为文件创建一个条目
- 写:需要执行系统调用。另外需要搜索目录查找文件位置和为该文件维护一个写位置的指针并在发生写操作时不断更新指针位置
- 读:需要执行系统调用。过程同写,需要搜索过程和维护读指针的位置
- 重定位:设置文件位置指针为给定值。该操作不需要真正的IO操作,也叫做寻址(seek)
- **删除:**搜索,释放相关空间,并删除相应条目。
- **截短文件(truncate):**将文件长度设置为
0KB
,并释放相关空间,但不改变其他属性(不删除条目)。如截短一个命名为a.txt
的文本文件后,它的大小会变为0kb
,但文件名和其他属性可能没有变化。
上述的操作都涉及到为给定的文件搜索其在目录中的相关位置,为了避免不断搜索,在首次使用文件时,和使用完毕文件时,还需要执行两个操作:
- **打开(open):**为系统调用。将执行搜索,并将相关文件的所有内容都移动到内存中,需要操作时,通过该表的索引指定文件,并直接在内存中进行操作,从而避免了重新搜索和IO操作。
- **关闭(close):**为系统调用。将文件的索引从信息表中删除,并将相关信息从内存写到外存。
操作系统维护包含所有打开文件的信息表**(open-file table)**,当需要文件操作时,通过该表的索引指定文件。
对于打开的文件,能够得到如下的信息:
- **文件指针:**读和写操作的指针
- **文件打开计数器:**一个文件可以被多个进程打开,文件打开计数器记录该操作,当计数器为0时,可以删除该文件条目。
- **文件磁盘位置:**定位文件在磁盘的位置
- **访问权限:**每个进程用一个访问模式访问文件。
文件锁相关查看p325
文件类型
文件结构*
简单结构
复杂结构
文件读写方式
顺序访问
顺序访问就是打开文件后,一个字节一个字节的读,一个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
目录结构
为了管理数据,需要合理的组织方式
存储结构
为简单起见,可以将存储文件系统的一大块(手动)分配的空间称为卷,一个卷可以存放多个操作系统。
每个卷包含了系统上文件的信息,保存在设备目录或卷表中。
设备目录记录了卷上所有文件的信息
[图10.6]
目录概述
单层目录结构
双层目录结构
树状目录结构
树是最常用的目录结构。树有根目录,并且系统内的每一个文件都有唯一路径名。
**当前目录:**通常情况下,一个进程都有一个当前目录,包含了进程当前感兴趣的绝大多数文件。子进程的当前目录通常是创建子进程的父进程的当前目录。
用户可以使用系统调用重新定义当前目录
**路径名:**路径名有绝对路径和相对路径两种形式,绝对路径从根路径开始,相对路径从当前目录开始
采用树状目录结构的一个问题是:**如何处理删除目录。**如果目录为空,那么可以简单的删除条目,如果目录不为空,可以有两个选择:
- 强制要求如果目录不为空就无法删除目录。如MS-DOS系统
- 递归删除目录下的所有子目录和文件。如linux下的
rm
命令
上图表示的是树状目录。树状结构禁止共享文件和目录,因此允许共享文件和目录后,树就变成了图。
无环图目录
无环图是树状目录结构的一个扩展,允许目录含有共享子目录和文件
在无环图中,常用的实现共享文件和目录所采用的方法有两个:
1.创建一个称为链接的新条目,链接实际上是另一个文件或目录的指针。
当访问时,根据所给的目录搜索,如果指向的条目为链接,则根据链接进行二次解析。
一个例子就是windows下的快捷方式,对照上述文字理解一下过程吧
采用这种方法的一个主要的问题就是删除文件时对链接的处理,处理方法为:删除链接本身不影响原文件,只有在删除原文件会释放文件对应空间。在删除原文件时,链接会无效化。
如果原文件保存了所有链接所在的位置,那么可以在删除原文件时同时删除链接,但这样成本太高。一个更好的方式是在调用链接的时候检查链接。
2.在共享目录中重复所有被共享文件的信息
这会使得原来的文件和复制品无法区分,一个主要的问题是维护这两者的一致性。
采用无环图的问题是:
- 一个文件可以有多个路径名,如果试图遍历整个文件系统,那么理想的结果应该是共享文件只出现一次,但如何去重并不好解决。
- 如何正确的删除?UNIX下,当删除链接不影响文件,当删除文件时链接作为非法文件名处理;另一种方法是保留文件直到删除所有引用为止,这需要一个引用列表或者计数器。
Linux下的软连接和硬链接分别对应上述两种情况。
- 确保文件没有环,无环图的主要优点是可以用简单算法遍历图,并确定是否存在文件引用。
如何保证没有环?
- 只允许链接到文件而不是子目录
- 使用垃圾收集方案确保目录中没有自我引用
- 当产生新链接的时候使用算法检测是否有环产生。
通用图目录
相比于无环图,这里强调通用图可能存在环,那么高效的遍历算法就是通用图看重的了。
文件系统安装
文件系统在被系统使用前必须安装(mount,也叫挂载)
安装步骤:
- 操作系统需要知道设备名称和文件系统的安装位置(称作安装点,mount point)
- 操作系统验证设备是否包含一个有效的文件系统:通过设备驱动程序读入设备目录,验证目录是否含有期望的格式
- 操作系统在其目录结构记录:一个文件系统已安装在给定安装点上。
通常,系统不允许在包含文件的目录上安装文件系统,或者安装后目录中其他已存的文件不可见,直到文件系统被卸载,如上图,users目录下的文件在文件系统被安装后被隐藏了。
文件共享
多用户共享文件时产生的问题:
- 需要将共享扩展到多个文件系统如远程文件系统
- 对共享文件的冲突操作需要采取什么措施
多用户
为了实现共享和保护,多用户系统必须必单用户系统维护更多的文件和目录属性,现在绝大多数操作系统都采用了文件(或目录)拥有者(或用户)和组的概念
**拥有者:**目录最高控制权的用户,可以改变属性和授权访问
**组属性:**定义对文件具有相同权限的用户子集。
一个文件或目录的拥有者ID和组ID(group ID)与其他文件属性一同保存,当用户请求文件操作时,用户ID可与拥有者ID和组ID进行比较,用ID对应的权限进行比较,以决定请求是允许还是拒绝。
远程文件系统
- 通过程序(FTP)进行文件的人工传输
- 通过分布式文件系统,远程目录可以从本机直接访问
- 通过万维网获取对文件的访问(是对FTP的包装)
客户机-服务器模型
该模型允许客户端从服务器远程安装文件系统,根据客户端和服务端的实现,一台服务器可以服务多个客户机,一台客户机可以使用多个服务器。
服务器有可能会被客户端的身份验证欺骗,但如果采用加密密钥,则会因为兼容性等问题导致验证困难,因此大多数采用不太安全的验证。
NFS是标准的UNIX下的客户端-服务端文件共享原型,CIFS是WINDOWS下的。
文件操作的系统调用会被转换成相应的远程操作。
安装了远程文件系统后,文件操作请求代表用户通过网络按照DFS协议发送到服务器。
分布式信息系统
也叫分布式命名系统,用来提供远程计算所需的信息的统一访问。
**域名系统:**为整个Internet提供了主机名称到网络地址的转换。
故障模式
本地文件系统会因为各种原因出错,包括磁盘,目录结构,磁盘管理信息(元数据)的损坏,磁盘控制器故障等。
而远程文件系统具有更多的故障模式,包括网络故障或者服务端故障等。对于这些故障,客户机系统不应该将其像本地文件系统一样处理。
绝大多数DFS协议强制或者允许延迟对远程主机的文件系统操作。而要恢复这种操作,在客户端和服务器之间需要一定的状态信息,如哪些文件系统已输出,哪些文件系统被安装了,哪些文件被打开了。
其中NFS通过在协议中携带所有的信息来采用无状态DFS,这些信息能够定位适当的文件,并执行所请求的文件操作。
采用无状态DFS比较容易恢复,但安全性较差。
一致性语义
**一致性语义(consistency semantics)**是评估文件系统对文件共享支持的一个重要准则。这是描述多用户同时访问共享文件时的语义。
UNIX语义
- 一个用户对已经打开的文件进行写操作,可以同时被其他打开文件的用户看见。
- 有一种共享模式允许用户共享文件当前的指针,这样一个用户移动指针的同时会影响其他用户。这里一个文件具有一个映像,它允许来自不同用户的交替访问。
采用UNIX语义,一个文件与单个物理映射相关联。这样多个用户对单个映像的竞争会导致延迟。
会话语义
- 一个用户对打开文件的写操作无法对立即被其他打开文件的用户所见。
- 一旦文件关闭,对其的修改只能被以后打开的会话所见,已经打开文件的用户不能看见这些修改。
采用会话语义,一个文件可能同时与多个不同的物理映射相关联。这样用户的访问调度上基本没有任何限制。
不可修改共享文件语义
一旦一个文件被创建者声明共享,那么它就是只读的,其特性为:
- 文件名不能重用
- 文件内容不可修改
保护
对于保存在计算机系统的信息,需要保护其不受物理损坏(可靠性)和非法访问(保护)
可靠性是通过文件备份来提供的
而保护有多种方法
访问类型
文件保护的需要是允许访问的直接结果,如果系统不允许对其他用户的文件进行访问,也就不需要保护了。因此,一个极端的方法是通过禁止访问可以提供完全保护。另一个极端则是不加保护,允许自由访问。
这两种极端肯定不适合普遍使用
因此需要控制访问(controlled access)。
能够被控制的操作(即访问的类型)有:
- **读:**从文件中读
- **写:**从文件中写
- **执行:**将文件装入内存并执行
- **添加:**将新信息添加到文件结尾部分
- **删除:**删除文件,释放空间
- **列表清单:**列出文件名称及其属性
另外还包括重命名,复制,编辑等
访问控制
解决保护问题最常用的方法是根据用户身份进行控制,而实现基于用户身份访问的最普遍的方法是为每个文件和目录增加一个访问控制列表(access-control list,ACL),以给定每个用户名及其所允许的访问类型。
用户的类型可以有以下几种:
- 拥有者:创建文件的用户
- 组:一组需要类似权限的用户形成的工作组
- 其他:系统内的其他用户
其他保护方式
- 为文件/目录添加密码
- 对于多层目录结构,还需要提供一种机制用于目录保护