首先回顾一下文件打开的过程:
FCB用来存放控制文件需要的各种信息的数据结构,FCB 的有序集合称为文件目录,一个FCB 就是一个文件目录项。
典型的FCB,即一个文件目录项如下:
而UNIX中的目录项如下,每个目录项只包含文件名和索引节点编号,索引节点编号可以看作指针,用来指向索引节点(i节点),索引节点记录了文件的其他信息。
所以在使用open系统调用时,将文件目录项或者文件控制块调入内存都是对的,只是对应操作系统不同而已。
答案:B
以UNIX系统为例,说一下文件打开的过程:
① 用户使用open系统调用。
为什么会有open ():当用户要求对一个文件实施多次读/写或其它操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,引入了open()
怎样使用open():使用文件名检索目录
② 操作系统将该目录项从外存复制到内存中的打开文件表的一个表目中,并将该表目的索引号(也称文件描述符)返回给用户。
③ 当用户再次对该文件发出操作请求时,可通过文件描述符在打开文件表中查找到文件信息。
注意:
① 只要完成了文件打开 open()系统调用,后面再使用 read()、write()、Lseek()、close()等文件操作的系统调用,就不再使用文件名,而使用文件描述符。
② open调用只是在用户打开文件表添加一个表项,并返回给用户索引节点号。而系统打开文件表只有在文件实体第一次被打开时才添加一个表目。也才会通过文件 I/O 将对应的索引节点从磁盘读入内存。
③ 用户打开文件表和系统打开文件表的区别:
(1)系统打开文件表包含与进程无关的信息,如文件在磁盘上的位置、访问日期和文件大小。系统打开文件表只有一个。每个进程的打开文件表保存的是进程对文件的使用信息,如文件的当前读写指针、文件访问权限并包含指向系统表中适当条目的指针。
(2)一旦有进程打开了一个文件,系统表就包含该文件的条目。当另一个进程执行调用 open 时,只不过是在其打开文件表中增加一个条目,并指向系统表的相应条目。
(3)系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打开了该文件。当文件不再使用时,利用系统调用 close 关闭它,会删除单个进程的打开文件表中的相应条目,系统表中的相应打开计数器也会递减。当打开计数器为0时,表示该文件不再被使用,并且可从系统表中删除相应条目。
补充:close就是与open相反的操作,就是将文件控制信息写回磁盘。
硬链接:
如下图所示,用户A,B指向同一个内存索引节点,索引中有一个链接计数 count,也称引用计数,表示链接到本索引节点(即文件)上的用户目录项的数目。当count=2时,表示有两个用户目录项链接到本文件上,即有两个用户共享此文件。
软链接(符号链接):
如下图所示,用户B对应的索引节点指向了一个Link型文件,可以类比“快捷方式”,Link型文件中记录了文件F的路径,他会先找到文件F的目录项,接着根据目录项找到文件F的索引节点,再找到文件F,相当于绕了个圈,所以说硬链接的查找速度比软链接快。
注:软链接Link型文件是不会影响文件索引节点的计数值的,因为它并不拥有指向其索引节点的指针,只是通过文件中记录的文件的路径访问文件而已。
更详细地解释:
在符号链的共享方式中,当其他用户读共享文件时,系统根据文件路径名依次查找目录,直至找到该文件的索引节点。因此,每次访问共享文件时,都可能要多次地读盘,增大了访问文件的开销。此外,符号链接也是一个文件,其索引节点也要耗费一定的磁盘空间。
注:符号链接文件的引用计数值不受被链接文件的影响,始终为1。
硬链接与软链接的区别:
① 硬链接的索引节点指向的是文件本身,软链接的索引节点指向的是一个Link型文件。
② 硬链接索引节点中的count值会根据链接到本索引节点(即文件)上的用户目录项的数目改变,当 count =0时,表示没有用户使用该文件,才会删除该文件。而软链接索引节点值始终为1。
③ 硬链接只要还有一个指针指向索引节点,索引节点就不能删除。
对于软链接,由于用户只有该文件的路径名,并不拥有指向其索引节点的指针。所以不会发生在文件主删除一个共享文件后留下一个悬空指针的情况。当文件主将一个共享文件删除后,若其他用户又试图通过符号链去访问它时,则会访问失败,于是再将符号链删除,此时不会产生任何影响。
答案:A
关于软,硬链接的例题:
① 软链接始终为1。
② 初始F1引用计数(count)值为1,先建立硬连接又删除,则引用计数还为1。
也可以借助这个图理解:
标签:文件,补漏,用户,链接,----,索引,打开,节点 From: https://blog.csdn.net/weixin_69884785/article/details/143457460