

这个小节开始学习文件的物理结构,也就是文件分配方式相关的一系列问题,这个小节的内容十分重要,在历年的考试当中,都经常出现两到三题的选择题,甚至经常会在大题当中进行考察,所以这个小节的内容会讲的比较细致,会补充一些课本上没有提到的点。

在之前的学习当中知道,操作系统它作为最接近硬件的一个软件层次,需要对硬件进行管理,包括外存,也就是磁盘进行管理。操作系统对磁盘的管理主要是需要做这样两件事,第一,是需要对非空闲磁盘块进行管理,非空闲磁盘块也就是存放了文件数据的那些磁盘块,这就是这个小节要重点探讨的文件物理结构,文件分配方式的问题。另外还需要对空闲的磁盘块,也就是暂时还没有存放任何数据的那些磁盘块进行管理,这是之后的小结会探讨的文件存储空间管理的问题。那这个小节我们先看上面这个问题。
其实文件物理结构或者说文件分配方式要探讨的就是文件的数据到底应该怎样存放在外存中,这些数据应该被怎样组织起来的一个问题。总共会分为这样的三种方式,连续分配、链接分配和索引分配,其中链接分配又可以进一步细分为隐式链接和显式链接这样的两种。在这个视频当中,我们首先探讨连续分配和链接分配这两种方式,索引分配会在下个小节中再进行讲解。

在正式开始之前,我们需要先补充几个比较重要的知识点。在之前我们简单的提到过类似于内存分页,磁盘中的这些存储单元会被分为一个个大小相等的块,这些块也可以称为磁盘块或者物理块,相应的,系统也会为这些磁盘块进行一个编号,像这个是零号块,这个是一号块,以此类推。另
外在很多操作系统当中,磁盘块的大小会设置的和内存块、内存页面的大小相同,这么做是有好处的。因为内存和外存之间的数据交换,也就是对磁盘的读写操作都是以块为单位进行的,每次读入一块,或者每次写出一块,如果说能够保证外存的一个磁盘块和内存的一个内存块的大小是相等的,进行这种数据交换的时候就会很方便。

在之前内存管理那个章节中,我们学习过进程的逻辑地址空间会被划分为一个一个的页面,这样可以方便操作系统对进程进行管理。相应的,在外存管理当中,为了方便对文件数据的管理,文件的逻辑地址空间也会被划分成一个一个大小相等的文件块,因此文件的逻辑地址也可以表示为逻辑块号和块内地址的形式,这就类似于一个进程的逻辑地址可以表示为页号和页内地址的形式,就像左图这个样子。假设这个系统当中一个物理块的大小是1KB,一个1M 字节大小的文件就可以分割为 1K个块,所以这个文件的逻辑括号应该是从零到一零二三,总共1K个块号,并且每一块的大小都是1KB这么大,因此用户在操作自己的文件的时候,可以用逻辑块号,还有块内地址这样的形式,就可以定位到自己文件当中的任何一个位置。这个文件的数据被分为一个一个的逻辑块之后,操作系统为文件分配存储空间也都是以块为单位进行的,比如说逻辑块号为零的这个块被放到了物理块号为四的这个磁盘块当中,然后逻辑块号为一的这个块放到了这个位置,逻辑括号为一零二三放到这个位置。不过用户对于自己的文件的这些各个逻辑块到底存放到了什么地方,这个信息用户是不可知的。因此,用户在操作自己的文件的时候,是使用的是逻辑块号和块内地址这样的形式,于是
操作系统就需要负责把用户提供的这个逻辑块号和块内地址转换为这个文件块实际存放的物理块号和块内地址,这也是文件的分配方式,文件物理结构这个部分需要重点关注的核心问题,怎么把逻辑块号映射为物理括号。

首先来看第一种文件分配方式,连续分配,连续分配方式的思想很简单,要求每个文件在磁盘上占用一组连续的块。比如说一个文件aaa,它在逻辑上可以分为这样的三个块,如果说采用连续分配方式的话,这些逻辑上相邻的块在物理上也必须相邻,也必须是占用一组连续的块,并且依然需要保持这些块之间的这种相对顺序。比如说零号逻辑块放到了四号物理块当中,一号逻辑块放到了五号物理块当中,二号逻辑块放到了六号物理块当中。接下来我们要注意的问题是,如果采用的是这种方式的话,操作系统应该如何实现从逻辑块号到物理块号的这种映射和转变呢?首先我们需要明确的是,用户在操作自己的文件的时候,使用的是逻辑块号,块内地址这样的一个逻辑地址。其实块内地址是不需要转变的,因此操作系统只需要关心逻辑块号到物理块号的映射就可以了,为了实现这个地址映射的功能,在文件的目录表当中必须记录两个文件的属性,第一是一个文件存放的起始块号,第二是这个文件的长度,也就是它总共占用了多少个块。比如说像aaa这个文件,它的起始块号是四,并且它占用了连续的三个块,因此它的长度是三,而bbb另外一个文件,它的起始块号是十,它占用了连续的四个块,因此它的长度又是四。有了这些信息,操作系统就可以完成地址转换的事情了。假设用户给出了他想要访问的逻辑块号,操作系统需要先找到这个用户想要访问的文件对应的目录项,也就是FCB,在这个FCB当中就可以知道文件存放的起始块号,再用起始块号加上用户提供的逻辑块号,就可以得到这个块存放的实际的物理块号了。比如说这个用户想要访问aaa这个文件的逻辑括号为二的这个块,逻辑块号二,加上它的起始块号四,就得到物理括号六。从这个图当中,我们也可以看到逻辑块号为二的这个块确实是存放在物理块号为六的这个位置的,当然操作系统还需要验证用户提供的这个逻辑块号是否合法,它是否已经超过了这个文件的实际长度,所以通过刚才的这个分析我们会发现,如果采用的是连续分配方式的话,只要用户给出了自己想要访问的逻辑块号,操作系统就可以直接根据逻辑块号算出它对应的物理块号到底是多少,因此我们说连续分配方式是支持顺序访问和直接访问,也就是随机访问的。所谓的顺序访问,就是指如果我要访问逻辑块号二的话,我必须先顺序的访问逻辑块号零和逻辑块号一,之后才能找到逻辑块号二,这是顺序访问。而所谓的直接访问或者说随机访问就是指,如果我要访问逻辑块号二的话,
我并不需要访问其他的这些块,我可以直接找到逻辑块号二存放的位置,所以这是顺序访问和直接访问的含义。支持直接访问或者说随机访问也是连续分配方式最大的一个优点。

再来分析连续分配方式的第二个优点,这个地方需要用到一个现在暂时还没有讲过的知识点。磁盘这种硬件想要读取一个磁盘块的时候,需要把磁头放到磁盘块相应的位置,而访问不同的磁盘块是需要移动磁头的,并且如果两个磁盘块的距离越远,移动磁头所需要的时间就越长。比如说我现在需要连续的读这三个黄色的块,首先是把磁头放到第一个块的位置,之后移动到第二个块的位置,再之后移动到第三个块的位置,所以由于这三个块它们之间在物理上是相邻的,也就是它们相距距离是最短的,因此这个移动的过程其实磁头的移动距离也是最短的。而假如我们此时想要读取的是紫色的这三个磁盘块的话,首先需要把磁头移动到第一个这个块对应的位置,读完了第一个块之后,需要移动磁盘,移动到第二个位置,读完第二个磁盘块之后,也需要再移动磁盘,然后把它移动到第三个块的位置。因此如果这些块不相邻的话,读取一个块和下一块之间所需要的移动磁头的时间就会更长,因此基于这个分析我们知道,如果一个文件采用的是连续分配的方式的话。我们在顺序的读取这个文件的各个块的时候,所需要的读写时间是最短的,读写速度是最快的,因为整个过程所需要的磁头移动距离是最短的。这个知识点还会在之后再进行进一步的探讨,这个地方只需要理解连续分配的文件在顺序读写的时候速度最快,只需要理解这一点就可以了。这是连续分配方式的第二个优点。

接下来看一下连续分配方式有哪些缺点?假设在这个图当中,黄色的部分是一个文件a所占用的连续的三个块,绿色的部分是空闲的块,橙色的区域表示其他的文件已经占用的磁盘块,如果说此时文件a想要拓展,也就是说想要再增加一个磁盘块的话,由于连续分配要求为一个文件分配的是连续的块,而文件a后面的这个相邻的块,此时已经被别的文件所占有了。因此如果要拓展文件a的话,我们不得不把文件a的数据整体的迁移到另外的这个有连续的四个块的这个区域当中。

也就是上图这个样子,进行数据迁移的这个过程,是需要耗费很大的开销的,所以我们得出一个结论,由于连续分配方式要求文件在磁盘上占有的必须是一组连续的块,因此对文件的拓展是很不方便的,这是它的一个缺点。

再来看第二个缺点,假设此时在这个图当中,橙色的这些区域表示的是非空闲块,而绿色的这些区域表示的是空闲磁盘块,此时会发现这总共有五个空闲的磁盘块,假如说此时要创建一个新文件,这个文件的大小需要占用三个磁盘块,由于这个文件它采用的是连续分配的方式,因此由于此时整个磁盘当中并没有连续的三个空闲块,因此我们没有办法为这个文件分配足够的这个存储空间。相应的,假设这个系统当中有很多文件都是大于一个块这么大小的,这些空闲的、离散的块就很难被利用起来,所以如果说物理上采用这种连续分配的方式的话,存储空间的利用率会低,会产生难以利用的磁盘碎片,而这些磁盘碎片就有点类似于在之前内存管理当中讲过的那种外部碎片,处理这些碎片的方式也和处理外部碎片的思想是一样的,可以用紧凑的方式来解决。不过紧凑就意味着需要移动大量的这些磁盘块的内容,这个过程是需要花费很大的时间代价的,因此会产生磁盘碎片这个问题,也是连续分配方式一个很明显的缺点。

所以连续分配方式要求每个文件在磁盘上占用一组连续的块,它的优点是支持顺序访问和直接访问,也就是随机访问,并且连续分配的文件在顺序访问时速度是最快的,但是它也有一些缺点,就是不方便文件的拓展存储空间,利用率低,会产生磁盘碎片。这是连续分配方式需要掌握的一些知识点。

接下来看第二种文件分配方式,链接分配,链接分配采取的是离散分配的这种思想,可以为文件分配离散的磁盘块,然后用指针链接的方式把这些磁盘块都给串联起来,而链接分配方式又可以进一步分为影视连接和显式链接两种。

首先来看隐式链接这种方式,如果采用的是这种方式的话,在文件的目录项,也就是文件对应的 FCB当中,需要记录这个文件的起始块号,还有结束块号。另外各个块之间都会用一定的存储空间存储指向下一块的这个链接指针,当然最后一个块是没有指向下一块的链接指针的,而这些指针对于用户来说是透明的。采用这种方式的话,怎么实现逻辑括号到物理括号的转变呢?用户首先给出他要访问的逻辑括号i,操作系统会根据文件名找到它对应的FCB这个目录项,找到这个文件的起始块号,于是操作系统可以先读入这个文件的起始块,而这个块就是逻辑上的零号块,因为只有把这个块读入内存之后,才可以知道这个块指向下一块的指针的数据到底是多少,只有这样才可以再调入下一个块,于是下一个块调入内存之后,也可以再继续知道再下一个块存放的位置,于是再读入再下一个块,然后以此类推。因此如果说我们想要访问逻辑括号为i的这个逻辑块的话,操作系统首先需要先依次的读入零号到i-1号逻辑块,才可以找到i号块存放的位置,因此访问i号逻辑块总共需要i+1次磁盘I/O操作。因此我们得到的结论是,如果采用的是链接分配隐式链接的这种方式的话,这种文件它只支持顺序访问,不支持随机访问,也就是说如果我想要访问i号逻辑块的话,我只能先顺序的访问零到i-1号块才可以。因此这种方式带来的问题就是查找的效率很低,另外每一个块当中也需要耗费一定少量的存储空间,来存放指向下一个块的这个指针内容。

接下来考虑下一个问题,采用这种方式是否方便拓展文件呢?假设此时这个文件需要拓展,也就是需要再给它分配一个新的磁盘块,由于这个文件的这些块可以是离散分配的,因此只需要从这个磁盘中随便找出一个空闲的块,把它挂到这个文件的链尾就可以了。比如说此时给文件再新分配了一个八号块,于是把八号块挂到这个链的链尾,操作系统会修改这个文件FCB的结束块号这个内容,把结束块号设为八号。所以可以看到采用这种方式的话,文件的拓展是很方便的,并且这种方式不会产生碎片问题,外存的利用率很高。

经过刚才的分析,我们知道了隐式链接的链接分配有这样的一些优点和缺点,这就是刚才得到的结论,这就不再赘述。

接下来我们再来看显式链接的链接分配方式,这种方式会把用于链接文件各个物理块的指针,显示的存放在一张表当中,这个表就被称为文件分配表,英文缩写是FAT,磁盘当中的各个块的先后顺序都是统一记录在文件分配表当中的,所以一个磁盘它有多少个块,在这个文件分配表当中就相应的会有多少个表象。假设此时有一个新创建的文件,文件名是aaa,它依次占用了2、5、0、1这样的几个物理块,在aaa这个文件的FCB,也就是目录项当中,需要记录这个文件aaa它存放的起始块号,起始块号是二号块,另外在这个文件分配表当中会显示的记录文件aaa它这几个物理块的一个链接关系。比如说二号块是起始块,二号块的下一块是五号块,所以FAT的这个表象,二号块的下一块就应该记录为五,五号块的下一块是零号块,所以五号块的下一块,这个表象记录为零,零号块的下一块是一号块,所以这个地方记录为一,而一号块是最后一个块,所以一号物理块的下一块这个数据可以把它设置为一个特殊的值,比如说是负一,用来表示这就是这个文件的结尾。这样的话就完成了2、5、0、1这样的一个顺序的记录。同样的,假设有一个文件bbb,它依次存放在4、23和3这样的几个盘块当中,bbb这个文件对应的FCB当中需要记录它的起始块号是4号块,4号块的下一个块是23,所以这个表象应该记录为23,23号块的下一块是3号块,所以这个地方记录为3,3号块是文件的末尾,所以这个地方记录为负一。这样的话也完成了bbb这个文件4、23、3这样的一个顺序的记录。所以这种方式把每个文件的各个盘块的链接信息显示的、统一的放在了这样的一个文件分配表FAT当中,所以这是它为什么称作显式链接的一个原因。从这个地方可以看到,一个磁盘仅需要设置一张FAT就够了,每个文件的这些盘块的先后顺序都是统一的存放在这张表当中的,并且在开机的时候,FAT文件分配表它会被读入内存,并且会一直常驻内存,而FAT的这些一个一个的表象在物理上是需要连续存储的,并且每一个表象的长度相同,比如说下一块这个数据可以用四个字节来表示,所以物理块号这个字段可以是隐含的。

接下来再来看采用这种方式的话,怎么实现文件逻辑块号到物理块号的一个转变呢?一个用户给出他想要访问的逻辑块号i,操作系统首先需要找到这个文件对应的目录项,也就是他的FCB,找到这个文件的起始块号,起始物理块号。比如说一个用户想要访问的是文件aaa的二号逻辑块,操作系统首先找到aaa这个文件的零号逻辑块存放的物理块号是二,接下来系统会查询内存当中的文件分配表,找到这个表象就可以知道零号逻辑块的下一个块,也就是一号逻辑块应该是存放在五号物
理块当中的,接下来会继续查询这个表象,发现一号逻辑块的下一块,也就是二号逻辑块是存放在零号物理块当中的,于是查询到这个位置就知道,这个用户想要访问的aaa这个文件的二号逻辑块存放的物理块号了。由于FAT它是常驻内存的,因此查询FAT的过程并不需要读磁盘操作,所以通过这个分析,我们得出这样的结论,采用显式链接的链接分配方式的话,这种文件它既支持顺序访问,也支持随机访问,我们想要访问 i 号逻辑块,并不需要顺序的依次访问零到i- 1号逻辑块,可以直接通过FAT表查到 i 号逻辑块存放的地址,并且由于这个查询的过程并不需要访问磁盘,所以相比于隐式链接的那种方式来说,采用显式链接,访问速度会快很多。显然这种方式也不会产生外部碎片,并且可以很方便的实现对文件的拓展。

因此通过这一系列分析,我们知道了显式链接的优点和缺点,我们需要特别注意的是,一个磁盘只会对应一张文件分配表,并且在开机的时候,这个文件分配表就会被读入内存,并且常驻内存,因此查询文件分配表的过程并不需要读磁盘操作,所以这也造就了显式链接方式支持随机访问,并且在这个地址转换的过程当中,访问效率更高的一个特点。不过它的缺点就是这个文件分配表需要占用一定的存储空间。大家需要注意的是,如果题目当中没有明确的告诉我们到底是显式链接还是隐式链接,如果它只是简单的提到链接分配的文件,我们默认它指的是隐式链接的链接分配方式。
这就是这个小节的全部内容,我们介绍了连续分配和链接分配两种方式,链接分配又可以进一步分为隐式链接和显式链接,所有的知识点的总结会放到下一个小节介绍完索引分配之后再统一的进行。
以上就是这个小节的全部内容。
文件物理结构与分配方式解析

被折叠的 条评论
为什么被折叠?



