文件共享
目录
参考资料:
在现代计算机系统中,必须提供文件共享手段,即指系统应允许多个用户(进程)共享同一份文件。这样,在系统中只需保留该共享文件的一份副本。如果系统不能提供文件共享功能,就意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空间的极大浪费。
文件共享可以节省存储空间,共享文件只需要一个副本
1基于有向无循环图实现文件共享
1.1 有向无循环图 DAG
在严格的树形结构目录中,每个文件只允许有一个父目录,父目录可以有效地拥有该文件,其它用户要想访问它,必须经过其属主目录来访问该文件。这就是说,对文件的共享是不对称的,或者说,树形结构目录是不适合文件共享的。
树形结构子节点只允许有一个父节点
改进:如果允许一个文件可以有多个父目录,即有多个属于不同用户的多个目录,同时指向同一个文件,虽会破坏树的特性,但这些用户可用对称的方式实现文件共享,而不必再通过其属主目录来访问。
为了文件共享,允许子节点有多个父节点
下图示出了一个有向无循环图,它允许每一个文件都可以有多个父目录。如图中的文件 F8 有三个父目录,它们分别是 D5、D6 和 D3,其中 D5 和 D3 还使用了相同的名字 p ,目录 D6 有两个父目录 D2 和 D1。
我们知道,当有多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到多个用户的父目录中,才能方便地找到该文件。
现在的问题是,如何建立父目录 D5 与共享文件 F8 之间的链接呢?
如果在文件目录中所包含的是文件的物理地址,即文件所在盘块的盘块号,则在链接时,必须将文件的物理地址拷贝到 D5 目录中去。但如果以后 D5 或 D6 还要继续向该文件中添加新内容,也必然要相应地再增加新的盘块,这些是由附加操作 Append 来完成的。而这些新增加的盘块也只会出现在执行了操作的目录中。
如果 D5 往文件 F8 中增加了内容,那么新增加的内容只会保存在 D5 中,不会被 D6 和 D3 共享
可见,这种变化对其他用户而言,是不可见的,因而新增加的这部分内容已不能被共享。
1.2 利用索引结点
为了解决新增内容不能被共享问题,可以引用索引结点,即诸如文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针。
此时,由任何用户对共享文件所进行的 Append 操作或修改,都将引起其相应结点内容的改变(例如,增加了新的盘块号和文件长度等),这些改变是其他用户可见的,从而也就能提供给其他用户来共享。
该方式删除共享文件时,如果没有进行特殊处理,会出现悬空指针,因为共享目录都拥有文件的索引结点
2利用符号链接
利用符号链接实现文件共享的基本思想,同样允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其它的几个父目录都是通过符号链接方式与之相链接的(简称链接父目录)。
这样做的最大好处是,属主结构(用实线连接起来的结构)仍然是简单树,这对文件的删除、查找等都更为方便。
保留了文件结构的树结构
那么,如何利用符号链实现共享呢?
为使链接父目录 D5 能共享文件 F8,可以由系统创建一个 LINK 类型的新文件,也取名为 F(8),并将 F(8) 写入链接父目录 D5 中,以实现 D5 与文件 F8 的链接。在新文件 F(8) 中只包含被链接文件 F8 的路径名。这样的链接方法被称为符号链接。
使用 Link 文件进行共享
新文件 F(8) 中的路径名则只被看做是符号链。当用户通过 D5 访问被链接的文件 F8,且正要读 LINK 类新文件时,此要求将被 OS 截获,OS 根据新文件中的路径名去找到文件 F8,然后对它进行读(写),这样就实现了对文件 F8 的共享。
符号链中只有路径名,使用 link 文件作为载体
**符号链方式的优点:**在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针;而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一共享文件后留下一悬空指针的情况。当文件的拥有者把一个共享文件删除后,如果其他用户又试图通过符号链去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,于是再将符号链删除,此时不会产生任何影响。
不会产生悬空指针
符号链方式的问题:读共享文件时,系统根据给定的文件路径名逐个分量(名)地去查找目录,直至找到该文件的索引结点。因此,在每次访问共享文件时,都可能要多次地读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链,而由于链本身实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引结点,这也要耗费一定的磁盘空间。
多次读盘+消耗磁盘空间