内容摘自《计算机操作系统》 汤子瀛 哲凤屏 汤小丹 编著 西安电子科技大学出版社出版

转载请注明上述文字,以尊重原作知识产权。

文件共享与文件保护

当前常用的两种文件共享方法的介绍:

 

基于索引结点的共享方式

   在树形结构的目录中,当有两个(或多个)用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个(或多个)用户的目录中,才能方便地找到该文件,如图6-23所示。此时该文件系统的目录结构已不再是树型结构,而是个有向非循环图DAG(Directed Acyclic Graph)。

 

   如何建立B目录与共享文件之间的链接呢?如果在文件目录中包含了文件的物理地址,即文件所在盘块的盘块号,则在链接时,必须将文件的物理地址拷贝到B目录中去。但如果以后B或C还要继续向该文件中添加新内容,也必然要相应地再增加新的盘块,这须由附加操作Append来完成。而这些新增加的盘块,也只会出现在执行了操作的目录中。可见,这种变化对其他用户而言,是不可见的,因而新增加的这部分内容已不能被共享。

   为了解决这个问题,可以引用索引结点,即诸如文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针,如图6-24所示。此时,由任何用户对文件进行Append操作或修改,所引起的相应结点内容的改变(例如,增加了新的盘块号和文件长度等),都是其他用户可见的,从而也就能提供给其他用户来共享。

 

    在索引结点中还应有一个链接计数count,用于表示链接到本索引结点(亦即文件)上的用户目录项的数目。当count=3时,表示有三个用户目录项连接到本文件上,或者说是有三个用户共享此文件。

   当用户C创建一个新文件时,他便是该文件的所有者,此时将count置1。当用户B要共享此文件时,在用户B的目录中增加一目录项,并设置一指针指向该文件的索引结点,此时,文件主仍然是C,count=2。如果用户C不再需要此文件,是否能将此文件删除呢?回答是否定的。因为,若删除了该文件,也必然删除了该文件的索引结点,这样便会使 B的指针悬空,而B则可能正在此文件上执行写操作,此时将因此半途而废。但如果C不删除此文件而等待B继续使用,这样,由于文件主是C,如果系统要记账收费,则C必须为B使用此共享文件而付账, 直至B不再需要。图6-25示出了B链接到文件上的前、后情况。

 

利用符号链实现文件共享

   为使B能共享C的一个文件F,可以由系统创建一个LINK类型的新文件,也取名为F,并将F写入B的目录中,以实现B的目录与文件F的链接。在新文件中只包含被链接文件F的路径名。这样的链接方法被称为符号链接(Symbolic Linking),新文件中的路径名则只被看作是符号链(Symbolic Link),当B要访问被链接的文件F且正要读LINK类新文件时,此要求将被OS截获,OS根据新文件中的路径名去读该文件,于是就实现了用户B对文件F的共享。

   在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针;而共享该文件的其他用户,则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一共享文件后留下一悬空指针的情况。当文件的拥有者把一个共享文件删除后,其他用户试图通过符号链去访问一个已被删除的共享文件时,会因系统找不到该文件而使访问失败,于是再将符号链删除,此时不会产生任何影响。

   然而符号链的共享方式也存在自己的问题:当其他用户去读共享文件时,系统是根据给定的文件路径名,逐个分量(名)地去查找目录,直至找到该文件的索引结点。因此,在每次访问共享文件时,都可能要多次地读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链,而由于该链实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引结点,这也要耗费一定的磁盘空间。

   符号链方式有一个很大的优点,是它能够用于链接(通过计算机网络)世界上任何地方的机器中的文件,此时只需提供该文件所在机器的网络地址以及该机器中的文件路径即可。

   上述两种链接方式,都存在这样一个共同的问题,即每个共享文件都有几个文件名。换言之,每增加一条链接,就增加一个文件名。这在实质上就是每个用户都使用自己的路径名去访问共享文件。当我们试图去遍历(traverse)整个文件系统时,将会多次遍历到该共享文件。例如,当有一个程序员要将一个目录中的所有文件都转储到磁带上去时,就可能对一个共享文件产生多个拷贝。