诶..朋友们好啊,我是图南在线零壹考研打工人--学长K,刚才有个朋友问我,自己的研友啪就学会了文件系统,很快啊,这是发生甚么事了?我说怎么回事,给我发了几张截图。我一看!嗷~原来昨天,有两个年轻人,二十出头,做模拟题,一个考了八十多分,一个没及格。塔姆说,诶......有一个说是我看参考书把文件系统学废了,学长K你能不能教我复习功法,诶......帮助学习一下文件系统。我说,可以。我说你在图书馆死学,不顶用,他不服气。诶...我说小同志,你关注图南在线找一篇《十分钟彻底搞懂文件系统》看一看。他说你这也没用。我说我这个有用,这是化劲儿,考研复习是讲化劲儿的,四两拨千金。他打开手机把文章看完,啪就站起来了,很快啊!然后上来就做了一道题,然后一道选择题,一道简答题,全部做对了。他说他是乱做的,他可不是乱做的啊,看了零壹考研的《十分钟彻底搞懂文件系统》,那就是有备而来......
文件系统是操作系统中重要的子系统,是计算机考研操作系统部分的重要考点,同时也是大家普遍反映比较难的一个章节。市面上流行的参考书往往着重对进程管理、内存管理的讲解,而对文件系统的讲解往往显得杂乱无章、内容混乱。我们将通过这篇文章来帮助大家梳理和理解这部分的内容。
01
文件与文件系统
计算机中的“文件”的概念,相信大家都很熟悉,一篇doc文档,一张jpg图片,一个c代码文件......都可以作为一个文件。
文件有什么用
计算机中的文件主要用来解决一个问题:长期存储信息。
所谓长期存储信息是相对于在进程的地址空间中保存信息而言的,两种方式的对比如下:
在进程的地址空间中保存信息 | 使用文件存储信息 |
由于自身虚拟地址空间的限制,存储容量较小 | 可以存储在大容量介质中,存储容量大 |
进程终止时(正常终止或意外消亡),保存的信息随之消失 | 独立于进程之外,进程终止后信息依然存在 |
保存的信息仅属于一个进程 | 可以实现多个进程并发访问其内容 |
ps:考研中文件系统部分的存储介质除特别说明一般默认是磁盘。磁盘由于其长期存储的性质,是最常见的一种文件存储的介质,所以磁盘管理通常作为文件系统的一个子内容出现在我们的教科书和参考书中,磁盘管理与磁盘调度也是计算机考研操作系统部分的重要考点。(近年来,固态硬盘(SSD)逐渐流行以来,它相对于传统磁盘读写速度更快、功耗更低,也成为一种常见的文件存储的介质,这部分针对考研,我们只需知道:固态硬盘由Flash芯片组成,而Flash本身属于只读存储器(ROM)的一种。)
这个对比有助于我们理解文件的本质:
文件的本质
文件是一种抽象机制,它提供了一种在存储介质(一般是磁盘)上保存信息而且方便以后读取的方法。
不要小看这句话,文件系统整个章节的内容都是围绕这句话来展开的,即如何在存储介质上保存信息,如何读取信息。
正是为了实现这种抽象机制,操作系统划分出了一块子系统,就是文件系统。
文件系统主要需要解决什么问题
无论是向文件写入信息还是从文件读取信息,首先要找到文件在哪,这就需要目录系统
文件目录中存放什么呢,首先是文件的名字和位置,另外还应当有文件的其他控制信息,这就需要定义文件属性。
找到文件后,我们可以对文件进行哪些操作呢?这就需要我们定义基本的文件操作。
如何从文件中寻找信息?这就需要定义文件结构(文件的逻辑结构)。
上面我们主要考虑的是一位用户对文件的操作,那么多位用户呢?
多个用户在同一个项目里工作,他们常常需要共享文件,即对同一个文件进行操作,如何实现让一个共享文件同时出现在属于不同用户的不同目录下?这就需要提供文件共享的方法。
为了防止文件共享导致的文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取访问,这就需要文件保护。
以上介绍的是逻辑层面的文件系统,这还远远不够,我们要在物理层面实现它:
文件是怎样存储在存储介质上的,即如何给各个文件分配磁盘块,这就需要解决文件实现(或文件分配,文件的物理结构)的问题。目录作为一种特殊的文件,当然也要解决目录的实现。
一些磁盘块被分配给了一些文件,剩余的空闲磁盘块如何管理,已经分配出去的磁盘块如何回收,这就涉及到了文件存储空间管理(即磁盘空间管理)。
理清了这些问题,我们就自然而然地把握住了本章内容的一个知识脉络。文章接下的内容,我们也将基本按上面的思路来展开,不过顺序有所调整:
文件属性
目录系统(包括目录的实现)
文件操作
文件结构(文件的逻辑结构)
文件共享
文件保护
文件实现(文件分配)(文件的物理结构)
文件存储空间管理(磁盘空间管理)
02
文件属性
文件属性与具体的操作系统有关,我们只需知道文件的一些必须的重要属性:
1)文件名:文件的名称,在同一目录下要求唯一。
2)文件的逻辑结构和物理结构的相关信息:如文件的物理地址、大小。
3)文件的存取控制信息:如文件存取权限。
4)文件的使用信息:如文件创建、上次修改、上次访问的时间和用户信息。
......
其中文件名和文件的物理地址是实现文件“按名存取”的关键。
03
目录系统
目录与目录项:
类似于进程控制中的进程控制块(PCB),我们把上面介绍的文件属性也打包为一个数据结构,这就是文件控制块(FCB),使得每个文件都对应一个自己的FCB,并把它作为文件目录的目录项。
如图(为了方便说明,我们把文件名从文件属性中拆分出来,下同):
ps:目录本身也是一个文件。
ps:所有文件的属性信息都保存在目录文件中,且目录文件保存在外存,文件的属性信息在需要时才调入内存。
目录的实现:
目录系统的核心功能,就是实现“按名存取”,即ASCII文件名到文件物理地址的映射,操作系统利用用户提供的文件路径名好到相应的目录项,目录项中提供了查找文件磁盘块所需的信息。
当然除了文件的物理地址,我们也需要从目录项中获得文件的其他属性信息。
这就引出了一个问题,在哪里存放包括文件物理地址在内的文件属性?
事实上,在检索目录文件的过程中,我们只用到了文件名。只有当我们找到我们需要的目录项时,才需要从该目录项读取该文件的物理地址以及其他属性。
也就是说,在检索目录时,文件名以外的其他文件属性信息不会用到,也不需要调入内存。于是我们便可以把文件名和文件的其他属性分开,使得文件的其他属性信息单独形成一个称为索引结点的数据结构。这样,每个目录项仅由文件名和索引结点编号(也叫文件号)构成,而文件属性被放在索引结点里。
如图:
ps:操作系统会在存储文件的外村空间中划分出一个固定区域,用于连续存放所有文件的FCB主部(索引结点)。将其依次编号就是文件号(即索引结点编号)
这样做的好处在于:缩短了目录项的长度 ,在一个磁盘的盘块中可以存放更多的目录项,这就可以减少查找文件时的平均启动磁盘次数,从而节省系统开销。
ps:从目录中查找文件名最简单的方法就是线性查找,也可以通过散列表、高速缓存来提高查找速度,后两者考研只需了解即可。
目录结构:
一级目录系统:在一个目录(根目录)中包含所有文件,在早期的个人计算机中比较普遍,现在主要存在于一些简单的嵌入式设备中。
层次目录系统:单层目录并不能胜任复杂文件系统,我们把文件目录按树形结构来安排,就形成了层次目录系统。这里需要掌握两个概念:
绝对路径:从根目录出发定位文件形成的路径,如:“/用户B/用户子目录B1/文件2”
相对路径:从当前目录出发定位文件形成的路径,如用户C当前处于用户子目录C1,“./用户子目录C11/文件5”就是一个相对路径。
ps:文件共享会导致目录结构成为一个有向无环图而不是一棵树,我们将在文件共享的部分来说明这个问题。
04
文件操作
文件的基本操作
定位到文件以后我们就可以对文件进行我们需要的操作。对于文件的操作不同的操作系统提供了不同的系统调用,对于考研,我们只需了解以下操作:
定位到文件以后我们就可以对文件进行我们需要的操作。对于文件的操作不同的操作系统提供了不同的系统调用,对于考研,我们只需了解以下操作:
create:创建文件,为新文件分配存储空间并在目录中为新文件创建目录项。
delete:删除文件,释放磁盘空间。
open:打开文件,后面详细介绍。
close:关闭文件,后面详细介绍。
read:读文件,从文件的当前位置读取数据,调用者需要指明读取多少数据,并提供存放这些数据的缓存区。
write:写文件,向文件的当前位置写入数据。
seek:指定从何处获取数据,调用结束后就可以从该位置开始读写数据了。
以上这些操作中,打开文件经常出现在计算机考研的选择题中,需要重点掌握。
open(打开文件)
在使用文件之前,必须先打开文件。open调用的目的概括来说是把文件属性装入内存便于后续调用的快速访问。
打开文件步骤:
1)根据文件路径名查文件目录找到FCB主部(即索引结点)。
2)根据打开方式、共享说明和用户身份检查访问的合法性。
3)根据文件号(即索引结点号)查找系统打开文件表看该文件是否已经被打开,如是则共享计数值加1,否则取一个空闲的系统打开文件表项并将外存储器中FCB主部等信息填入此表项,共享计数值置1。
4)在用户打开文件表中取一空表项,填写打开方式等,并指向系统打开文件表的对应表项。
这里我们提到了两种表:系统打开文件表、用户打开文件表。下面我们将对这两种表进行一个简单的介绍:
1、系统打开文件表
FCB中保存着系统对文件进行管理所需要的一切信息,这些信息作为目录项将长期驻留于外存空间。当一个文件被打开使用时,其FCB的信息会被经常访问。如果每次访问FCB都去读写外存储器,则速度会大大降低。为解决这一问题,在内存中设立一个表,用来保存已打开文件的FCB。
系统打开文件表由操作系统管理,用户程序不能访问它。该表的长度决定了系统中可以同时打开的文件的最大数目。
系统打开文件表的示意图如下:
说明:
FCB主部:即内存索引结点,里面有包括文件物理地址在内的文件属性。
文件号(索引结点号):之前讲过,用于得到该文件FCB主部在外存储器中的位置。
共享计数:用于记录当前有多少个进程使用该文件,每个close(关闭文件)操作会使此值减1。
修改标志:用于标识谋文件的FCB在写入内存期间是否被修改过,当最后一个使用该文件的进程关闭该文件时,如果FCB被修改过则要把改动写回外存。
2、用户打开文件表
由于文件是可以共享的,多个进程可能会同时打开同一文件,而其打开方式可能是不同的,当前的读写位置通常也是不一样的。这些信息被记录在另一个表中,该表称为用户打开文件表,每个进程都有属于自己的一个。
用户打开文件表:
文件描述符(fd):就是一个序号,是一个隐含的正整数,用户打开文件表中其实并没有这一项。当文件被打开后,返回给进程,之后进程便可使用fd存取该文件,而不使用文件名称。(选择题常考)
打开方式:进程对该文件执行什么操作。
读写指针:对文件读写的当前位置。
系统打开文件表入口:一个指针,或一个编号,用户进程可以通过它可以定位该文件的FCB在系统打开文件表中的位置。
3、两种表的关系
系统打开文件表和用户打开文件表的关系我们可以通过下图来说明:
至此我们就把文件属性、目录系统、文件操作的内容梳理完毕了。后续部分我们将在下一篇文章中展开。
扫码加入QQ群
你可以加入图南考研的QQ群,群号:862505791,
在这里你可以提出你的任何问题。
同时欢迎你关注我们的公众号:
往期文章链接:
图南在线-零壹考研,只做最专业的计算机考研平台
浙大计院软院工院,学院太多傻傻分不清?我该选择哪一个?
考研倒计时50天,你准备好了吗?
考研or工作,你还在纠结么?
985直博生退学 零基础跨考浙大计算机
我是如何做到从零基础到408计算机考研状元的?
图文编辑:学长K
责任编辑:学长K