分类: 服务器与存储
2010-01-04 12:59:13
现代计算机系统中,必须提供文件共享手段,即指系统应允许多个用户(进程)共享同一份文件。这样,在系统中只需保留该共享文件的一份副本。如果系统不能提供文件共享功能,就意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空间的极大浪费。随着计算机技术的发展,文件共享的范围也在不断扩大,从单机系统中的共享,扩展为多机系统的共享,进而又扩展为计算机网络范围的共享,甚至实现全世界的文件共享。
下面介绍当前常用的两种文件共享方法。
文件系统中的目录项只包含文件名及指向索引结点的指针,而诸如文件的物理地址及其他的文件属性等信息皆存放在索引结点中。如下图1所示,此时,由任何用户对文件进行Append操作或修改,所引起的相应结点内容的改变(例如,增加了新的盘块号和文件长度等),都是其他用户可见的,从而也就能提供给其他用户来共享。
图1
在索引结点中还包含一个链接计数count,用于表示链接到本索引结点(亦即文件)上的用户目录项的数目。当count=2时,表示有两个用户目录项链接到本文件上,或者说是有两个用户共享此文件。
当用户zhao创建一个新文件时,ta便是该文件的所有者,此时将count置1。当有用户qian要共享此文件时,在用户zhao的目录中增加一目录项,并设置一指针指向该文件的索引结点,此时,文件的属主仍然是zhao,count=2。如果用户zhao不再需要此文件,是否能将此文件删除呢?回答是否定的。因为,若删除了该文件,也必然删除了该文件的索引结点,这样便会使qian的指针悬空,而qian则可能正在此文件上执行写操作,此时将因此半途而废。但如果zhao不删除此文件而等待qian继续使用,这样,由于文件的属主是zhao,如果系统要记账收费,则zhao必须为qian使用此共享文件而付帐,直至qian不再需要。下图2示出了qian链接到文件上的前、后情况。
图2
为使B能共享C的一个文件F,可以由系统创建一个LINK类型的新文件,也取名为F(其实是可以随意的),并将F写入B的目录中,以实现B的目录与文件F的链接。在新文件中只包含被链接文件F的路径名。这样的链接方法被成为符号链接(Symbolic Linking)。新文件中的路径名,则被看作是符号链(Symbolic Link),当B要访问被链接的文件F且正要读LINK类新文件时,此要求将被OS截获,OS根据新文件中的路径名去读该文件,于是就实现了用户B对文件F的共享。
在利用符号链方式实现文件共享时,只是文件的属主才拥有指向该索引结点的指针,而共享该文件的其他用户,则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件属主删除一共享文件后留下一悬空指针的情况。当文件的拥有者把一个共享文件删除后,其他用户试图通过符号链去访问一个已被删除的共享文件时,会因系统找不到文件而使访问失败,于是再将符号链删除,此时不会产生任何影响。
然而符号链的共享方式也存在自己的问题:当其他用户去读共享文件时,系统是根据给定的文件路径名,逐个分量(名)的去查找目录,直至找到该文件的索引结点。因此,在每次访问共享文件时,都可能要多次的读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链,而由于该链实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引结点,这也要耗费一定的磁盘空间。
符号链方式的一个很大的优点,是它能够用于链接(通过计算机网络)世界上任何地方机器中的文件,此时只需提供该文件所在机器的网络地址以及该机器中文件路径即可。
上述两种链接方式,都存在这样一个共同的问题,即每一个共享文件都有几个文件名。换言之,每增加一条链接,就增加一个文件名。这在实质上就是每个用户都使用自己的路径名去访问共享文件。当我们试图去遍历(traverse)整个文件系统时,将会多次遍历到该共享文件。例如,当有一个程序员要将一个目录中的所有文件都转储到磁带上去时,就可能对一个共享文件产生多个拷贝。