417_文件共享
# 4.1_7_文件共享
各位同学大家好,在这个小节中我们会学习操作系统应该怎么实现文件共享的功能,用户可以使用操作系统提供的文件共享功能,然后方便的实现多个用户共享的使用同一个文件这样的事情。
那文件共享的实现方式有这样的两种,一种是基于索引节点的共享方式,又叫硬链接的方式,另一种是基于符号链的共享方式,又叫软链接的共享方式。
这个地方大家需要注意,多个用户共享同一个文件意味着系统当中其实只有一份文件数据,并且只要某一个用户修改了这个文件数据,其他用户也可以看到文件数据的变化,
而与共享比较容易混淆的是复制的概念。如果是多个用户都复制了同一个文件的话,那么系统当中其实是有好几份文件数据,其中一个用户修改了自己的那一份文件数据,其他用户的文件数据其实并不会受到影响,所以这是复制和共享的一个区别。
# 硬连接
接下来我们来介绍实现共享的第一种方式,也就是基于索引节点的共享方式,硬连接的方式。索引节点的知识咱们是在之前文件目录的小节当中进行介绍的,它其实就是一种文件目录的瘦身策略。由于我们在根据路径检索文件的时候,只需要使用文件名,所以我们可以把除了文件名之外的其他信息都放到索引节点当中,这样的话目录项就可以变得更小,它只需要包含文件名,还有指向索引节点的一个指针就可以了。
采用索引节点的这种策略能够带来什么好处,大家还能不能回忆起来呢?假设此时有一个用户 user1,他创建了一个新的文件叫做 AAA,那么这个文件会对应一个索引节点,并且这个索引节点当中会包含这个文件的物理地址,还有文件相关的其他的一些属性,也是包含在索引节点当中的。
另外索引节点当中还会设置一个叫做链接计数的变量,就是这个地方的 count 用于表示此时链接到这个索引节点上的用户目录项到底有多少个,什么意思呢?假设此时有第二个用户,他想共享的使用这个文件,那么用户的目录当中也会有一个目录项是指向这个文件的索引节点的,由于此时有两个目录项是指向索引节点的,所以 Count 的值应该加一也就是变成二,count 等于 2,也就说明此时有两个用户正在共享的使用这个文件。
这就是基于索引节点的共享方式,就是要让不同用户的目录项指向同一个文件的索引节点,并且在这个地方大家会发现,不同的用户对于这个文件起的名字其实是可以不同的,在用户一的目录下这个文件名叫 AAA,而用户二的目录下这个文件名叫 BBB,
如果说采用的是这种共享方式的话,在删除文件的时候需要注意一些小细节,如果一个用户决定删除这个文件,那么其实系统在背后做的只是删除了用户对应的文件的目录项,然后把这个链接给断掉,相应的索引节点的 count 值也需要减一,不过由于此时 count 的值是大于 0 的,说明此时还有别的用户正在使用这个文件,因此并不可以直接把这个文件的数据给干掉,除非 count 值变为了 0 的时候,这个文件还有它的索引节点,这些数据才可以真正的从系统当中删除。所以这是硬连接的共享方式当中,在删除文件的时候需要注意的一个细节。
# 软链接
接下来我们来看第二种,基于符号链的这种共享方式,又叫软链接的共享方式,我们还是接着刚才的例子继续往下分析。假设此时系统中有两个用户,user1 和 user2 正在使用硬链接的方式在共享的使用文件一,而另一个用户 user3 想使用软链接的方式来共享这个文件一,那么 user3 会建立一个新的文件,这个文件是一种特殊的 link 型的文件,这个文件当中记录了文件一的存放路径,比如说我们可以通过 c:/user1/AAA 这样的路径找到文件一,当然这个地方的存放路径也可以保存为 c 盘下面的 user2 这个目录,然后再下面的 BBB 这个文件,用这样的路径也是可以找到文件一的。
其实这种 link 类型的文件就有点类似于 windows 操作系统当中的快捷方式。 user3 想要访问 CCC 这个文件的时候,操作系统首先是判断 CCC 它属于 link 类型的文件,于是会根据这个文件当中记录的路径的信息,一层一层的来查找目录,然后最终找到 AAA 目录项,于是就可以开始访问文件一了,
因此如果采用的是软链接的共享方式的话,并不是把自己的目录项直接指向文件的索引节点,而是创建了一个新的 link 型的文件,然后 link 型的文件当中记录了文件的存放路径,之后操作系统会根据这个路径来找到想要共享的文件。
我们来看一下 windows 操作系统当中快捷方式的例子,比如说我的 QQ 程序是安装在这样的一个路径下的,然后在这个路径下有个 QQ 的启动程序点 exe 的一个文件,我们可以右键点击这个点 exe 文件,然后发送到桌面快捷方式,于是在桌面当中就会出现一个这样的快捷方式,并且我们可以给快捷方式随便取一个名字,
之后大家可以单击右键,然后查看一下快捷方式的属性。大家就会发现快捷方式其实就是用软链接,也就是用一个路径的方式把它链接到了 QQ 的启动程序那个地方。当我们双击桌面上的快捷方式的时候,其实操作系统会判断它是一个快捷方式类型的文件,也就是一种 link 类型的文件,于是会根据这个文件当中记录的路径信息来一层一层的往下检索目录,最终找到 QQ 的启动程序。大家在休息的时候可以自己试一下 windows 操作系统快捷方式的属性这些东西,然后通过你就可以理解软链接到底是怎么回事了。
接下来我们再来分析一下,如果采用软链接的方式共享文件的话,删除一个文件会不会对软链接进行造成什么影响?假设此时 user1 和 user2 都不再需要使用文件一,由于此时 Count 值变为了 0,因此这个文件还有它的索引节点就可以直接被干掉了。那此时如果 user3 访问 CCC 这个 link 型的文件,同样的操作系统首先会检查 c 盘下面的 user 这个目录,然后尝试从中找到 IAA 这个文件对应的文目录项。但是由于此时 AAA 目录项已经被删除了,所以通过这个路径其实已经找不到文件一了,因此软链接就失效了。
我们还是结合 windows 操作系统为例,我们把路径下的 QQ 的启动程序把它给删除。此时如果我们双击打开桌面上的快捷方式的话,操作系统就会提示我们此快捷方式所指向的项目 QQ .exe已经删除,也就是说通过软连接当中记录的路径已经找不到这个文件了,这个文件已经被删除了,因为这个文件名对应的目录项已经没了。
# 小结
那么这就是硬链接和软链接这两种文件共享方式。大家需要重点理解的是硬链接这种共享方式,在删除文件的时候需要注意的一些事情,只有 count 的值变为 0 的时候,才可以真正删除文件的数据,还有文件的索引节点,否则会导致指针悬空的情况。
而转链接或者叫符号链接的这种共享方式,大家只需要自己回去玩一下自己的 windows 操作系统的快捷方式,其实就可以理解了。它无非就是在 link 型文件当中记录了我们要共享的文件存放的路径到底是什么,然后操作系统会根据路径一层一层的查找目录,最终就可以找到需要共享的文件。
不过需要注意的是,如果软链接所指向的共享文件已经被删除的话,那么 Link 型的文件其实依然是存在的,只不过通过这个文件当中记录的路径,再去查找共享文件的时候,就会发生查找失败的情况,因为此时已经找不到共享文件所对应的目录项了。另外由于软连接这种方式,每一次在访问共享文件的时候都需要一层一层的去查询目录。通过之前的讲解,大家也知道在一层一层的查询目录的过程当中,其实是需要磁盘的 lO 操作的,因此通过软链接的方式去访问一个共享文件的速度,会比硬链接要更慢。