【王道-第四章-文件管理】

news2024/12/25 23:38:26

#pic_center

R 1 R_1 R1

R 2 R^2 R2

目录

  • 知识框架
  • No.1 初识文件管理
  • No.2 文件的逻辑结构
  • No.3 文件目录
  • No.4 文件的物理结构
  • No.5 逻辑结构VS物理结构
  • No.6 文件存储空间管理
  • No.7 文件的基本操作
  • No.8 文件共享
  • No.9 文件保护
  • No.10 文件系统的层次结构
  • No.11 文件系统的全局结构(布局)
  • No.12 虚拟文件系统

知识框架

No.1 初识文件管理

各位同学大家好,从这个小节开始,我们会开始学习,文件管理相关的这个章节,那么在正式开始学习之前,我们会用这个小节带领大家看一下,平时咱们熟悉的一些文件系统,希望通过这个小节的学习,能够消除对文件,管理这一系列知识点的一个陌生感,还有恐惧感,并且对整个章节的这个,知识框架有一个初步的认识,在之前的学习中,我们已经知道,操作系统它作为系统资源的管理者,也需要对文件进行管理,文件也属于一种系统资源,它其实就是一组有意义的信息,或者说数据的集合,那平时我们在,生活当中也使用过各种各样的文件,比如说手机拍的照片还有像word文档,还有像老师,上课的时候给大家发的那些PPT讲义,PDF文件这些都是各种各样的文件,但是各种各样的文件,它又在我们面前,呈现出了不一样的一些特性,那这些特性,其实也需要操作系统来关心,比如说当我们打开PDF文件的时候,那一般都是用Adobe reader那个,软件来读取这个文件的数据的,另外像我们打开照片这种文件的时候,一般来说都是用,操作系统自带的那种图片,浏览的软件来进行打开的,所以其实不同的文件它有不同的属性,而因为文件的属性不同,所以我们在使用文件的时候也会,有各种各样的差别,所以我们第一个要讨论的问题就是,在计算机当中有各种各样的文件,那这些文件一般来说都,拥有哪些属性呢,第二个问题,第二文件,它是一组有意义的信息,或者说数据的集合,那么这些信息,在内部是怎么被组织起来的,也就是文件内部的这些,数据的组织形式的问题,这是我们第二个要探讨的问题,第三个问题,在我们的系统当中,有很多很多的文件,但是这些文件因为呃,有组织的把它们存放在一起,所以平时我们使用它们的时候,呃也会很方便,所以第三个我们需要讨论的是,这些文件之间应该怎么被组织起来,第4个问题从下往上看,操作系统的上层,应该是应用程序和用户,所以操作系统应该为它的上层提供,简单易用的一些接口,用来方便的操作各种各样的文件,那操作系统应该为上层提供哪些功能,这是我们之后还会探讨的问题,最后一个会探讨的问题从上往下看,操作系统的下面层是硬件,所以操作系统也需要对硬件进行管理,而我们知道,一般来说文件是存放在我们的磁盘,也就是外存当中的,而外存作为一种计算机的硬件,肯定也需要操作系统对它进行管理,那么这些文件的数据,应该怎么被存放在外存上,这是我们最后一个会探讨的问题,那我们首先来看一下,一个文件应该有哪些属性从

image-20230821150533477

我们最熟悉的Windows操作系统出发,我们可以在呃我们自己的电脑当中,随便找到一个文件,然后右键点击属性,之后就会弹出这样的一个窗口,那在这个地方,就可以看到,一个文件到底拥有哪些属性,那首先我们作为普通的用户,其实平时最常关注的应该是呃,文件名这个属性,因为平时我们在,找一个自己想要的文件的时候,那都是根据这些目录一层一层往下找,并且跟找到我们想要的那个文件的名,文件名再打开这个文件,使用这个文件,所以文件名这个属性,对于用户来说是极其重要的,我们普通用户,都是按照我们文件名来寻找文件的,不过需要注意的是,同一个目录下,是不允许有同重名文件的,比如说,此时我尝试在demo这个文件夹下,再建立一个也叫test点TXT的文件,但是当我点确定的时候,操作系统会提示我,此位置已经包含同名文件,他建议我把这个文件重命名为,test二点TXT,也就是说,它其实并不允许我在同一个目录下,拥有两个名字相同的文件,为什么不允许有重名文件,这点咱们会在之后,的小节当中再进行进一步的解释,总之文件名对于用户来说是很重要,甚至说是最重要的一个属性,因为我们都是根据文件名,来找到一个文件的,那文件的第二个重要的属性是标识符,其实在一个系统当中,肯定是有很多重名文件的,虽然说在同一文件夹下,不允许有重名的文件,但是我在这个地方,虽然不能建立一个叫做test的文件,不过我可以在我的桌面上,建立一个也叫test的文件,所以其实,用文件名并不能唯一的区分出,每一个文件到底是哪一个,因此操作系统会在背后为各个文件,设置一个标识符,那每个文件的标识符都是唯一的,只不过这个标识符对用户来说,毫无可读性,一般来说就是一连串,没有意义的数字字母的组合,所以在这个界面,也没有向用户展示出,一个文件的标识符,只是操作系统用于区分,各个文件的一种内部的名称,第三每个文件,会有一个叫做文件类型的属性,比如说我们在常规这个页签,这可以看到,test这个文件的文件类型,它是点TXT类型,指明文件的类型有很多好处,比如说,操作系统可以为不同类型的文件,设置一个默认的打开的,应用程序,比如说点TXT文件,就是默认,用记事本这个应用程序打开的,那像点MP4这样的文件,一般来说就是默认用一个,视频播放的应用程序来打开,并且呈现给用户,所以文件类型也是一个很重要的属性,第四个很重要的属性是文件的位置,那这个位置包括文件的存放路径,这个存放路径是让用户使用的,比如说我的这个test文件,它就是存在地盘的demo这个目录下,那我们普通用户可以根据,文件的存放路径,来一步一步的找到我们想要找的文件,不过这个文件平时是存放在外存,也就是词旁当中的,所以当我们双击打开这个文件的时候,其实操作系统需要从外存,把文件的数据读入内存,因此操作系统也需要,关心,文件在外存当中存放的位置这个问题,只不过在外存当中存放的地址,这个属性,对于用户来说是不可见的,只有操作系统需要关心,那除了上面介绍的这些,很重要的属性之外啊,还有文件的大小,比如说像这个文件,它有186个字节这么大,另外文件在什么时候创立,上一次啊修改的时间是多少,这个文件的所有者,也就是文件的创建者到底是谁,这些信息也是呃,文件当中需要包含的一些属性,另外还有一个很重要的属性,就是文件的保护信息,只不过文件的保护信息这个属性,咱们平时在使用的过程当中,几乎体会不到,那大家可以看一下自己的文件属性,安全这个页签里,大家会发现,其实操作系统对啊,这个系统当中的各种用户,进行了一个分组,那不同分组的用户对于用户,对于这个文件的操作权限是不同的,有的分组的用户,可以对这个文件进行读和写,而有的分组甚至啊也不能读也不能写,不能访问这个呃文件,所以文件的保护信息,可以让操作系统,更好的保护一个文件的安全,如果我们创建的文件,不想让别的计算机用户,来访问的话,那么我们就可以,设置一下他的保护信息,就可以实现这件事,那其实我自己从小就是,文件保护这个功能的一个受害者,因为平时,我自己玩的那些游戏的启动程序,被我爸设置成了呃我这个用户,呃不可读不可写的一种状态,所以只有在家里的电脑中,登录我爸的那个账户的时候,我才能够玩游戏,因为我自己的那个账户,是没有权限访问,游戏的那个启动程序的,所以这是文件的保护信息的一个作用,那接下来我们来看

在这里插入图片描述

讲文件内部的数据应该被怎样,组织起来,那在平时使用电脑的过程当中,也使用过各种各样的文件,那有的文件比如说像点TXT这种文件,它是一种,看起来没有很明显的结构特性的文件,那这种文件,它是由一些二进制或者说自符流组成,就是所谓的无结构文件,又称为流式文件,另外在我们用户看来,还有一些文件,表现出了很强的结构特性,比如说咱们使用的Excel表,还有呃有编程经验的同学,可能也使用过一些数据库,那数据库表也是一种,有很明显的这种组织结构的,一种文件,所以对于这种有结构文件来说,它是由一条一条的记录组成,那像这个地方这样的一行,就是一条记录,每个记录又是由一组相关的数据项,组成比如说学号是一个数据项,姓名是一个数据项,性别和专业又是另外的数据项,所以数据项它是文件系统当中,最基本的一个数据单位,因此文件,

image-20230821151354379

可以分为无结构文件和有结构文件,这样两大类,那无结构文件,它就是由一系列啊二进制,或者说自符流组成,它没有明显的结构特性,而对于有结构文件来说,它是由一个一个的记录组成,每一个记录就由一系列的数据项组成,这些记录应该如何组织的问题,也就是这些记录,他们之间应该是顺序的存放,还是用一个缩影表来表示,他们之间的这种先后顺序,这些问题是咱们之后要讨论的,文件的逻辑结构,相关的一些问题,在这个地方暂时不展开,所以文件的逻辑结构要探讨的问题,其实就是文件内部的这些记录,这些数据,应该被怎么组织起来的一个问题,那这是下一个小节当中会讲解的内容,接下来我们再来看

在这里插入图片描述

下文件之间应该怎样被组织起来,咱们随便打开一个逻辑词盘,比如说打开一个地盘,那会发现里边有各种各样的文件夹,除此之外还会有各种类型的一些文件,那我们随便打开其中的某一个文件夹,比如说照片这个文件夹,还可以再有更多的文件夹,并且也可以有各种各样的文件,所以其实我们平时使用的这个Windows,操作系统的,文件之间的组织形式,看起来是一种树状的组织形式,一个根目录下可以有各种各样的文件,目录也可以有一些普通的文件,那在各个目录下面,我们还可以创建更深一层的目录,也可以存放一些普通的文件,那其实这个地方所谓的目录文件目录,就是我们熟悉的文件夹,我们普通用户,可以自己创建一层一层的目录,在各层目录当中,存放我们想要存放的一系列的文件,所以我们的各种各样的文件,就通过目录这种功能,把它们有序的组织起来了,那其实我们平时看见的目录或者说,文件夹,它也是一种特殊的有结构文件,那这个有结构文件,它也是由一系列的记录组成,那具体这个目录应该是怎么实现的,这也是咱们之后会重点探讨的问题,这先不展开,总之文件通过目录这样的功能,把他们有序的一层一层的组织起来了,这样很方便我们用户使用,接下来我们

在这里插入图片描述

在这里插入图片描述

来考虑一下,操作系统应该对它的上层,提供哪些功能,那从我们平时的生活经验出发,比如说,我们可以在随便一个文件目录下,新建一个文本文档这样的文件,点了新建之后,其实啊在背后是使用了,操作系统提供的一个创建文件的功能,在我们点了新建按钮之后,这个图形化交互进程,其实是在背后,调用了操作系统向上层提供的create,系统调用,来完成这个文件创建的一个工作,那在我们创建了文件之后,这个文件的数据就已经在外存当中了,那我们可以双击打开这个文件,为了读取这个文件的数据,那我们需要把,文件的数据从外存读入内存,因为只有读入内存之后,才可以让CPU处理,所以,这个地方就使用到了一个叫做读,文件的功能,在我们双击这个test文件之后,操作系统先是默认的打开了呃,自动的打开了,点TXT对应的那种应用程序,也就是记事,本这个应用程序,那这个应用程序,又调用了操作系统,向上提供的read系统调用,来实现了读文件的功能,通过读文件的功能,就可以把这个文件的数据放到内存,然后就可以呈现在用户面前,那另外,当我们把这个文件编辑结束之后,我们可以保存文件,其实在我们点击了文件保存,那个按钮之后,记事本这个应用程序,在背后也做了一系列的事情,主要是调用了操作系统,向上层提供的这个,right系统调用,right系统调用,就实现了所谓的写文件功能,这个功能就是负责把文件的数据,从内存再写回外存,因为平时我们编辑这个文件的时候,其实只是改变了,文件在内存当中的那个,副本的数据,所以为了保存这个文件的内容,我们必须在使用写文件的功能,那这是第三个,需要向上层提供的很基本的功能,第四个既然我们可以创建一个文件,那么我们当然也可以删除一个文件,那其实在我们点了删除这个按钮之后,这个图形化交互进程,是在背后,调用了,操作系统提供的删除文件的功能,也就是delete系统调用,这样的话,就可以把文件的数据,从外存当中抹除了,那除了咱们平时肉眼可见的这一系列,啊对文件的操作功能之外,操作系统

image-20230821151835181

还需要提供打开文件和关闭文件,这两个呃,基本的功能,那这个地方呢,打开和关闭,和我们平时所谓的双击还有点,那个呃关闭窗口的小叉叉,其实是呃不一样的两个东西,那具体打开文件和关闭文件的时候,需要做什么,这咱们之后再进行探讨,不过大家需要注意的是,在使用一个文件之前,也就是读写文件之前,一定需要先使用操作系统的open,系统调用,也就是打开文件的这个功能,而当一个文件使用结束之后,也需要使用close系统调用来关闭文件,很多对文件的复杂操作,可以用这些基本功能来进行组合,比如说,如果要实现复制文件这样的事情的话,那么其实是可以先,使用这个create,系统调用来创建一个新的空文件,然后再把我们想要呃,复制的那个文件,用读文件的功能把它的内容读入内存,之后再把内存中的数据,再写到这个新的空文件当中,所以,这就写完成了一个复制文件的事情,因此可以看到,其实更复杂的这些功能,也可以用这些基础的功能来进行实现,那操作系统,在处理这些系统调用的时候,在背后需要做哪些事情,这是咱们之后会再展开探讨的问题

image-20230821152124822

接下来我们再来看一下,既然文件它是要存放在外存当中的,而外存又属于一种硬件,从上往下看,操作系统又是最接近硬件的一个层次,因此操作系统需要对硬件进行管理,那相应的,这些文件的数据,应该被怎么放到外存这个硬件当中,当然也是操,作系统需要关心和解决的问题,首先大家需要知道的是,外存也会像内存一样,被分为一个一个的这种存储单元,那每一个存储单元可以放,一定量的数据,比如说是一个字节,并且每个存储,单元会对应一个物理地址,那同样类似于内存的是,内存会被分为一个一个,大小相等的内存块,外存,也会被分为一个一个大小相等的块,或者叫磁盘块物理块,每一个词盘块的大小都是相等的,并且每个词盘块一般会包含,2的整数密格地址,比如说在这个例子当中,一个词盘块包含102四个地址,也就是2的10次方的地址,总共1KB这么大小,那相应的,文件的逻辑地址也可以分为,逻辑快号和框内地址这样的两个部分,操作系统同样,也需要把文件的逻辑地址,转换成外存的物理地址,也就是物理快号,和框内地址这样的形式,块内地址的位数呢,取决于这个词盘块的大小,比如说在这个例子当中,一个词盘块占2的10次方个字节这么多,所以要表示2的10次方个呃物理地址,总共就需要10个二进之位才可以表示,因此在这个例子当中,块内地址的位数应该是10位,操作系统是以快为单位,为各个文件分配存储空间的,所以,即使我们的文件大小只有10个字节,但是它依然会占用一整个块,也就是1KB的字盘块,那另外,操作系统在进行读写文件的时候,也是以快为单位进行这种数据交换的,所以通过这个部分的学习,我们知道外存被分为一个一个,的词盘块,那么当文件比较大的时候,是不是应该连续的存放在这些,啊一些相邻的词盘块当中呢,或者能不能找某一种方法,让文件离散的存放在各个词盘块当中,然后用某一种方式,来记录下这些词盘块的先后顺序呢,那这是咱们之后,在文件的物理结构那个部分,会探讨的内容,那除了分配给文件的这些磁盘块应该,呃怎么组织起来这个问题之外,操作系统还需要关心,怎么管理这些空闲的磁盘块,怎么对这些磁盘块进行分配与回收,这些问题,那这些都是咱们之后会在展开,讲解的问题,所以其实文件的物理结构探讨的是,文件,这些数据在物理上应该是怎么存放,怎么组织的一个问题,而刚才咱们提到的文件的逻辑结构,指的是文件的各个记录,在,逻辑上应该是什么样的一种组织关系,的问题,那这些知识点通过之后的学习,大家会有更清晰的认识,那除了咱们刚

image-20230821152257859

image-20230821152217217

才探讨的这一系列的功能之外,操作系统还需要实现,文件的共享和文件保护这两个,比较重要的功能,所谓的文件共享,就是指多个,用户可以共享的使用同一个文件,而文件保护是指,怎么保证不同的用户,对文件有不同的这种操作权限,就是咱们之前聊到的,就是我的账户不能玩游戏,而我爸的账户可以玩游戏那个问题,那这两个问题咱们会放在,稍微靠后的位置进行讲解,并且会结合Windows,操作系统呃,文件共享还有文件保护的这个,实际应用来进行探讨,好的那么

image-20230821152320669

这个小节,我们初步认识了文件管理大概,需要做一些什么事情,我们简单的介绍了文件的定义,它无非就是一组有意义的信息的集合,那这个理解就行了不需要背,另外对于用户来说,文件名这个属性是特别重要的,文件的类型文件的位置,包括文件的这个存放路径,还有文件在物理上的存放位置,这两个信息都是特别重要的信息,关于文件有哪些属性这个问题,建议大家在网上学习累了的时候,可以自己捯饬一下自己的电脑啊,随便找几个文件点开它的属性看一下,然后这样的话,就可以加深对文件属性,啊相关的一些理解还有记忆,那在之后的讲解当中,我们会依次介绍文件的逻辑结构,还有目录的实现,另外操作系统对,上层提供的一系列的系统调用的功能,在背后做了一些什么事情,这些都是之后会探讨的内容,那除了逻辑上的结构之外,文件在外存当中是怎么存放的,也就是文件物理结构的问题,也十分重要,操作系统又应该怎么对文件的空闲,快进行管理,那这是存储空间管理相关的内容,最后,我们还会介绍文件共享和文件保护啊,这样两个很重要,但是平时咱们很少使用过的功能,那这个小节的内容,只是为了让大家能够对,接下来的这一整张的框架有一,个初步的了解,并且让大家知道,其实文件管理的功能,离我们生活并不遥远,我们每天都在使用,操作系统提供的文件,管理的功能,所以,大家在学习这个章节的内容的时候,可以结合咱们平时的一些,使用文件系统的一些经验,来思考各种各样的,这些这些知识点,到底是什么样的一种情况,好的,那么以上就是这个小节的全部内容

在这里插入图片描述

No.2 文件的逻辑结构

各位同学大家好,在这个小节中,我们会学习文件的逻辑结构,相关的一系列知识点,那么在上个小节中,我们也简要的提到过,所谓的文件的逻辑结构,就是指在用户看来,文件内部的数据,应该是怎么被组织起来的,而所谓的物理结构又指的是,在操作系统看来,文件的数据,应该是怎么被存放在外存当中的,那其实在数据结构那门课当中,也接触过很多逻辑结构和物理结构的,问题说线性表它就是一种逻辑结构,在用户看来,线性表,它是一组有先后顺序的元素序列,比如说a b c d e,但是对于一种逻辑结构来说,也可以用不同的物理结构来实现,比如说,线性表可以用顺序表的方式实现,也可以用列表的方式实现,如果用顺序表的方式实现的话,那么就意味着,各个在逻辑上相邻的元素,在物理上也是相邻,也是按照这样的顺序来存放的,而如果采用的是链表这种物理结,构的话,就意味着这些元素在逻辑上虽然相邻,但是在物理上可以不相邻,所以基于这样的特性,顺序表可以实现随机访问,而链表又无法实现随机访问,所以从这个地方我们也可以看出,算法的具体实现和逻辑结构,物理结构都是有关的,那文件也是一样,文件的操作的具体实现,也和文件的逻辑结构,物理结构都有关系,那这个文件,可以分为无结构文件和有结构文件两,种我们需要重点讨论的是,有结构文件的这几种逻辑结构,上个小节中我们已经知

image-20230821152712735

知道所谓无结构文件,它其实就是由一系列的二进制流,或者说自符流组成,又称为流式文件,比如说,像咱们Windows操作系统里的扁PXT文件,就是一种很典型的无结构文件,那由于这种结构,没有很明显的这种结构特性,所以我们也不必要来讨论,它的这种逻辑结构的问题,因此我们重点关注的是有结构文件

image-20230821152754933

它有一组相似的记录组成,又称为记录式文件,而每条记录又由若干个数据项组成,比如说像我们的数据库表文件,像这个例子当中这就是一张数据库表,记录了各个学生的信息,包括学号,姓名,性别还有专业这样的啊四个数据项,那一般来说,每条记录可以有一个数据项,作为关键字,像这个数据库表当中啊,就可以用学号这个,数据项作为关键字来作为啊,识别不同记录的一个ID,那每个学生会对应一条记录,每条记录又由若干个数据项组成,其中的学号可以作为记录的关键字,那这是有结构文件,它有一系列的啊记录组成,根据各条记录的长度,也就是占用的存储空间是否相等,又可以把这些记录,分为定长记录和可变长记录两种,比如说,像刚才咱们提到的这个例子当中,可以用32个字节来表示学号,32个字节表示姓名4个字节表示性别,然后用60个字节表示学生的专业信息,所以既然每一个数据线的长度都相同,啊,每一条记录的这个总长度也是相同的,也就是128个字节,并且在定长记录当中,每个数据项,在记录当中所处的位置都是相同的,不过可变长记录的啊这种有结构文件,其实才是咱们生活当中,最常见的一种有结构文件比如说

image-20230821152924405

在这里插入图片描述

有一张表,它记录了每个学生的一些基本信息,还有啊学生的特长,像张三的特长就是腿特长,然后李四是腿毛特长,呃,二狗这个人他又可以熟读唐诗三百首,琴棋书画一样精通,上得了厅堂下得了厨房,精通教育CGI,Python还有任意一种教文语言,后面还有很多很多他的,关于他特长的描述,而又有一些同学他是没有特长的,因此由于每个记录的特长,这个数据项长度是不确定的,有的特别多有的又特别少,有的甚至没有,所以像这些记录,它就是一种可变长的记录,那像之前的那个例子当中,专业这个数据项用几个字就可以描述,所以即使我们给,各个学生的专业那个数据项,分配了总共,固定60个字节的这种长度,那即使有存储空间的浪费,也不至于特别明显,但是像这个例子当中,如果我们给每个,学生的特长这个数据项都分配一个,巨长巨大的一个一个存储空间的话,那显然有的学生,对这个数据项的存储空间利用,是很不充分的,那这样的话,就会导致,存储空间利用率极低的一个问题,所以在这个例子当中,最好是让这个有结构文件的这些记录,是可变长的记录,那接下来我们需要再讨论,这些记录,应该在逻辑上怎么被组织起来的问题,也就是有,结构文件的逻辑结构的问题

在这里插入图片描述

分为顺序文件,锁影文件和锁影顺序文件这三种,我们首先来看顺序文件这种逻辑结构,如果是顺序文件结构的话,那么文件中的这些,记录会一个接一个的顺序的排列,这些记录可以是定长的,也可以是可变长的,并且各个记录在物理上可以是,顺序存储,也可以是链式存储,如果说这些记录是顺序存储的话,那么在逻辑上,相邻的这些记录在物理上也是相邻的,这就类似于咱们之前提到的,顺序表那种,数据结构,而如果说采用的是,链式存储这种物理结构的话,那么逻辑上相邻的这些呃记录,在物理上不一定相邻,就类似于咱们之前的那个,链表,那根据这个记录,是否按照关键字的顺序来排列,又可以把顺序文件分为,串结构和顺序结构这两种,串结构啊,就是指记录之间的顺序与关键字无关,如果是串结构的话,那么记录之间的顺序,一般来说,是按照这个,存入的时间先后顺序来决定的,如果采用的是顺序结构的话,就必须保证,记录之间的这个先后顺序,是按照关键字的顺序来排列的,那显然,记录到底是定长的还是可变长的,这些记录是否按照关键字有序的排列,另外呃,这些记录在物理上到底是顺序存储,还是链式存储,所有的这些区别都会影响顺序文件,到底能不能实现某一些呃操作的功能,那接下来我们会重点讨论两个问题,假设我们已经,文件的起始地址,也就是第一个记录的存放位置的话,那么我们是否能够快速的找到第二,个记录对应的地址呢,也就是说,是否能实现这些记录的随机存取,随机访问这件事情呢,第二个问题,我们能不能快速的找到,某一个关键字,对应的记录存放的位置呢,那我们会根据这些,呃各个条件的不同来进行探讨

image-20230821153232288

image-20230821153303186

我们直接给出结论,假设一个顺序文件,在物理上是采用,链式存储的方式来实现的话,那么无论这个顺序文件,它是定长记录还是可变长记录,也无论它是呃创结构还是顺序结构,它肯定都无法实现随机存取,每次只能从第一个记录开始一,次往后寻找,那这个和我们的链表很类似,如果我们要在一个链表当中,找到某一个呃,元素的话,那么我们每次都只能从链头开始,依次往后寻找,因为各个元素之间的存储位置,它并没有规律,它都是离散的,所以我们并不能直接计算出,某一个元素在物理上的存放地址,因此如果我们采用的是链式存储的话,那么对这个顺序文件的记录的检索啊,查询都是不太方便的,那如果说采用的是顺序存储,这样的物理结构的话,是不是会有所不同呢,假设采用的是顺序存储的物理结构,并且这个文件是可变长记录的文件,那它依然是无法实现随机存取的,每次只能从第一个记录开始,依次往后查找,来看一下为什么,由于这个文件的记录是可变长的,也就是每个记录的长度不一样,所以必须在每个记录之前,用一定的,存储空间来表示这个记录的长度,假设,这个记录长度可以用一个字节来表示,那第0条记录它的逻辑地址是0,第二条记录就应该是第0条,记录的长度L0,再加上它的这个记录长度,这个字段占用的字节数一个字节,所以L0加一,这是第一个记录啊对应的逻辑地址,相应的,应该是之前所有的这些记录的长度,之和,再加上所有的这些记录的这个长度,字段所占用的字节,每一个占用一个字节,那前面总共有挨个记录的话,总共就会占用挨个字节,所以由于这个文件中的记录是可变长,的L0 L1 L2,这些数据并不会呈现出某种规律性,因此我们想要找到某一条记录,对应的地址的话,那么只能从第一条记录开始,依次往后寻找,因此,如果说这个文件是可变长记录的文件,那么,即使它采用了顺序存储的这种方式,依然无法实现随机存取,那如果说,这个文件是一个定常记录的顺序文件,并且在物理上,是采用顺序存储的方式的话,情况就不一样了,这就可以实现随机存取,假设每个记录的长度固定为l,并且这些记录在物理上是顺序存储的,那就意味着,各个逻辑上相邻的记录,在物理上也是相邻的存储的,所以啊第0个0号记录的这个呃,逻辑地址为0的话,那么i号记录的逻辑地址,直接可以用i乘以l,就可以直接得到,因此如果是定常记录的顺序文件,并且在物理上也是顺序存储的话,那么是可以实现随机存取的功能的,那如果说这个顺序文件是创结构,也就是说这些记录的顺序,和他们的关键字顺序是没有关系的话,那这就无法,快速的找到某个关键字对应的记录,因为,它并不是按关键字的顺序来排列的,所以我们每次只能从头开始,依次往后便利的寻找呃,这个关键字对应的记录,但是,如果说这个定常记录的顺序文件,采用的是顺序结构的话,那么也就意味着,这些记录,是按照关键字的顺序来排列的,那这样的话,我们就可以用呃向折办查找啊之类的,一些方法,来快速的找到,某一个关键字对应的记录,那到这个地方,我们就回答了之前提出的两个问题,关于,是否可以实现对各个记录的随机存取,这件事我们得出的结论是,如果说物理上采用的是链式存储,那么,肯定是无法实现记录的随机存取的,而如果说,物理上采用的是顺序存储的话,那么可变常记录的顺序文件,是无法实现随机存取的,而定常记录的这个顺序文件,是可以实现随机存取的,如果说在这个基础上,再能保证啊这个定常记录的顺序文件,它是一种顺序结构,也就是按照关键字的顺序来排列的话,那么我们就可以实现,快速的解锁某一个记录的这个功能,那一般来说,中所指的顺序文件,默认的是指这个物理上,采用顺序存储的这种顺序文件,所以我们不需要考虑,各个记录练式存储的这种情况,在之后我们的讲解当中,在提到顺序文件的时候也是默认如此,那显然在顺序表那种数据结构当中要,增加或者删除一个元素是比较困难的,同样的,如果采用的是顺序存储的这种,结构的话,那么他要删除或者增加一个记录也是,比较困难的,不过如果采用的是创结构的话,那么由于不需要保证各个记录,按照关键字,来排序,因此对于创结构的这个顺序文件来说,增加和删除一个记录,相对来说要简单一些,我们只需要,很简单的把要增加的那个记录,插到这个文件的末尾就可以了,那在实际应用当中,为了减少字盘的IO次数,一般来说,系统操作系统会管理一个日志文件,用这个日志文件,来记录啊,对这个文件当中的各个记录,进行修改的一些信息,然后每隔一段时比较长的时间,再把这些,信息统一的合并到外存当中的这个,文件数据当中,比如说每隔一个小时才合并一次,或者说每隔10分钟才合并一次,这样的话就可以减少,对于顺序存储的顺序文件进行增伤感,所带来的一些啊,开销了,不过这个知识点只是简单的提一提,在考试当中并不会进行考察,那以上的这些内容,是顺序文件这种逻辑结构当中,需要特别注意的一些,啊知识点,特别是定长记录可以实现随机存取,而可变长记录不可以实现随机存取,这两件事,接下来我们

image-20230821153349939

再来看第二种逻辑结构所以文件,通过之前的讲解我们知道,如果说一个顺序文件,它是可变长记录的话,那么要找到第二个记录,就必须先顺序的查找i,前面的i减一个记录,在实际生活当中有很多应用场景,又必须使用可编常记录,能不能解决,可编常记录的这种查找速度,慢的问题呢,能否让可编常记录的文件,也实现啊可以随机访问的这个功能呢,基于这个需求,人们提出了所以文件这种逻辑结构,每个文件会建立一张所以表,并且每一个所以表的表象,会对应这个文件的一条记录,文件的这,些记录在物理上不需要连续存放,但是这个所影表的各个表象,在物理上是需要连续存放的,另外每一个所影表的表象的,这个大小都是相等的,比如说所影号长度指针,这三个字段分别占4个字节,那么一个所影表的表象,总共就需要占12个字节的长度,因此锁影表本身,也可以理解成是一种定常记录的,顺序文件,那经过之前的讲解我们也知道,定常记录的顺序文件,是可以支持随机访问的,所以我们可以快速的找到,第二个记录对应的锁影表象,到底是存放在什么地方,另外呢如果我们,把这个关键字作为索引号的内容,并且让索引表当中的这些表象,按照关键字的顺序来排列的话,那么我们就可以,让这个索引文件支持折办查找,这样的话,就可以大幅度的提升索引文件的,检索速度,不过既然,每一个文件的记录会对应一个缩,影表象那么,我们要增加或者删除一个记录的时候,当然也需要,把对应的这个表象进行相应的处理,那要增加一个记录的时候,也需要增加一个相应的缩影表象,要删除一个记录的时候,也需要把它对应的这个缩影表象也给,删除通过之前的讲解我们发现,锁影文件这种逻辑结构,可以支持很快的检索速度,所以这种逻辑结构,主要是用在,对于信息处理的及时性要求很,高的那种场合,另外呢,除了用这个关键字作为锁引号之外,我们还可以用别的不同的数据箱,作为锁引号,来来为一个文件建立多个锁影表,比如说像之前咱们提到那个例子,学生信息表当中,我们可以为关键字学号,来建立一张锁印表,同时也可以用,姓名这个字段来建立一张锁印表,这样的话,我们就可以根据学号,快速的找到对应的呃那个记录,也可以根据姓名快速的找到,对应的那个记录了,那如果说学过数据库的同学就知道,在circle语言当中,就可就可以用一条circle语句,就完成为某一个字段,建立一张所以表的这种功能了,那这是所以文件,接下来我们再

image-20230821153932822

再来看最后一种啊,逻辑结构所影顺序文件,我们思考一下,所影文件表现出来的缺点,每个记录会对应一个所以表的表象,因此如果所以表的表象比较大的话,那么所以表也会占用很大的这个,存储空间,比如说,如果文件当中的每个记录平均只占,8个字节,但是每一个锁影表的表象,需要占32个字节,那么锁影表,的长度都要比文件内容本身要大4倍,那这样的话,存储空间的利用率就太低了,所以为了解决这个问题,人们提出了锁影顺序文件,它是一种锁影文件,和顺序文件思想的结合,与锁影文件类似的是,锁影顺序文件当中同样会为一个文件,建立一张锁影表,但是与所影文件不同的是,所影顺序文件当中,并不会为每一个记录,建立一个对应的所影表象,而是会给这些记录进行分组然后,每一个分组对应一个所影表象,比如说在这个例子当中,就是按照学生的姓氏,把学生记录进行了一个分组,然后每一个分组,会对应一个所影顺序文件的所影项,每一个锁影像记录了这个分组的名字,还有这个分组存放的一个位置,那从这个地方可以看到,锁影顺序文件的锁影像,并不需要按照关键字的顺序来排列,那这样的话,是可以更方便,我们对新表象的插入操作的,也就是说锁影顺序文件的锁影表,它其实是一个定常记录的串结构的,啊顺序文件,另外,这样的一个分组就是一个顺序文件,那可以看到,采用了锁影顺序文件,这种逻辑结构之后,锁影表的表象是少了很多的,所以我们完成了刚才提出的那个需求,也就是对啊,锁影表进行了瘦身减肥的工作,那如果采用这样的策略的话,会不会出现啊检索速度慢的问题呢,我们来分析一下假设

image-20230821154033490

一个顺序文件有1万个记录,那根据关键字解锁这个文件的时候,每次只能从头开始顺序的查找,那我们要找到,这个关键字对应的记录的话,就平均需要查找5,000个记录,但是如果我们把这个文件改造成这种,啊,锁影顺序文件的这种逻辑结构的话,我们可以把这1万个记录平均分为100组,然后每组100个记录,这样的话,我们要查询某一个关键字对应的记录,首先是需要顺序的查找这个锁影表,找到这个关键字对应的那,个分组,那由于这个锁影表只有100个锁影像,因此平均只需要查找50次,就可以找到一个关键字对应的分组了,那相应的找到了它对应的分组之后,在这个分组内有100个记录,因此接下来我们需要,顺序的查找这100个记录,那平均只需要查找50次,就可以找到这个关键字对应的记录,存放的位置了,所以其实,采用了这种所以顺序文件结构之后,平均的查找次数就减少为了50+50,总共100次,因此这种逻辑结构,也是具有比较好的解锁性能的,同样的道理,如果说一个文件有10的6次方格记录,那我们可以把它分为1,000组,每每个分组是1,000个记录,根据关键字来解锁一个记录,就平均需要500+500总共1,000次查询,那这1,000次,其实查找的次数依然是很多的,那怎么解决这个问题呢,那我们可以建立多,

在这里插入图片描述

,多级锁影,因为刚才所说的这个例子来说,我们可以为这个文件先建立一张,d级锁影表,那每一个锁影表对应100个表象,每一个表象又对应一个分组,每一个分组当中又是100个记录,那不难算出,我们总共会有100张d级锁影表,因此我们又可以为这100张d级锁影表,再建立一个顶级的锁影表,这样的话就形成了两级锁影顺序文件,那顶级锁影表中总共有100个表象,地级锁影表中,每个锁影表中也是有100个表象,那每一个表象又会对应一个分组,每个分组中又会有100个记录,因此如果我们按照这样分组的话,那根据一个关键字来检索一个记录,平均需要查找的次数就是,这个地方需要查50次,这个地方需要查50次,这个地方还需要查平均50次,那总共平均需要150次的查找,就可以找到,我们想要找的那个目录像了,好的那么这个小节当中我们介绍

image-20230821154353594

文件的逻辑结构,无结构文件,由二进制流或者自符流组成,没有明显的逻辑结构,所以这个地方不我们不展开探讨,我们需要重点掌握的是,有结构文件的这几种逻辑结构,分为顺序文件,锁影文件和锁影顺序文件,而有结构文件它是由记录组成的,分为定常记录和可变常记录,那我们在考试中,遇到的所谓的顺序文件,指的是,默认各个记录在物理上顺序存储的,呃这种物理结构,需要重点注意的是,对于可变长记录的顺序文件来说,它是无法实现随机存取的,但是定长记录可以,可编长记录的顺序文件,每次在查询的时候,只能从头开始依次往后查找,第二个需要注意的点是,定常记录顺序结构的顺序文件,可以快速检索,所谓的顺序结构就是指这个,这些记录按照关键字的顺序依次排列,所以由于这些记录排列的顺序,是有规律可循的,因此我们可以用,像折办查到之类的方法,来快速的找到一个关键字对应的记录,那在锁影文件这种逻辑结构中,我们需要注意的是锁影,表本身就是一种定常记录的顺序文件,而如果说锁影表按照关键,字的顺序排列,那它同样也可以像之前所说的这样,支持啊快速解锁的功能,也就是根据某一个关键字,来快速找到某一个记录的,呃功能,那由于快速检索的这个功能和特性,因此锁影文件也经常被使用在那些,对于检索速度,要求很高的那些场景当中,那在最后我们介绍的锁影,顺序文件当中,除了要理解它的这一些原理之外,我们还需要会动手计算平均查找次数,好的,那么以上就是这个小节的全部内容,

image-20230821154435050

image-20230821154448181

No.3 文件目录

同学大家好,在这个小节中,我们会介绍文件目录,这个特别重要的知识点,那么在我们平时生活当中,对文件目录的使用其实很频繁的,比如说像Windows系统里,我们随便打开一个逻辑词盘,比如说d盘,里面就有很多各种各样的文件夹,或者说文件目录,并且在这个d盘下面,它也会有一系列的普通的文件,打开其中的某一个文件夹,文件目录之后,里边也还会有更深一级的文件目录,还有一些普通的文件,那像这种一层一层的目录结构,对于我们用户来说有什么好处呢,很显然我们通过这样的目录结构,可以很方便的找到我们的这些,想要找的这个文件,可以使整个文件的存放的组织结构,非常清晰,易于我们查找,如果有编程经,验的同学应该也写过,操作文件相关的一些函数,比如说像打开文件这个操作,他其实就是用我们提供的文件路径名,作为参数,然后根据这个路径一层一层往下去,找到我们想要让,这个程序控制的那个文件的,所以采用这样的目录结构的话,可以让用户很轻松的实现,按名存取这件事情,那从操作系统的角度来看,这些文件目录应该是怎么实现的呢,这是我们在这个小节中,需要重点探讨的问题那

在这里插入图片描述

所谓的文件目录,其实就是我们很熟悉的Windows,操作系统的文件夹,要实现文件目录的功能,需要有一个很关键的数据结构,文件控制快的支持,所以,我们首先会介绍什么是文件控制快,操作系统又是怎么用这种数据结构,来实现文件目录的,另外随着计算机的发展,文件目录的结构也出现了不同的变化,目录结构之后出现了两级目录,再之后出现了竖形目录,无环图目录结构,那最后,我们会介绍锁影节点相关的知识点,其实锁影节点这种机制,它是对文件控制快的一个优化,那我们会按从上至下的顺序依次讲解,那我们首先来

image-20230821155037970

看一下什么是文件控制块,打开电脑中的d盘这个根目录,会发现这个根目录下面,有一系列的文件夹,或者说一系列的文件目录,还有一些呃普通的文件,那对于这个d盘这个根目录来说,它对应的目录文件就应该是这个样子,其实就是用一个所谓的目录表,来表示这个目录下面啊,它存放了哪些东西,那在地盘当中的每一个文件,每一个文件夹,都会对应这个目录表当中的一个表象,所以其实这些一条一条的目录像,本身就是一个一条一条的记录,所以目录文件,其实本身就是一种有结构的文件,它是由一条一条的记录组成的,而每一条记录,会对应在这个目录下面的一个文件,因此我们在这个地方看到的目录,其实它也是一种特殊的文件,那可以看到在这个表当中,标识了文件的文件名是什么,还标识了文件类型,比如说像照片这个文件,它其实是一个目录文件,所以它的类型标识是目录,那像对账单这个文件,它的类型就是TXT文件,另外呢在这个地方,我们还需要注意一个很重要的信息,就是在这个表象当中,记录了这个文件,在外存当中存放的物理地址,放在外存中的什么位置,所以其实我们双击打开目录的时候,操作系统在背后做的事情是,他会来查询这个根目录,地盘这个根目录的目录文件,然后找到照片这个文件对应的目录像,之后根据这个目录像当中记录的,呃文件的存放位置,从外存当中读入,照片这个目录文件的数据,这样的话,就可以知道照片这个目录下面,还有哪些内容,那这些内容就可以显示啊,展示在我们用户面前了那

image-20230821155314948

打开照片这个目录之后,会发现里边有一系列的文件,那么同样的,照片这个目录对应的目录文件,它也是由一条一条的目录像组成的,每个目录像会对应其中的一个文件,那其实目录文件,当中的这样的一条记录,它就是一个文件控制块,英文缩写是SCB,所以其实这些FCB的有序结合,就是所谓的文件目录,而一个FCB就是一个文件目录像,那很显然每一个文件都会对应一个FCB,另外从这个例子中我们可以看到,SCB中包含了文件的一些基本信息,包括文件名物理地址,还有文件的逻辑结构,物理结构等等一系列的基本信息,另外还会有文件存取权限,存取控制相关的一些信息,包括文件是否可可读是否可写等等,那除了这些之外,还会有文件的一些使用信息,包括文件是在什么时候建立的,上次修改的时间是多少等等,不过所有的这些信息当中,最重要的还是文件名,还有文件的存放的物理地址,这两个信息,因为SCB存在的最重要的一个作用,其实是为了实现让用户啊按名存取,就是按照文件的名字,来操作一个文件这样的事情,所以FCB,它必须建立起,文件名到文件实际存放的物理地址,这样的一个映射关系,因此最重要最基本的应该是文件名,还有物理地址这样的两个数据,那除了这个地方提到的这些信息以外,其实咱们之前提到过的,文件的各种各样,的那些属性,也可以存放在文件对应的,SCB文件控制块当中,那接下来我们再来

image-20230821155451803

来看一下,我们需要对文件目录进行哪些操作呢,首先为了让用户能够实现按名存取,那为了实现这件事,肯定是需要,有一个目对目录搜索的过程,当用户需要使用一个文件的时候,系统需要根据这个文件名来搜索目录,然后找到这个文件名对应的目录像,第二当我们创建一个文件的时候,这个文件肯定是,放在某一个目录当中的,所以在这个文件所属的目录当中,就需要增加一个目录像,那与创建文件相反,呃当我们删除一个文件的时候,除了删除文件数据本身之外,也需要删除这个文件,在目录当中对应的这个目录像,另外呢,系统还需要提供显示目录的功能,因为用户在呃查看各级目录的时候,肯定是需要知道,这个目录下一集到底还有哪一些,文件哪一些目录,所以这个功能也是必须实现的,那在显示目录的时候,可以显示与这些文件相关的一些属性,这点大家可以在自己的Windows电脑上,具体看一下,那最后我们需要知道的是,文件的各种属性是保存在目录当中的,所以如果说文件的,某些属性发生变化的时候,那其相应的肯定需要修改,与他对应的那个目录像的内容,比如说我们对一个文件重命名,那么我们就需要,把这个文件对应目录像的文件名,这个信息给,修改掉那这就是一般来说,需要对目录进行的一些操作,那通过之前的讲解我们知道,由文件控制快的有序集合,就组成了文件的目录,在操作系统发展
在这里插入图片描述

过程当中出现了各种各样的目录结构,在刚开始出现的叫做单级目录结构,早期的操作系统,他,只会在整个系统当中建立一张目录表,每个文件会占用一个目录表的目录像,那这种单级目录结构是支持,按名存取的,因为这个呃FCB当中,其实也是包含文件名这个,关键字,但是单级目录最大的一个缺点,就是不允许文件重名,可以想象一下,各个目录像的关键字是文件名,那么如果说出现了重名文件的话,比如说有个文件叫a,另一个文件也叫a,那么当我们告诉操作系统我们要,按照文件名a来存取一个文件的时候,那,操作系统到底应该选择哪一个文件呢,因因此在单级目录结构当中,是不允许文件重名的,所以我们在创建一个文件的时候,首先需要检查这个目录表当中,到底有没有重名的文件,确定不重名之后才允许建立新文件,并且把新文件对应的那个呃目录像,也叫SCB插入到这个目录表当中,那如果说,这个计算机有很多用户在使用的话,那显然,不同的用户的文件名是很容易重复的,因此单级目录结构,不适用于多用户操作系统,那为了解决这个问题,后来人们提出了两级目录结

image-20230821155754449

在这种目录结构当中,会把目录分为两级,第一级叫做主文件目录,英文缩写是MFD和用户主文件目录,英文缩写是UFD,那主文件目录就是记录了用户名,还有啊,这个用户名对应的用户文件目录,存放的位置,而一个用户文件目录,又由这个用户,的那些文件对应的FCB组成,那由于不同的用户,文件是存放在不同的,用户文件目录下的,所以在这种情况下,如不同用户的文件是允许重名的,比如说像呃user一这个用户,它有一个文件名叫demo的文件,user 2这个用户,它也有一个文件名叫做demo的一种,文件,不过虽然他们的文件名是相同的,但是他们实际对应的文件数据,是不同的两个数据,那除了允许不同用户的文件重名之外,在采用了两级目录结构之后,也可以通过目录来实现访问限制,如说user一想要访问user 2的这个呃,用户文件目录的话,那操作系统可以验证一下,user一和user 2这两个名字是否匹配,那发现它不是user,就可以拒绝访,让它访问user 2对应的这个,用户文件目录,因此采用了这种两级目录结构之后,还是很方便实现这种,对于访问的限制的,但是采用这种目录结构的缺点就是,用户不可以把自己的文件进行分类,因此人们又提出了多级目录结构又叫

image-20230821155833441

竖形目录结构,那这也是现代,操作系统当中很常用的一种目录结构,每一个目录,下面可以有更低一级的目录,同时在各个目录下面,也可以有一些普通的文件,并且不同目录下的文件是可以重名的,那和刚才一样,不同目录下的文件,虽然说名字是相同的,但是,他们实际对应的文件并不是同一个,那如果说采用的是多级目录结构的话,用户或者用户进程,想要访问某一个文件的时候,就需要用文件的路径名标识符,来让操作系统根据这个文件路径名,找到这个文件存放的位置,那各级目录之间,一般来说是用这个小斜线来隔开的,从根目录出发的路径称为绝对路径,比如说,像自拍点jpg这个文件的绝对路径,也就是从根目录出发的路径,就应该是,根目录下面的照片这个目录,然后,照片这个目录下面的201508这个目录,在201508这个目录下面,才可以找到自拍这个文件,对应的目录像,那用户或者说用户进程想要访问这个,文件的时候,就需要把这个呃路径名告诉系统,然后操作系统会根据这个绝对路径,一层一层的往下找下一集的目录,刚开始他会从外存当中,调入跟目录对应的这个目录表,也就是这个目录文件然后,然后找到照片这个目录存放的位置,然后又从外存当中调入照片,片这个目录文件,然后再从这个目录当中找到201508,这个目录,在外存当中,存放的位置,于是还需要再从外存调入,呃201508这个目录对应的目录表文件,那最后再查询这个目录表,才能找到自拍点jpg,这个文件存放的实际位置,所以如果从根目录这个地方开始,一层一层往下寻找的话,那整个过程需要三次读字旁的IO操作,第一次是读入这集的目录,第二次是读入这集的目录,第三次是读入这集的目录,不过在实际生活当中,用户经常会访问同一个目录,内的多个文件,比如说一个用户,他在连续的查看201508这个目录下面的,各种各样的照片,那,那就意味着这个目录当中的那些内容,是经常会被访问的,但是如果每一次访问201508当中的文件,都需要从根目录开始,一层一层的往下寻找的话,那显然每一次都需要三次读词方操作,这是很低效的,所以我们可以设置一个当前目录,比如说此时,我们已经打开了照片这个目录文件,也就是说,照片这个目录文件,已经是从外存掉入内存当中的了,那我们可以把照片这个目录设置为,当前目录,当用户想要访问某个文件的时候,就可以从当前目录出发,然后找到自己想要的那个文件,那从当前目录出发的这种,文件路径就叫做,相对路径,比如说像Linux系统当中,如果说当前目录是照片这个目录,然后我们想要,用相对路径来表示自拍点jpg,这个文件的话,那么它的相对路径就是当前目录下面,的201508这个目录下面的,拍点jpg这个文件,所以如果从当前目录出发的话,那么想要找到自拍点jpg存放的位置,我们只需要,先查询,内存当中当前目录的这个目录表,找到201508这个目录文件,在外存当中的存放位置,然后把这个目录调入内存,于是再从这个目录当中找到自拍点jpg,存放的位置,那这样的话,整个过程只需要经过一次读词旁操作,就可以知道自拍点jpg存放的位置了,所以可以看到,在引入了当前目录和相对路径,这种机制之后,词盘l的次数减少了,这就提升了访问文件的效率,不过竖形目

image-20230821155936404

image-20230821160305384

目录结构也并不是万能的,它可以很方便的对呃文件进行分类,层次结构清晰,也也可以很方便的对文件进行,管理和保护,但是竖形结构不便于实现文件的共享,那,竖形目录结构不便于实现文件共享这,一个知识点,也是经常在选择题当中进行考察的,那为了解决这个问题,人们又提出了无环图目录结构其实

image-20230821160421936

无环图,目录结构和竖形目录结构也比较相似,只不过是在竖形目录结构的基础上,增加了这样的一些,指向同一个节点的有向边,使整个目录的结构,看起来是成为了一个有向无环图,那有向无环图相关的知识点是在,数据结构当中进行学习的,那这样的话就很方便的可以实现啊,多个用户间的文件共享,那这个地方大家可能也会发现,可以用不同的文件名指向同一个文件,也就是说,user一这个用户可以用demo这个文件名,找到这个文件,而user 2这个用户可以用my demo这个,文件名找到这个文件,他们指向的都是同一个,这个文件是被他俩所共享的,那除了共享一个文件之外,甚至可以共享同一个目录,因为目录,其实本身也是一个特殊的文件,那在引用了共享功能之后,对于文件的删除,就不能像以前那么简单,只要一个用户让删除一个文件,就把这个文件的实际数据给删除,因为这个文,件有可能是被多个用户使用的,所以为了解决这个问题,可以为每一个,这种共享节点设置一个共享计数器,比如说此时这个文件,是正在被两个用户共享的,那么共享计数器就应该是2,那此时如果用户一提出,要删除文件这个请求的话,那那其实操作系统只是会把user,一对应的这个目录,像给删除,并且让共享计数器减一,而这个文件,实际的内容并不会被直接删除,只有这个共享计数器的值,减为0的时候,就意味着这个文件,不再被任何用户所使用,那在这个时候,才可以把这个共享文件真正的删除,那大家需要注意的是,共享文件和复制文件其实并不一样的,如果说user一只是复制了一个user 2的,这个文件的话,那其实他们俩所拥有的这个文件,并不是同一个文件,当user一,对自己的这个文件,副本进行修改的时候,原来的这个文件的数据并不会改变,如果说这个文件,是被两个用户所共享的话,那么由于他们指向的,其实都是同一份文件的数据,因此只要,其中的一个用户,对这个文件数据进行更改,那另一个用户那边,也是可以看到这个文件数据的变化的,那以上就是我们需要,掌握的4种目录结构,单级目录结构,两级目录结构,竖形目录结构和无环图目录结构,最后

image-20230821160449091

我们来介绍一下什么是锁影节点,这其实是对,FCB这种数据结构的一种改进,通过之前的学习我们知道,由一系列的FCB,也就是文件控制块,组成了一个一个的文件目录,但是其实,操作系统在查找各级目录的过程当中,只需要使用文件名这个信息就可以了,而其他的这些种余的信息暂时不需要,那只有文件名匹配的时候,才需要去关心,这个文件存放的物理位置,所以我们可以考虑,让这个目录表进行一个简化,来提升这个搜索的效率,那由于按照文件名来搜索目录的时候,并不需要关心除了文件名之外,其他的所有的信息,因此可以把其他的这些信息,放到另外一个地方,也就是锁影节点当中,那除了文件名之外,像文件的类型,文件存放的物理位置等等这些信息,都会放在文件对应的锁影节点当中,每一个文件都会,有一个唯一的锁影节点,而采用了锁影节点这种机制之后,目录当中只包含文件名,还有指向,锁影节点的指针这样的两个信息,那这样的话,这个目录表,所需要占用的空间就会小很多,那我们来看一下,采用这种方式到底是怎么加快我们呃,啊查找一个文件的效率的呢,我们假设一个文件控制块是64个字节,一个词盘块的大小是1KB,那么每个词盘块只能存放16个FCB,也就是说,每个词盘块只能有16个目录像,因此如果一个文件目录当中总,总共有640个目录像的话,那么这么多的目录像,总共需要40个磁盘块才能存储,那在这种情况下,我们按照文件名来检索这个目录,平均需要查找320个目录像,那由于320个目录像需要,20个磁盘块才可以存放的下,所以平均就需要启动磁盘20字,因为每次启动词盘的读操作,都只能读入一个词盘块的内容,但是如果我们采用的是锁影,节点机制的话,假设文件名只占14个字节,然后锁影节点的指针是占两个字节,那么,每个词盘块就可以存放64个目录像,于是我们根据文件名,按顺序来解锁这个目录的时候,平均需要查询320个目录像,而320个目录像,只需要5个磁盘块就可以存放了,所以如果采用的是这种方式的话,那么只需要5次启动磁盘的操作,那由于l操作都是比较耗时的,所以启动磁盘的次数减少了很多,那么在检索文件的时候速度也会提升,很多所以,这是把其他的这些种余信息,全部放到锁影节点当中,所带来的一个好处,就是让文件的检索速度更加的快捷,那系统根据文件名,找到它所对应的锁影节点,之后需要把这个锁影节点调入内存,之后再根据这个锁影节点当中,保存的文件存放位置,就可以找到这个文件了,在外存当中的锁引节点称为,磁盘锁引节点,当锁引节点放入内存之后,就称为内存锁引节点,相比于磁盘锁引节点来说,内存锁引节点需要再增加一些信息,比如说记录这个文件是否被修改,或者记录,此时,到底有几个进程正在访问这个文件,等等这一系列的信息,好的那么在这个小列当中

image-20230821160720828

image-20230821160926478

我们学习了文件目录相关的内容,大家需要呃理解文件FCB,目录像,还有目录之间的一个组成的关系,另外大家也需要理解并记住,在单级两级还有多级目录结构当中,最主要的这个问题缺点到底是什么,那其实每一种目录结构,都是解决了上一种目录结构,留下的这个最最主要的问题,在多节目录结构当中,大家需要注意绝对路径,相对路径,还有当前目录这样的几个概念,并且需要能够理解,为什么根据相对路径来解锁文件,可以减少次盘l的次数,那其实背后的原因在于,每查询下一集的目录的时候,都需要启动磁盘IO,呃把下一集目录对应的目录文件,从外存调入内存,那多级目录结构当中,不方便实现文件的共享,但是无环图目录结构,很方便的可以实现文件共享,但是需要注意的是,每个共享节点会有一个共享计数器,只有这个共享计数器的数值,为0的时候,才可以真正的删除这个共享节点,那最后,我们介绍了文件目录的一个优化方式,除了文件名之外的所有信息,都放到锁影节点当中,这样的话就可以让,目录表的表象就大幅度的减小,从而每个词盘块,可以存放更多的目录像,因此,我们根据文件名来检索文件的时候,就可以有更少的词盘IO的次数,那为什么词盘IO的次数会更少,这点大家也需要理解,那么这个小节内容十分重要,很容易在选择题当中进行考察,那大家还需要,通过科考习题进行进一步的巩固,好的,那么以上就是这个小节的全部内容

image-20230821160949281

No.4 文件的物理结构

各位同学大家好,在这个小节中,我们会开始学习文件的物理结构,也就是文件分配方式,相关的一系列问题,那么这个小节的内容十分重要,在历年的考试当中,都经常出现2到3题的这种选择题,甚至经常会在大题当中进行考察,所以这个小节的内容,我们会讲的比较细致,会补充一些课本上没有提到的点,那么在之前的学习当中,我们知道,操作系统,它作为最接近硬件的一个软件层次,需要对硬件进行管理包,括外存也就是磁盘进行管理,那么操作系统对磁盘的管理,主要是需要啊做这样两件事,一是需要对非空闲磁盘块进行管理,那么非空闲磁盘块,也就是存放了文件数据的那些磁盘块,那这就是这个小节要重点探讨的,文件物理结构,文件分配方式的问题,另外呢还需要对空闲的磁盘块,也就是暂时还没有存放,任何数据的那些磁盘块进行管理,那这是咱们之后的小节会探讨的,文件存储空间管理的问题,那这个小节我们先看上面这个问题,其实文件物理结构,或者说文件分配方式,要探讨的就是,文件的数据到底应该怎样存放,在外存中,这些数据应该被,怎样组织起来的一个问题,那呃总共会分为这样的3种方式,连续分配链接分配和锁影分配,那其中链接分配又可以进一步细分为,连接和显示连接这样的两种,在这个视频当中,我们首先探讨,连续分配和链接分配这两种方式,那所以分配会在下个小节中,再进行讲解,那在正式开始之前我们需要先补充

image-20230821161253176

image-20230821161303294

较重要的知识点,在之前我们简单的提到过,类似于内存分页,词盘中的这些存储单元,会被分为一个个,大小相等,系统也会为这些磁盘块,啊进行一个编号,那像这个是0号款这个是1号块,以此类推,另外在很多操作系统当中,磁盘块的大小会设置的和内存块,内存页面大小相同,那这么做是有好处的,因为内存和外存之间的数据交换,也就是对磁盘的读写操作,都是以快为单位进行的,每次读入一块或者每次写出一块,那如果说能够保证外存的一个词盘块,和内存的一个内存块的大小是相等的,那么进行这种数据交换的时候,就会很方便,那在之前内存管理那个章节中,我们学习过,进程的逻辑历史空间,会被划分为一个一个的页面这样

image-20230821161500452

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

image-20230821161643317

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

image-20230821161722732

连续分配方式的第二个优点,这个地方,我们需要用到一个,现在暂时还没有讲过的知识点,磁盘,这种硬件想要读取一个磁盘块的时候,需要把磁头放到,那个磁盘块相应的位置,而访问不同的磁盘块,是需要移动磁头的,并且如果两个词盘块的距离越远,那么移动词头所需要的时间就越长,比如说我现在需要连续的读啊,这三个黄色的块,那么,首先是把词头放到第一个块的位置,之后移动到第二个块的位置,再之后再移动到第三个块的位置,所以由于这三个块,他们之间在物理上是相邻的,也就是他们相距距离是最短的,因此这个移动的过程,其实磁头的移动距离也是最短的,而假如,我们此时想要读取的是紫色的这三个,磁盘块的话,那么首先需要把磁头移动到第一个,呃这个块对应的位置,读完了第一个块之后需要移动磁盘嘚,移动到第二个位置,然后读完第二个磁盘块之后,也需要再移动磁盘,然后把它移动到第三个块的位置,因此如果这些块不相邻的话,那么读取一个块和下一块呃之间,呃所需要的移动磁头的时间就会更长,因此基于这个分析我们知道,如果一个文件,采用的是连续分配的方式的话,那么我们在,顺序的读取这个文件的各个快的时候,所需要的读写时间是最短的,读写速度是最快的,因为整个过程,所需要的词头移动距离是最短的,那这个知识点,咱们还会在之后再进行进一步的探讨,这个地方我们只需要理解,连续分配的文件,在顺序读写的时候速度最快,只需要理解这点就可以了,那这是连续分配方式的第二个优点,接下来我们来看一下,连续分配方式有哪些缺点,假设在这个图当中啊,黄色的部分是一个文件a,所占用的连续的3个款,然后绿色的部分是空闲的款,橙色的区域表示,其他的文件已经占用的瓷板块,如果说此时文件a想要拓展,也就是说想要再增加一个子文块的话,那由于连续分配,要求啊为一个文件分配的是连续的块,而文件a后面的这个相邻的块,此时已经被别的文件所占有了,因此如果要拓展文件a的话,那么我们不得不把文件a的数据,整体的迁移到,另外的这个有连续的4个,块的这个区域当中,也就是这个样子,那进行数据迁移的这个过程,其实是需要耗费很大的那个开销的,所以我们得出一个结论,由于连续分配方式,要求文件在磁盘上占有的,必须是一组连续的块,因此对文件的拓展是很不方便的,那这是他的一个缺点,再来看第二个缺点,假设此时在这个图当中,橙色的这些区域表示的是非空闲块,而绿色的这些区域,表示的是空闲磁盘块,那么此时会发现啊,这有12345总共有5个空闲的磁盘块,假如说此时我们要创建一个新文件,那这个文件大小需要占用3个词盘块,那由于这个文件,它采用的是连续分配的方式,因此啊由于此时整个词盘当中,并没有连续的3个空型块,因此我们没有办法为这个文件分配,啊足够的这个存储空间,相应的假设这个系统当中,有很多文件,都是大于一个块这么大小的,那这些空闲的,离散的块就很难被利用起来,所以如果说,物理上采用这种连续分配的方式的话,那存储空间的利用率会低,会产生难以利用的磁盘碎片,而这些磁盘碎片,就有点类似于,咱们在之前内存管理当中,讲过的那种,外部碎片,那处理这些碎片的方式,也和处理外部碎片的,思想是一样的,可以用紧凑的方式来解决,不过紧凑,就意味着,需要移动大量的这些磁盘块的内容,那这个过程是需要花费很大的时间,代价的因此会产生磁盘碎片,这个问题,也是连续分配方式一个很明显的缺点,所以连续分配方

image-20230821162055952

image-20230821162110150

image-20230821162209248

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

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

image-20230821162357371

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

image-20230821162450253

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

image-20230821162549739

经过刚才的这个分析,我们知道,影视链接的链接分配,有这样的一些优点和缺点,这就是刚才咱们得到的结论,这就不再赘述,接下来我们再来看显示链接的链接

image-20230821162629308

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

image-20230821162658820

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

image-20230821162846485

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

在这里插入图片描述

各位同学大家好,在这个小节中,我们会继续学习文件的物理结构,也就是文件分配方式相关的问题,那在之前的小节中,我们介绍了连续分配和链接分配,这两种分配方式,连续分配要求,给文件分配的必须是一些,连续的词旁块,而链接分配,允许,为文件分配的是一些离散的词旁块,和链接分配类似的是锁影分配这种啊,第三种分配方式,它同样允许,给文件分配的是一些离散的磁盘块,系统会为每一个文件建立一张锁影表,所影表当中记录了文件的各个逻辑块,对应的物理块,所以这个地方大家会发现,所影表的功能,其实有点类似于我们内存管理当中的,页表的功能,页表是建立了逻辑页面,到物理页之间的一个映射关系,那词盘当中,用于存放锁影表的那个词盘块就称为,文件的锁影块,而用于存放,文件实际数据的那些词盘块,就称为数据块,那直接来看个例子,假设有一个文件AAA,它的数据依次存放在了二,五十三九这么几个磁盘块当中,那采用锁影分配方式的话,系统会为AAA,这个文件建立一张锁影表,这个锁影表,记录了AAA,的这些逻辑块,和物理块之间的,一一对应的这种映射关系,那么如果说这个AAA,文件的锁影表是存放在7号磁,盘块当中的,那么7号磁盘块就是AAA的锁影块,而二五十三,九这几个磁盘块是AAA的数据块,那采用锁影分配方式的这些文件,需要在自己的目录像也就是FCB当中,记录自己的锁影块到底是哪一块,那锁影块当中存放的是锁影表,因此,系统可以根据这个锁影块的这个块号,找到他的锁影表,接下来就可以找到这些,呃各个逻辑块对应的物理块号了,那像这个例子当中,AAA的缩影表是存放在7号块当中的,它的这些呃实际数据是依次存放在2,五十三九这么几个块当中的,类似的假如说有另外一个文件BBB,它的缩影块是23号块,那么BBB的这个缩影表,就应该是存放在这个地方,所以这个地方大家会发现,如果采用的是锁影分配方式的话,那么每一个文件,都会有一张自己的锁影表,而之前咱们介绍的,显示链接的链接分配方式当中,文件分配表也就是fat,是一个磁盘只对应一张fat,所以就是他们俩的一个小小的区别,另外呢我们可以用固定长度,固定字节的存储空间,来表示这些物理块号,也就是所以表的这些表象,比如说像一个磁盘的总容量,假如说是1TB,也就是2的40次方个字节,并且磁盘块的大小是1KB,那么这么大的磁盘,就可以被分为2的30次方个磁盘块,因此要表示这么多个磁盘块,只需要用30个二进之位就可以了,那么四个字节的空间可以包含32个二,进之位,它是足够表示2的30次方格磁盘块的,快号的因此,我们可以让这个所引表的快号,每一个表象占4个字节,那所引表当中的这个逻辑快号,这些数据就可以是隐含的,因为这个锁影表的表象,每一行占的是4个字节,所以,只要我们知道这个锁影表的起始位置,那么我们就可以直接根据逻辑括号,直接计算出啊,某一个逻辑括号对应的那个表象,到底是在,呃什么什么位置啊,那接下来我们要探讨的问

image-20230821163518619

image-20230821163458063

问题是采用锁影分配方式,应该怎么实现逻辑快号,到物理快号的转变,假设,此时用户想要访问的是逻辑快号i,那么操作系统首先需要找到这个文件,对应的目录像,也就是它的FCB,从中找到这个文件的锁影快的快号,再从这个锁影快当中,读出这个文件的锁影表的内容,那么接下来就只需要通过逻辑快号,来查询这个缩影表,就可以找到,某一个逻辑快号,对应的物理快号到底是多少了,那这个查表的方式,其实和咱们内存管理当中介绍的,通过逻辑页号,来查询页表像的那种方式是很类似的,所以从这个过程分析我们可以看到,如果我们想要访问逻辑快号为i,的这个逻辑快的话,那么我们并不需要,顺序的访问前面的0到i减1号快,我们可以直接找到i号快,存放的物理快号,因此,所以分配这种方式是支持随机访问的,另外呢所以,分配这种方式,也很容易实现这个文件的拓展,比如说像AA这个文件,现在想要继续拓展也就是再分配一个,物理快数据快的话,那么只需要随便找一个空闲的磁盘块,比如说是19号磁盘块把它分配给AAA,然后再在AA对应的这个锁影表当中,增加相应的表象,这就完成了文件的拓展,因此所影分配方式中,文件的拓展也是很容易实现的,不过所影分配方式的这个所影表,需要占用一定的存储空间,这是它的一个小小的缺点,那接下来我

image-20230821163708575

我们再来考虑下一个问题,假设每个词盘块的大小是1KB,一个缩影表的表象也就是这样的,一行占用4个字节,那么一个词盘块呃只能存放1K除以4,也就是256个缩影项,那假如说有一个文件,它的大小已经超过了256个块,那也就意味着这个文件,它对应的锁影表,肯定也要超过256个锁影像,那既然如此,这么大的锁影表,肯定是没办法在一个磁盘块中,就可以装得下的,也就是说一个很大的文件,它对应的锁影表,在一个磁盘块下肯定存不下,那么我们怎么解决这个问题呢,一般来说有这样的3种解决方案,第一种叫做链接方案,第二种叫做多层锁影,第三种叫混合锁影,我们会依次介绍,那首先来看

在这里插入图片描述

看链接方案,如果说一个文件的缩影表太大,那么可以为这个文件的缩影表分配,链接的方式把它们连起来,那还是接着刚才的那个条件往下分析,假设一个磁盘块放256个锁影像,那么如果一个文件的大小,超过了256块的话,那么就意味着这个文件的锁影表,它的锁影像肯定也超过200,256个因此可以把这个锁影表拆分,为这个文件分配多个锁影块,每一个锁影块当中存放256个锁影像,并且在每个锁影块当中,用一定的空间存储,指向下一个锁影块的一个指针,那这样的话,就可以把一个很长的锁影表,拆分成不同的部分,并且用这种链接的方式,把它们连起来了,那如果采用的是链接方案的话,文件的SCB当中,只需要记录它的第一个锁影块的快号,像文件AAA就只需要记录,它的第一个缩影块,也就是7号块,那假设现在用户想要访问的是AAA的,逻辑快号为256的那个逻辑快的话,那为了查到,256号逻辑块对应的物理快号,那就肯定需要找到,AAA的第二个锁影块,而由于各个锁影块之间,是用这种链接的方式把它们连起来的,所以为了找到第二个锁影块的块号,那操作系统首先需要把第一个锁影块,读入内存,然后才能根据这个锁影块当中的指针,找到第二个锁影块的快号,并且把第二个锁影块读入内存,只有这样,才能找到256这个逻辑快号,对应的物理快号到底是多少,因此可以看到,如果说用户要访问的那个逻辑快号,对应的锁影像,是在这个锁影,表当中的第二个部分的话,那么系统首先必须先顺序的读取,锁影表的第一部分,之后才能找到锁影表的第二部分,那这个特点就造成了一个问题,假设一个文件的大小是64兆字节,那呃也就是256256个KB,那由于说每个磁盘块的大小是1KB,所以这个文件应该占用256256个磁盘块,也就需要对应同等数量的锁影像,而每一个磁盘块,每一个锁影块当中,只能存放256个锁影像,因此这么多的锁影像,就需要用256个锁影块来存储,并且如果采用的是链接方案的话,那这些锁影块之间是用,这种链接的方式把它们连起来的,所以如果说,一个用户,想要访问这个文件的最后的一个逻辑,快的话那么就必须找到,这个文件的最后一个缩影快,那通过刚才的分析我们知道,如果要找到最后一个锁影块的话,那么必须,先依次读入前面的所有的那些锁影块,所以可以看到,如果采用的是链接方案的话,那么为了找到,文件的某一个逻辑块对应的物理块号,光是这个一直转换的过程,就可能需要200多次读次盘的操作,那这显然是很低效的,这也是链接方案,所存在的最大的一个问题,那怎么解决这个问题呢,为此人们提出了多集,所以这种解决

image-20230821163820411

多层锁影的这种解决方案,就有点类似于咱们之前学习过的,多集页表的那,种原理就是要建立多层的锁影表,使第一层锁影块指向第二层锁影块,如果说文件很大的话,甚至还可以建立第三层第四层锁影块,那还是用刚才的那个条件继续分析,假设一个磁盘块只能存放256个锁影像,并且一个文件的大小,是256乘以256个块的话,那么这个文件可以为它建立两层锁影,第一层的缩影快总共有256个缩影像,第二层的缩影快,每一块也有256个缩影像,然后每一个缩影像,在指向某一个数据快,那在文件的目录表也就是FCB当中,只需要记录,它的顶级锁影表,存放的这个,缩影快号到底是多少就可以了,那如果说我们采用的是这种,两层锁影的结构的话,那文件的最大长度可以达到256乘以256,再乘以1KB,也就是64兆字节这么大,这是因为,如果我们采用了多级锁影的结构的话,那么各层锁影表的大小,不能超过一个磁盘块,也就是说,第一集的这个缩影表,最多只会有256个缩影像,也就是会分别指向256个,第二集的缩影表,而第二集的锁影表大小,仍然不能超过一个磁盘块,所以第二集的锁影表,最多也只会含有256个锁影像,那每个锁影像又会分别指向一个,数据块,每一个数据块的大小就是1KB这么大,因此如果采用两层锁影的话,那么文件的最大长度是64兆字节,这个条件十分重要,在考试当中,经常会遇到,让我们计算,文件最大长度的这种类型的题,那接下来我们来看一下,如果采用多级锁影的话,怎么实现逻辑括号到物理括号的转变,那假设此时用户要访问的是1026号,逻辑快那么1026/256=4,也就是说,1026号逻辑快对应的那个锁影像,应该是4号二级锁影表当中存放的,而4号二级所影表存放的位置,操作系统只需要,从这个一级所影表当中,找到4号所影像对应的那个物理块,就可以知道了,那在读入了4号二级所影表之后,接下来应该查询,4号二级所影表当中的哪一个表像呢,1026对256取于等于2,说明,此时需要查询的是4号二级所影表,当中的 2号表像,那找到2号表象之后,就可以找到,1026号逻辑快,对应的物理快到底是多少了,所以如果采用这种两层锁影的,方式的话,那么操作系统首先是需要根据这个,FCB当中记录的,顶级锁影块的快号,来找到顶级锁影表,先把顶级锁影表读入内存,然后查询相应的表象之后,又找到,相应的二级锁影表存放的物理快号,接下来再把二级锁影表读入内存,之后再查询二级缩影表,就可以找到我们最终想要访问的逻辑,块到底存放在哪个物理块当中了,所以这整个过程,访问目标数据块,总共进行了3次词读字旁操作,第一次是读入了一级缩影表,第二次是读入了对应的二级缩影表,第三次,才是读入我们最终要访问的数据块,那类似的,如果我们采用的是三层缩影的结,构的话,那文件的最大长度应该是256乘256,再乘256 再乘以1KB,也就是16GB这么大,那如果采用三层锁影结构的话,那访问一个目标数据快,总共需要4次读磁盘的操作,所以我们得到这样的一个结论,如果我们采用的是k层锁影结构,并且顶级锁影表的数据,还没有掉入内存的话,那么根据一个逻辑快号,访问一个数据快,总共需要k加一字读磁盘操作,才可以完成,那相比于之前的那种链接方案来说,这个读词盘的操作,已经是少了很多很多了,那这是多层所以需要注意的问题,第一大家需要,学会计算文件的最大长度到底是多少,第二大家还需要学会分析,这个访问一个数据块,到底需要多少读词盘操作,不过多层锁影的方式,也存在一个小小的问题,假如一个文件本来很小,它的数据块只有1KB这么大,但是这个文件如果在物理上采用的是,两层锁影的这种结构的话,那么读入这个文件1KB的内容,依然需要一次读词盘,两次读词盘三次读词盘操作,那可不可以用某种方式,来解决这个问题呢,为此,人们又提出了混合锁引的这种方案

image-20230821163833067

那混合锁影,它是多种锁影分配方式的一种结合,比如说一个文件的顶级锁影表当中,它可能会包含一些直接地址锁影,比如说8个直接地址锁影,那所谓的直接地址锁影就是指,这些锁影像是直接,指向了一个数据块,所以8个直接地址锁影,会对应8个数据款,另外呢这个顶级锁影表当中,还有可能会包含一些一级间接锁影,这个一级间接锁影,会指向一个单层锁影表,那这个单层锁影表的各个锁影像,又会分别指向一个数据块,每个数据块是1KB,另外,这个顶级锁影表还有可能会包含一些,二级间接锁影,那这个二级间接锁影,会指向一个两层锁影表,那这个锁影表的各个表象,又依次指向了一个下一级的锁影表,而第二层锁影表的各个表象,又分别指向了,一个一个的数据块,所以如果有8个直接地址所以的话,那他们会分别指向8个数据块,一个一级间接,所以会指向一个单层的所以表,而每个所以表最多只会有256个表向,因此,这个所以表最多只会对应256个数据块,那相应的二级间接,所以最多会指向256乘以256,也就是这么多个数据款,因此如果一个文件,它的混合锁影的顶级锁影表,是这样的结构的话,那么这个文件的最大长度可以有8+256,再加65536这么多个块,也就是65800KB这么多,那根据顶级缩影表的这些结构,来计算一个文件的最大长度,这种题型在考试当中也是很常见的,大家需要重点的把握,接下来我们来分析一下,如果要访问某一个逻辑块,那么需要几次读词方操作呢,假设此时,这个顶级索引表还没有读入内存,那么如果说我们要访问的是0-7号,逻辑块,也就是要访问的是这个部分的话,那么我们总共需要两次读词方操作,第一次是读入顶级索引表,第二次是根据顶级索引表,当中的某一个直接地址,到我们的目标数据快存放的位置,然后再把这个目标数据快读入内存,所以总共需要一次读词盘,两次读词盘操作,那如果说,我们要访问的是8-263号逻辑快,也就是要访问的是这些逻辑快的话,那么总共需要,第一次读词盘操作是读入顶级缩影表,第二次是根据这个一级间接所以,找到这集的缩影表,然后把这个锁印表读入内存,第三次是根据这个锁印表的内容,再找到我们的目标数据块存放的位置,然后再把目标数据块读入内存,所以总共需要一次读词方操作,两次读词方操作三次读词方操作,那相应的,如果我们要读的是这个范围的逻辑块,也就是这些词方块的话,那么总共需要一次,两次三次四次读词方操作,所以可以看到,采用混合锁影的一个好处就是,对于小文件来说,他可能只需要占用前面的这几个,跨就可以了,那小文件的读取,只需要访问比较少的读词盘的次数,那一般来说,我们计算机当中小文件是更多的,所以这是混合锁影这种方式,带来的一个好处,好的那么我们介绍了当文

image-20230821163847875

件太大所以表象太多的时候,呃采取的可以采取的3种解决方案,第一种链接方案就是把各个缩影快用,链接的方式把它连起来,但是它所带来的缺点就是,如果一个文件很大,缩影表很长的话,那么想要找到i号缩影快,就必须先依次读入0到i减1号缩影快,这就导致要查询一个缩影像的时候,自盘IO次数可能会很多的问题,所以这种方案查找效率低下,为此我们可以建立多级锁影,就有点类似于我们啊,在内存管理当中采用的多级页表那样,然后第一层锁影块会指向第二层的锁,影块,如果说一个文件很大的话,甚至还可以建立3层甚至4层的锁影块,那如果我们采用的是k层锁影结构,并且,顶级锁影表还暂时没有掉入内存的话,那么访问一个数据块,只需要k加一字读词盘的操作,但是这种方式的缺点呢,就是即使是小文件,访问一个数据块,依然是需要k加依次读词的操作,所以人们又提出了混合锁影这种方式,一个文件的顶级锁影表当中,可以既包含直接地址锁影,也包含一级间接锁影,也包含二级间接锁影,那直接地址锁影,会直接指向一个数据块,而一级间接锁影,会指向一个单层的锁影表,这个锁影表呢,再依次又指向各个数据块,两级间接锁影,是指向一个两层的锁影表,那如果采用这种混合锁影的方式的话,对于小文件来说,访问一个数据块所需要的读次盘,次数就可以变得更少了,锁影分配方式在考试当中是,经常进行考察的,无论是小题还是大题,所以,大家需要重点掌握的是这样的两个点,第一要学会根据多层锁影,或者混合锁影的那种呃结构,来计算出一个文件的最大长度是多少,那要计算最大长度,大家最关键的是需要理解,各级锁影表最大是不能超过一个块的,要知道这个条件,第二个大家要学会的是,要能够自己分析,访问某一个数据快,或者说,访问某一个逻辑快号对应的物理快,所需要的读词盘次数到底是多少,那操作系统需要从外存当中,依次的读入顶级锁影快,然后下一集的锁影快,再下一集的锁影快,依次类推,那大家需要注意的是题目当中的条件,顶级锁影快,到底是不是已经掉入内存了,那这个部分内容十分重要,特别是混合锁影相关的知识点,很容易啊综合的来考察大家,所以大家还需要根据大量的课后习题,来进行进一步的巩固,那这个地方我们

image-20230821164837119

再把上个小节和这个小节的内容,进行一个,汇总总结,我们需要掌握,各种分配方式的一个思想,像顺序分配,就是要求为文件分配的,必须是连续的词盘块,而链接分配,又分为影视链接和显示链接两种,他们都可以为文件分配离散的词盘块,而影视链接是把每个词盘块都用,链接指针的方式把它们连起来,显示链接的话,是为词盘建立一个文件分配表,然后在这个表当中,记录各个词盘块的先后关系,并且这个文件分配表是在开机的时候,就会掉入内存,并且之后会一直藏住内存,而所以分配方案会为文件的数据快,建立一些所以表,而如果文件的所以表太大的话,又可以采用链接方案多层所以和混合,所以这几种方式来解决,那采用不同的分配方式,在文件的目录像FCB当中,所需要记录的这些信息,也是有一定的区别的,另外大家还需要理解,这些各种分配方式的优点和缺点,各种分配方式的优点和缺点,很容易在选择题当中进行考察,那最后还需要强调一遍,如果说题目当中,只是简单的告诉我们一个文件,采用的是链接分配方式,而并没有,告诉我们,他到底是影视还是显示链接的话,我们一般都是默认为他指的链接分配,是影视链接的方式,好的,那么以上就是这个小节的全部内容,,

image-20230821164903199

No.5 逻辑结构VS物理结构

好的那通过之前的学习,同学们已经初步的认识了,什么是文件的逻辑结构,什么是物理结构,但是这两个部分的内容里面,有很多很相似的概念,所以呃,很多同学在学习这两部分内容的时候,可能会觉得比较懵,所以这个小节当中,我们会介绍一些比较具体的例子,带大家把逻辑结构和物理结构当中,涉及到的一些很相似的概念,进行一个对比,好来简单回顾一下,文件的逻辑结构,分为无结构文件和有结构文件,其中有结构文件又分为顺序文件,锁影文件和锁影顺序文件,那顺序文件又可以进一步的细分为,顺序存储和链式存储两种实现方式,而大家在学习文件物理结构的时候,又发现有一种叫做链接分配的方式,是不是和顺序文件的链式存储,感觉很像,但是,又不知道它们之间具体的区别在哪儿,那还有另外一个很容易让大家,蒙圈的点,就是逻辑结构里边,我们学习了锁影文件,然后在物理结构里面,它还有一种叫做锁影分配的,这种分配方式,好不着急,我们接下来从简单到复杂,把这些问题给捋一遍那我们

image-20230822125735713

先来看一下呃,用c语言怎么创建一个无结构的文件,也就是流失文件,不知道大家对c语言的呃,熟悉程度怎么样,在c语言里边,任何一本c语言的教材,肯定会教大家如何操作文件,比如如何打开一个文件,如何关闭一个文,件如何往一个文件里边写入一些数据,这些都是大家在学习c语言的时候,会接触到的内容,那我们简单的把这些代码解释一下啊,刚开始这个地方,我们调用了一个叫做f open的函数,这个函数做的事情就是,打开了叫做test点TXT的这个文件,并且是以写的方式打开的,以写的方式打开,我们才可以往这个文件里边写入数据,好如果这个文件打开成功了,那么FP这个指针,就会指向,和这个文件相关联的一些信息,那feel,这个数据结构是,c语言它内部已经定义好的,大家可以简单的把FP这个指针,理解为是指,向我们要操作的这个文件的就可以了,好接下来这个if语句是进行一个呃,打开文件是否成功的一个判断,如果打开文件成功,那我们就可以进行下面这些操作,好这个复循环总共循环了1万次,每一次的循环都会使用,f toots这个呃c语言提供的库函数,往FP所指向的这个文件当中,写入hollow word,所以其实这个复循环做的事情,其实就是往test点TXT当中,写入了1万个hello word,那当我们对文件的操作完成之后,需要再调用f close,这个扩函数来关闭文件,好那对c语言不熟悉的同学,如果有兴趣的话,也可以把这段代码在你的电脑上,敲一遍运行一遍,那你会发现,在你的代码运行的这个目录下,如果以前没有test点TXT这个文件的话,那么当你调用fopen之后,它会自动的给你新建这样的一个文件,然后经过你的这些代码处理,这个文件当中会有1万个hollowered,想要我们往这个test点,TXT当中写入的这些数据,其实就是一个一个的字符,每一个字符占一个字节,h一个字

在这里插入图片描述

节e一个字节l一个字节,然后空格感叹号这些各占一个字节,在我们用户,也就是创建文件的人呃看来,整个文件,它似乎是占,用了一整片连续的逻辑地址,空间这是第一个字节,这是第二个字节,这是第三个字节第四个字节,好以此类推,整个地址空间似乎是连续的,如果我们想在这个文件当中,找到第16个字符,我们可以用这样的一段代码来实现啊,首先肯定也是需要先打开文件,然后这个地方,我们可以调用一个c语言,提供的库函数,叫做f z c,这个库函数做的事情就是,会把文件的读写指针,指向16这个位置,也就是文件的第16个字节,那第16个字节刚好是o这个字母,而接下来,我们又可以再调用f get c这个库函数,来读出当前这个读写指针,所指向位置之后的一个字节的内容,也就是读出o这个字母,那把读出的数据付给啊c这个变量,然后我们用print函数,可以打印出c这个变量到底是什么,那打印出的结果就是o那,同学们也可以自己敲一下这段代码,试一下好,总之利用FC这个函数,我们可以啊,把文件的读写指针,指向任何一个我们想要读写的位置,然后再利用其他函数,就可以读出啊若干个字节的数据,那这其实就是对文件的读操作,那刚才我们是读出了第16个字符,相应到其实我们也可以读出,比如说第1,000个字符,第2,000个字符,只需要修改一下FC的这个参数就可以,好总之在我们用户看来,似乎我们所有的这些字符,都是连续存放的,他都是占用一片连续的逻辑地址空间,所以我们只需要提供,我们想要访问的那个字符,他在文件当中的逻辑地址,就可以顺利的找到,我们想要找到的任何一个数据,这是从我们用户的视角看到的样子,但是从操

image-20230822130114724

操作系统的视角来看,其实我们的这一整个文件,它无非就是一些一堆二进制数据而已,操作系统并不关心,你在里面存的到底是什么,管你是字符也好还是什么数字也好,操作系统唯一需要关心的就是,由于每一个磁盘块的大小只是1KB,所以他会把我们的这一整个文件,拆分成一个一个的逻辑块,然后他们的逻辑块号是0123,是一个连续的范围,接下来操作系统会根据呃,他的文件管理的策略,来决定到底是用连续分配,还是其他的分配方式,把你的这些文件的数据块,存到磁盘里边,比如说如果采用连续分配的话,那么逻辑上相邻的这块,在物理上,也会被操作系统相邻着来存放,所以我们作为文件主,作为用户在使用这个文件的时候啊,从刚才那个例子当中也可以看到,我们使用c语言的这些库函数的时候,其实我们只是指明了我们想要,访问这个文件的哪一个逻辑地址,然后要读出或者要写入多大的数据,我们都只需要指明逻辑地址就可以,那像f get c这个函数,它在底层,肯定是使用了操作系统提供的,read系统调用,那操作系统在处理这个系统调用,请求的时候,它会把f get,c这个函数给它传递的逻辑地址,把它转换为逻辑快号,和快内偏移量这样的形式,然后再根据自己的存储分配策略,来把逻辑快号转变为,与之对应的物理快号,这是操作系统在背后帮我们做的事情,其实对我们用户来说,他在背后做的这些事情,我们是不可知的,也没必要关心,我们作为文件的使用者,只需要关心文件里边的呃,各种各样的数据,到底是存放在哪一个逻辑地址里边的,我们只需要关心这个就可以了,那我们的操作系统当然也可以把刚才,划分的这些逻辑块,用这种链接分配的方式,把它们给链接起来,同样的也可以采用锁影分配的方式,就是为我们的这个文件专门,建立一个锁影表,在这个锁影表当中记录下来,逻辑快号到物理快号的这种映射关系,总之对于文件的存储,无论操,作系统采用的是什么样的分配方式,什么样的物理结构,只要我们提供了我们要访问的,文件的逻辑地址,操作系统总能把它转变为,相应的物理快号和快内,篇一量这样的形式,好接下来我们再来,

image-20230822130323338

image-20230822130332665

image-20230822130343507

来看另一个例子,我们尝试着用,c语言来创建一个顺序文件,还记得顺序文件吗,文件分为无结构文件和有结构文件,对有结构文件来说,它由一条一条的记录组成,而有结构文件,又进一步的可以划分为顺序文件,锁影文件和锁影顺序文件,那我们可以首先,定义这样的一个struct结构体,这个结构体表示的是一个学生的信息,包含了学号然后姓名专业,每一个学生对应,这样的一个struct结构体,好那接下来,我们尝试着把,n个学生的信息存入一个文件,那首先我们肯定也是需要先打开文件,就是调用之前介绍过的f open这个函数,以写的方式打开,好,接下来这个地方我们会定义一个数组,这个数组里边存放了n个学生的信息,那接下来这个复循环里面,我们做了一个简单的数据的填充,我们会把这n个学生的这个学号,分别把它填上,呃,就是0到n减一这样的一个学号的范围,然后每个学生的名字还有专业这个,呃未来简单,期间我们就简单的把它填上一个问号,但是其实啊,由于我们名字还有专业这两个信息,我们是总共分配,了30个字节30个字符的这个空间,所以如果你愿意的话,当然也可以给姓名,专业这些填入更丰富的不一样的信息,好那这个部分的代码,我们只是往这个数组里边,填入了一些数据,那接下来我们会调用一个叫做f right,的函数,这个也是c语言提供的一个括函数,要用这个函数,可以把我们刚才定义的这,n个学生的信息,也就是这n个struct结构体,把它存到FP所指向的这个文件当中,第一个参数student,指明了我们要写入的那些数据,的一个起始地址,其实也就是这个数组的首地址,第二个参数指明了每一条记录,它到底占多大的空间,然后第三个参数,指明了我们要写入几条记录,好那调用这个函数之后,其实刚才我们定义了这n个学生的,啊信息这n个struct结构体,就会被保存到词函里边,在我们自己看来,我们的这个文件里面,每一个学生记录是占64个字节,因为这个int型的变量它是占4个字节,然后下面这两个叉型的数组,分别又占30个字节,所以每一个学生信息,每一个strapped结构体,它总共是64个字节,当然更简单的方法,其实我们只需要用c元提供的size of,就可以得出每一个学生记录,它的大小是多少,好所以基于我们自己的视角,如果我们想要在文件里边,读出第五个学生的信息,第五个学生所对应的记录,那么我们只需要用这样,的一段代码就可以实现,首先当然也是需要先打开文件,打开我们刚才保存的这个文件,然后是以读的方式打开,接下来我们调用之前介绍过的FC,这个函数,还记得这个函数的作用吗,会让文件的读写指针指向呃,从开头位置算起,往后偏移5,乘以size of students in four这样的一个位置,其实也就是指向这个位置,第五个学生存放的其实位置,接下来要用f r的这个函数,可以读出一条记录,这条记录的大小,其实就是这样的一个结构体的大小,然后把读出的这个数据付给,Stu这个变量,那这样的话,我们就从文件里边读出了5号学生的,他所对应的记录,好总之在我们用户看来,每一个学生的记录,他似乎就是连续存放的,并且每个学生的记录,他所占的这个空间大小是相同的,所以当我们想要从文件里边,读出某一个学生对应的记录的时候,其实我们就可以很方便的算出,那一条记录所对应的逻辑地址,总之我们只需要给操作系统提供,我们想要访问的这个逻辑地址,然后接下来的事情,操作系统会替我们完成,事实上在被

在这里插入图片描述

后从操作系统的视角来看,那,同样的是把我们这一整个文件的数据,把切分成了一个一个的,小块每一块的大小就是和磁盘的,呃就是和磁盘块保持一致,比如说都是1K比,那操作系统当然可以采用连续分配,的方式来存储这些逻辑块,也可以采用链接分配,也可以采用锁影分配,但是他到底采用了哪种分配方式,我们其实是不得而知的,也没必要关心,反正我们作为用户,只需要能够提供我们想要访问的记录,他所存放的逻辑地址,然后剩下的这个,逻辑地址转换成逻辑快号,逻辑快号再转换成物理快号,这些事情都是遭,系统在背后帮我们完成的,好那刚才我们给出的这,这个例子,这个顺序文件,它是采用了顺序存储的方式,也就是这些记录,逻辑上相邻的记录,是一个连一个都是相邻的存放的,那其实当我们在存储这些记录的时候,我们当然也可以使用啊,链式存储的方式来实现,比如说,当我们在定义这个学生信息的时候,我们可以再增加这样的一个字段,叫做next,这个字段是指向了下一个学生,记录的存放位置,那和之前类似,我们也可以定义一个,比如说长度为1万的,这个students in four数组,也就是说,最多,我们总共可以存1万个学生的信息,好那0号学生的信息,比如说他是存在,数组下标为0的这个位置,那我们可以在这个学生对应的,这个结构题当中,记录下一个学生,也就1号学生他的存放位置,那他存在数组下标为3的地方,0号学生对应的结构题当中,这个next的变量我们可以把设置为3,这样的话,其实就相当于我们建立了一个,指向下一个记录的指针,那这不就是所谓的链式存储吗,我们所有学生的数据是,存放在这样的一大片连续空间当中,但是各个逻辑上相邻的学生数据,我们又是通过这种,链接指针的方式把它们连在一起的,所以这就是所谓顺序文件的链式存储,这其实是由我们用户自己来设计的,那如果我们采用上面这种,顺序存储的方式,来存放各个学生记录的话,那我们可以很方便的算出第二个学生,他的记录存放的地址,然后用这个逻辑地址,就可以,直接命中我们想要找的那条记录,而如果我们采用的是下面这种,链式存储的方式,那我们想要找到第二个学生的记录,那我们只能先读入第一个学生的记录,然后一个一个往后找,其实这就和数据结构里面的,顺序表和列表,都是一样的,总之当我们在创建一个文件的时候,我们可以自己来决定,到底是用顺序存储的方式来存放这些,记录还是用链,式存储的方式来存放这些记录,但是无论如何,在我们自己看来,这些记录,他肯定都是占用了一整片的连续空间,这是从我们的视角来看到的东西,那从操作系统,

image-20230822130716901

image-20230822130746054

image-20230822130756987

视角来看,刚才我们实现的这种,链式存储的顺序文件,其实操作系统在背后,也会把它拆分成1 K B,1 K B 1 K B这样的一个一个的快,然后这些物理快,操作系统在背后有可能会采用,连续分配的方式,把它们存放在磁盘当中,当然也可以采用链接分,配的方式把它们存放在磁盘当中,所以,这也是很多同学比较容易疑惑的点,我们在讲逻辑结构的时候,讲到,顺序文件可以采用链式存储的方式,在讲物理结构的时候,我们又讲到了链接分配的方式,就是这两个东西看起来很像,其实文件的逻辑结构里边,我们聊到所谓的链式存储,指的是我们在文件的内部,这些记录的先后顺序,我们是用链接指针把它们连起来的,这是由我们文件主自己来设计的,那在文件的物理结构里边,提到的所谓的链接分配,其实这个链接是操作系统做的事情,操作系统会把我们给出的这一整个,很大的文件,把拆分成一个一个的逻辑块,然后在磁盘里面,存放这些逻辑块的时候,操作系统,会用链接的方式来记录这些逻辑块,他们之间的先后顺序,那大家可以用这个例子好好体会一下,逻辑结构里边我们提到的链式存储,和物理结构里面提到的链接分配,他们的一个区别,总之在讲文件逻辑结构的时候,我们谈到的链式存储,其实这些链接信息,是我们用户需要关心的,操作系统他并不管,而文件的物理结构里面,我们提到的链接分配,这些链接信息是操作系统需要关心的,我们用户并不需要管,那大家再结合这个例子,好好的体会一下,好那我们继续再

image-20230822130952931

再来聊一个同样是让大家很懵的问题,在学习文件的逻辑结构的时候,我们提到过锁影文件这种逻辑结构,那如果我们要自己实现,锁影文件这种逻辑结构的话,可以怎么做呢,我们可以先定义这样的一个结构体,那这样的一个结构体,就是对应的一个锁影像,每一个锁影像记录了学生的学号,还有这个学生记录,他所存放的逻辑地址,就是记录了这样的一个因社关系,那我们之前介绍那段代码,其实已经告诉大家,怎么把呃struct结构体存到文件里边了,那用类似的方法,我们当然可以,把这些一个一个的index table,这种struct结构体,存到我们的文件里边,每一个index table对应一个缩影项,然后接下来的这一片空间,我们可以定一个长长的studenting for,这样的一个数组,然后这个数组当中,存入各个学生的信息,然后我们的各个缩影项会建立起学号,还有各个学生信息的这种映射关系,那这个例子其实就是一个锁影文件,这种逻辑结构,同样也是由我们,由文件的创建者自己来决定的,比如说我们可以规定,在我们的这个文件,前边的一兆字节,我们存放的都是锁影像的信息,然后后边的这些部分,我们存放的是这些,一条一条的记录相关的信息,所以当我们想要根据,学生的学号,找到这个学生所对应的记录的时候,我们就可以先把这,前边的一照字节的,啊这些数据先给读进来,然后查询我们的这些所影像,找到目标学生他的所影像,然后再根据这个所影像的信息确定,目标学生,他的记录,到底存放在哪一个逻辑地址当中,然后接下来再来读取这个学生的信息,就可以了,好总之对于锁影文件这种逻辑结构,其实在我们用户看来,我们的这整个文件,它依然是连续存放的,依然是占用了一整片的连续空间,然而在背后,操作系统其实,同样的会把我们的这一整个文件,把它拆分成一k b一k b这样一个一个

image-20230822131128321

image-20230822131138816

小块然后操作系统会把这些逻辑块,存到磁盘里边,当然可以采用连续分配链接分配,也可以采用锁影分配的方式,也就是说操作系统会维护一个锁影表,那这个锁影表是记录了各个逻辑快号,到物理快号之间的映射关系,好所以,这也是很大家很容易混淆的一个点,我们在逻辑结构里边,讲到的所谓的锁影文件,这个锁影文件的锁影表,其实是由文件主,由用户自己来建立的,这个锁影表当中记录的是,各个记录的关键字,到记录所存放的逻辑地址,之间的一个映射关系,而我们在文件的,物理结构里面提到的锁影分配,这也有一个锁影表,这个锁影表其实是由操作系统建立的,它是实现了,逻辑快号到物理快号之间的映射关系,所以锁影文件这种逻辑结构,和锁影分配这种物理结构,很容易混淆,但它们之间其实完全两个维度的东西,那大家也可以利用这个例子,再来好好的体会一下,好的,这个小节当中我们对比了逻辑结构

image-20230822131214120

image-20230822131234243

和物理结构当中,比较容易让大家混淆的一些概念,并且我们简单的介绍了两段代码,让大家感受一下,用c语言如何创建或者啊,读取一个无结构文件或者有结构文件,其实所谓文件的逻辑结构,是从我们用户,从我们文件的创建者这个视角,所看到的文件,它应该有的一个样子,在我们自己看来,我们创建的这个文件,它似乎就是占用了一整片的连续空间,所以当我们访问这个文件当中,某一个部分的数据的时候,其实我们只需要指明逻辑壁纸就可以,那操作系统要做的事情就是,我们这么大的一个文件,它到底用什么样的物理结构,把它分散的来存储,那当我们用户提供了我们想要访问的,文件的逻辑地址之后,操作系统还需要负责把,逻辑地址转换成相应的物理地址,所以文件的逻辑结构是什么样的,操作系统他并不知道,也不需要关心,而物理结构是什么样的,我们用户不需要知道也不需要关心,各司其职,自己干好自己的事情就可以了,好,最近这几个小节的内容确实是比较多,也比较容易混淆,那大家还需要慢下来,把节奏慢下来好好消化一下

image-20230822131401544

No.6 文件存储空间管理

各位同学大家好,在这个小节中,我们会开始学习文件存储,空间管理相关的知识点,那在之前的小节中,我们学习了文件的物理结构,也就是啊对非空闲磁盘块的管理,那在这个小节中学习的对,存储空间的管理,其实就是对空闲的那些磁盘块的管理,那么这个小节我们,首先会介绍啊,存储空间的划分与初始化,要介绍几个比较重要的概念,文件卷目录区和文件区,之后这个小节的重点内容,是要介绍,这个存储空间管理的几种方法,空闲表法空闲链表法,卫士图法和乘组链接法,我们会按从从上至下的顺序依次讲解,那在学习这几种管理方法的时候,大家需要从这样的三个角度,来进行理解和记忆,第一这些方法是用什么样的数据结构,用什么样的方式,来记录和组织那些空闲的磁盘块的,第二要注意的是,用某一种方法是怎么分配磁盘块的,第三个是要注意怎么回收磁盘块,那我们首先来看,存储空间的划分与初始化,如果自己安

image-20230822131658339

image-20230822131712067

安装过Windows操作系统的啊同学,肯定有这样的经验,就是在安装系统的时候,有一个必经的步骤,就是要让我们为词盘分区,也就是分成我们平时熟悉的什么c盘,d盘e盘这样啊这样的一些逻辑词盘,那这些所谓的CDEF盘,就是我们这儿所谓的文件卷,或者叫逻辑卷逻辑盘逻辑词盘,那我们的一些文件就是存放在这些,各个文件卷里的,另外,在存储空间的初始化的过程当中,也需要把这些文件卷进行进,一步的划分划分为目录区和文件区,其中目录区,主要是用于存放,文件目录相关的一些信息,像咱们之前学过的呃文件目录像FCB,还有缩影节点,这些就是存放在目录区当中的,另外呢,用于磁盘存储空间管理的那些信息,那些数据结构,也是存放在目录区当中的,就比如说咱们这个小节,接下来会学习的什么空闲表啊,还有卫视图啊之类的,这些数据结构,就是要存放在目录区当中,那文件区呢,就是用来存放普通的文件数据,所以这是文件区和目录区的区别,另外在有的支持超大型文件的那些,操作系统当中,也支持多个物理磁盘组成一个文件卷,那像平时咱们自己啊使用的电脑,都是把一个物理磁盘划分成多个,这种逻辑磁盘,但是在有的系统当中,可以把多个物理磁盘合并成一个,逻辑磁盘,一个文件卷,那这是存空间的划分与出示化,需要注意的几个知识点,首先是要知道什么是文件卷,或者叫逻辑卷逻辑盘,另外呢我们需要知道,文件卷会划分成目录区和文件区,还需要知道文件区和目录区,分别是用于存放什么数据的,另外我们需要注意的是,文件券是可以由多个物理磁盘组成的,那接下来我们

image-20230822131850133

来看一种啊存储空间的管理方法,空闲表法,假设一个系统当中此时是这种情况,绿色的这些是表示空闲快,橙色的是表示非空闲的快,那假设使用的,是空闲表法的话,此时这个系统的磁盘,对应的空闲表就是这个样子,其实这个空闲表和我们在,内存管理的动态分区分配当中,学习过的空闲表,是极其类似的,它就是记录了,每一个空闲区间的起始位置,还有这个空闲区间的长度,这几这两个信息,那像第一个空闲区间是零一,这两个呃连续的,这个空闲快,所以这个空闲,区间对应的是第一个表象,那他的第一个空闲次旁快号是0,然后空闲旁快数是2,来看这个空弦区间10-14,这些都是空弦的词盘块,所以它对应的第三个表象,第一个词盘块号就是10,然后空弦盘块数就是5,这个很好理解,空闲表法一般来说适用于,文件的物理结构,是连续分配的啊,这种场景下,那接下来我们要探讨的问题是,采用这种方法应该怎么分配此板块,其实和内存管理的动态分区分配,是很类似的,我们首先需要知道的是,采用这种方式的话,那为文件分配的是一个连续的存空间,那我们同样可以采取像首次适应,最佳适应,最快适应,这些算法,来决定,到底要为文件分配哪一个空闲区间,那我们直接来举个例子,假设此时新创建了一个文件,这个文件请求呃要用要用三个词方块,那么如果我们采用的是首次适应,算法的话,系统会依次检查,这个空闲表当中的各个表象,然后找到第一个能够满足三个块,这样需求的一个空闲区间,那第一个空闲区间只有两个空闲块,显然不,满足第二个依然不满足第三个,有5个空闲块,因此这个空闲区间,是第一个能够满足三个连续的快,这样的要求的一个空闲区间,所以我们从这个空闲区间当中,摘出三个词盘块,分配给这个文件,也就是101112这三个词盘块,那么把它们分配了之后,这这个空闲区间的属性就改变了,因此我们也需要修改这个空闲区间,相应的一些数据,他的起始盘块号变成13号,然后他的空闲盘块数量就只剩下两个,那这是首次适应算法的一个例子,那最佳适应和最快适应,其实和咱们之前啊,在内存管理当中,介绍过的思想是一样的,最佳适应就是要找到一个,能够满足他的这个要求,并且最小的一个空闲区间进行分配,那最快适应的话,就是找到一个能够满足他需求,并且最大的一个连续的空闲区间,进行分配,因为学习过内存管理,所以这些应该都不难理解,这就不再展开,那接下来我们要探讨的问题

image-20230822132109051

于是我们应该如何回收磁盘块,其实和动态分区分配依然是很类似的,当我们回收某一个存储区的时候,某回收某一些磁盘块的时候,我们需要注意的就是表现合并的问题,要注意,我们可能会呃遇到这样的4种情况,第一种情况是,回收区的前后都没有相邻的空闲区,那这种情况下就是会在空闲表当中,新增一个表象,第二种情况回收区的前后都是空闲区,那这种情况需要把它前后的空闲区,还有这个新回收的区域,它合并成同一个空闲区,因此如果发生第二种情况的话,那么表象的数量是会减少一个的,那第三种情况回收区的前面是空闲区,第四种情况回收区的后面是空闲区,三四这两种情况啊,并不会导致,空闲表的这个表象的数量有所改变,那我们直接来看第二个情况的例子,就是回收区前后都是空闲区的这,种例子,这此时有我们删除了一个文件,那系统要回收他所占用的151617,这几个磁盘块,因此回收151617这几个磁盘块的时候,会发现这个回收区的前面,和后面,都是有两个相邻的这种呃空闲区间,因此我们需要把这一整片的空闲区,把它给合并,因此,需要把这个空闲表当中的这两个表象,合二为一,变成这种形式,第一个空闲盘块号是13,那空闲盘块数是连续的8个,所以这个地方是8,这可以看到,当我们的回收区的前后,呃都是有相邻的空闲区的话,那么当我们把它回收了之后,会导致这个空闲表的表象数量减一,那另外的这三种情况,大家再结合咱们之前,内存管理当中学习过的那些内容,再自己进行分析一下,这就不再展开,那以上就是空闲表法啊,需要注意的一些问题,第一个需要注意的就是,系统是怎么记录这些空闲区间的,信息的第二个问题,我们需要注意的是,应该怎么进行次方块的分配,第三个我们需要注意的是,应该怎么回收这,些次方块,那接下来的一些存储空间管理方法啊,需要注意的也是这样的3个问题,好的那么下面

在这里插入图片描述

我们来看第二种方法空弦链表法,空弦链表法,又可以进一步划分为空弦盘块链,和空弦盘区链,它们的区别在于,空弦盘块链它是以盘块为单位,组成一条空弦链,就像这个样子,每个空弦的盘块中,都会存储着,指向下一个空弦盘块的这个指针,而空弦盘区链,是以盘区为单位组成一条空弦链,所谓的盘区,就是一些连续的空弦盘块,可以组成一个盘区,比如说像这个地方,121314这几个空弦盘块,由于它们是连续的,所以把它们组成一个啊盘区,然后,作为这个空弦链当中的其中一个节点,所以,这是空弦盘区和空弦盘块的一个区别,那通过这个图应该很好理解,那各个空弦盘区当中的一个盘块,里边会记录这个盘区的长度,还有下一个盘区的指针,比如说像这个地方21号盘块当中,就记录了这个盘区的长度是3,并且记录了指向下一个盘区的指针,也就是指向6号子盘块,那这是空弦盘块链,和空弦盘区链的一个区别,那接下来我们来看一下,采用这两种方式的话,对这个,呃磁盘块的分配与回收有什么区别,如果

image-20230822132301023

弹的是空弦盘块链的话,那么首先系统会保存着,链头和链尾的指针,比如说像这个例子当中,链头就是20号磁盘,块链尾就是0号磁盘块,那么当需要分配k个磁盘块的话时候,系统就会从这个链头的位置开始,依次,呃从链头摘下k个磁盘块进行分配,并且修改这个空弦链的链头指针,那大家都学过数据结构,所以这个地方很好理解,那怎么回收呢,回收也很简单,我们需要回收的磁盘块,会把它依次挂到链尾,并且需要修改这个空弦链的链尾指针,所以这就是空弦盘块,链进行分配和回收的时候,需要做的,呃需要做的事情,那从,空闲盘块链的这个分配与回收的过程,我们也可以看到啊,这种方式一般来说,是适用于离赞分配的物理结构,那由于进行分配的时候,都是要从链头一个一个的摘下这些,空闲磁盘块,所以,为一个文件分配多个磁盘块的时候,可能需要重复多个操作,需要依次从链头摘下,接下来我们要讨论的是如何采

image-20230822132426610

常的是空弦盘区链的时候,呃应该怎么分配给回收呢,首先与空弦盘块链相同的是,操作系统同样是需要保存,这个链头和链尾的指针,那在进行分配的时候,如果说一个文件申请k个盘块,那么我们同样是可以采用首次适应,最佳适应等等呃那些算法,从链头开始解锁,然后按照算法的规则,找到一个大小合适的啊这种空闲盘区,分配给文件,而如果说我们没有找到,合适的这种连续空弦块的时候,也可以把不同盘区的盘块同时,分配给一个文件,假如一个文件,它此时是需要啊6个磁盘块,那么由于在这个盘区链当中,找不到连续的6个空弦磁盘块,所以我们也可以把中间的这3个,还有这3个呃磁盘区都分配给文件,那这是分配的时候,一般来说会采取的策略,那如果说要回收一些磁盘块的话,那和咱们之前介绍的空闲表法一样,我们主要需要注意的是这个,回收区和空闲盘区的一个合并的问题,如果说此时回收的这几个空闲盘块,呃,没有与他们相邻的这种空闲盘区的话,那么这个回收区就会作为一个单独的,空闲盘区,挂到这个链的链尾,比如说此时回收的是1718这两个盘块,那么由于,他们的前面和后面,都没有相邻的空闲盘区,所以1718会作为单独的一个空闲盘区,然后把它挂到这个链的链尾,那这种空弦盘区链既适用于离散分配,也适用于连续分配,并且比起空弦盘块链来说,它给一个文件分配多个盘块的时候,效率要更高,因为空弦盘块链,只能从这个链当中,一个一个一个的把这些,磁盘块摘下来,而空弦盘区链可以一次摘出一大片,连续的空弦区间,所以它在分配多个磁盘块的时候,效率是要更高的,那接下来我们,

image-20230822132538271

再来看第三种,呃存储空间的管理方法位式图法,这也是咱们在考试当中,最常考的一种方法,那这种方法的原理其实也很简单,就是用一个一个的二进,之位来分别对应各个盘块的呃,是否已分配这样的一个信息,比如说在这个例子当中,我们用0来代表一个盘块空弦,用一代表一个盘块不空弦以分配,那像啊这个地方,如果绿色的表示的是空弦,橙色表示的是不空弦的话,那前四个应该是零一 01,那这个地方就是0101,与他们都是一对应的,那后面的8个都是非空弦的,所以之后应该有8个连续的,112345678这八个连续的1分别对应这8个,非空弦的块,那再接下来的四个块是空弦的,所以接下来的四个二进之位应该是0,所以卫士图法的这种原理并不难理解,那一般来说,这个位识图的数据,在系统当中存储的时候,都是会存储成一系列连续的字,那比如说在这个例子当中,一个字的字长是16位,也就是这样的一行是16位,那每一个字有16个二进制位组成,因此,我们可以用字号和位号这样的二元组,来定位到其中的某一个二进制位,所以考试当中经常考察的内容就是,怎么从字号和位号,推算出他所对应的盘块号,或者怎么从盘块号逆,推出这个盘块号所对应的字号和位号,那这也是我们需要重点掌握的内容,那在做这个类型的题目的时候,大家一定需要注意题目的条件,盘块号,字号位号这些到底是从0开始的,还是从一开始的,这个例子当中,盘块号字号位号都是从0开始的,那如果说我们用n表示自乘的话,那这个字号位号i j,转换成对应的盘块号的公式,就可以写成n i加上j,我们来验证一下,字号为0位号为一的这个二进之位,也就是这个二进之位,它所对应的盘块号是多少呢,由于字长是16而字号为0,所以这这个地方乘以0再加上位号,这也就是加上1=1,所以这个二进之位,所对应的盘块号应该是1号块,那另外如果字号为一位号为10的话,那么它所对应的盘块号就应该是16,也就是字长乘以字号一,再加上位号呃j也就是10,最后等于26,所以呃字号为一,位号为10的这个二进之位,对应的是26号此盘块,那大家也可以自己数一下啊,他们俩确实是相对应的,那这是字号和位号,转换成旁块号的一个算法,那如果说要用旁块号推出字号和位号,怎么算呢,字号2等于旁块号b除以字长n,然后取整数部分,然后位号等于旁块号对n取余,所以在这个例子当中,如果说旁块号为13的话,那么它所对应的字号和位,号就分别是0和13,也就是对应的是这个二进之位,那如果说盘块号为31的话,它所对应的就应该是字号为一,位号为15,也就是字号为一位号为15,也就是这个二进之位,所以它和31号块是相对应的,这个大家也可以自己数一下,那这个例子当中,我们给出的是盘块号,字号位号都是从0开始的情况,在咱们王道书上给出的是啊,这几个数据都是从一开始的一个,算法,但是不管是从0开始还是从一开始,大家都需要能够自己推出来,这个并不需要死记硬背,那接下来我们要

image-20230822132740383

考虑的问题是采用卫士图法的话,怎么进行词盘块的分配和回收,在进行分配的时候,如果说某个文件需要k个款,那么系统可以顺序的扫描这些卫士图,然后找到k个相邻或者不相邻的0,因为0代表的是空闲快嘛,另外呢,需要用这些呃0 对应的字号和位号,计算出,他们所对应的盘块号到底是多少,然后把这个盘块分配给文件,并且要把相应的位设置为一,也就设置为已分配的状态,那回收的过程也很简单,就是需要根据回收的盘块号,来计算出他所对应的字号和位号,然后再用字号和位号,找到相应的二进值位,把那个二进值位设为0,因此,从这个分配和回收的过程也可以看到,用字号和位号转换成盘块号,还有用盘块号,转换成他所对应的字号和位号,这个是十分重要的,那如果说采用的是卫士图法的话,在连续分配和离散分配的这种场景下,都适用,假如说呃是要求连续分配的话,那么我们在扫描这个卫士图的时候,就可以尝试找到连续的呃k个快,而如果说,采用的是离散分配的方式的话,那么在找这k个快的时候就不需要呃,一定要找到连续的k个0,那这是卫士图法,需要注意的一系列事情,那接下来我们来看,

image-20230822132811674

最后一种存储空间的管理方法,陈组链接法,咱们之前介绍的空弦表法,还有空弦链表法,是不太适合于大型的文件系统的,因为在大型文件系统当中,空弦表和空弦链表有可能会很长很大,那在Unix系统当中,采用的是陈组链接法,对这个磁盘的空弦块进行呃,分组的管理,在文件卷的目录区当中,会设置一个专门的磁盘块,把它作为所谓的超级快,那这个超级快的作用咱们一会再解释,当系统启动的时候,需要把超级快读入内存,并且在整个过程当中需要,保持,内存和外存当中超级快的数据一致,那接下来我们来看一下,这个超级快到底有什么作用,在超级快当中,记录了下一组空前盘块的数量,比如说下一组,

image-20230822190948785

总共有100个空闲盘块,另外他还需要记录啊,这100个空闲盘块的盘块号分别是多少,那通过这些盘块号,我们就可以依次,找到下一个分组的各个盘块了,所以这是第一个空弦盘块的分组,总共有100个,他们分别是201号磁盘块,一直到300号磁盘块,那这个地方需要注意的一点是,300号磁盘块,它作为这个分组的第一个磁盘块,也就是这个位置对应的磁盘块,在这个块当中,还需要记录,下一组空弦盘块的一些信息,同样的这个地方,100表示的是下一个空闲盘块的分组,总共有100个空闲盘,块那,这些数字就是代表了下一个分组当中,各个盘块的盘块号,所以通过这些盘块号,我们又可以找到再下一个分组的盘块,分别是哪些,那同样与之前类似,在这个分组当中400号盘块,它是这个分组当中的第一个盘块,所以400号盘块,也会在记录再下一个分组的盘块数量,还有各个盘块的这个盘块号,那用这种方式,我们就可以把整个系统当中,所有的空闲盘块给一一连起来了,那在倒数第二个分组的第一个盘块这,我们可以把这个数字,设置成一个特殊的值-1,就代表,再下一个分组已经是最后一个分组了,所以,如果找到这个值为-1的这个节点的话,那么就证明,在之后已经没有更多的分组了,另外大家需要注意的是,其实每一个分组的这些盘块号,并不要求连续,这个地方,我把这些数字设置成连续的原因,是为了让大家更方便的看出,每一个分组到底有多少个盘块,那像这个分组201-300总共100个数,也就对应100个盘块,那这和这个地方记录的啊这一组的,盘块数量刚好是对应的,只是为了让大家方便看出这件事情,另外呢大家需要注意的是,在成组链接法当中,每一个分组的盘块数量有一个上限,像这个例子当中,每个分组最多只有100个盘块,另外一个大家需要注意的是,最后一个分组的盘块数,是要比其他的这些分组要更少的,更少一块,那原因是出在这个地方,那接下来我们要探讨的是怎么,进行此盘块的分配,假设此时某一个文件需要分配,一个空闲块,那首先,是需要检查第一个分组当中的盘块,到底够不够这个文件的需求,那由于此时超级快,已经是读入内存的了,所以我们在进行这个检查的时候,并不需要读磁盘操作,我们只需要,找到内存当中超级快的这些数据,并且检查一下啊,下一组的这个空弦盘块数,是否大于此时要求呃,得到的这个空弦盘块数,那由于一是小于100的,所以说明这个第一个分组啊,当中的这些空闲盘块是足够分配的,那接下来,就会把这个分组当中的,最后的这个盘块,分配给这个文件,也就是201号盘块,那这个盘块分配出去之后,就需要把这个地方的数据删除,并且要把下一个分组的空弦盘块数,把它减一,也就从100变成99,那这样的话,就完成了分配一个空弦块这个事情,那接下来我们,再来看如果说,此时是需要分配100个空弦块的话,怎么办呢,首先第一件事也是检查,第一个分组到底够不够分配,那由于此时第一个分组的数量,总共有100个空弦盘块,因此第一个分组是足够的,因此接下来我们会把,第一个分组的这100个磁盘块,全部分配出去,不过这个地方需要注意的是,300号磁盘块存储了,再下一个分组的这些呃磁盘块的信息,因此如果我们把300号磁盘块,直接分配给那个文件,不做任何处理的话,那,和下一组的这些链接的信息就断掉了,因此在我们把300号,磁盘块正式分配给文件之前,我们需要把,300号磁盘块当中的这些数据,把它复制到这个超级块当中,那这样的话就可以保证,虽然这个分组已经全部,分配给这个文件了,但是下一个分组的这些链接信息,我们依然是保存在超级快当中的,那如果说,文件要求的是更多数量的空闲,快的话,那么我们依然是可以用同样的方式,把这些分组,一个一个一个的全部分配出去,不过需要注意的就是,每个分组真实分配出去之前,需要把,这个分组指向下一个分组的那些链接,信息都先复制到超级快当中,所以,超级快其实就充当了一个链头的作用,在这个链头当中,永远要保持指向下一个,分组的一些信息,那接下来我们再来看一下

image-20230822191022967

image-20230822191305186

image-20230822191317659

怎么回收一个空弦块,假设每个分组的磁盘块上限是100块,而第一个分组此时只有99块,那么假如此时还要再,回收一个空弦块的话,那由于此时第一个分组还没满,所以我们可以把这个空弦块把它,插到第一个分组当中,比如说我们回收的是201号块,那么我们可以把201号块的,这个链接信息,把它放到超级快当中,并且把超级快当中的这个,下一组的空弦盘块数从99+1变成100,那这是第一种情况,如果分组没满的话,那么可以把这个,回收的空弦块插到一个分组当中,那再看第二种情况,假设此时第一个分组已经满了,总共有100个块,那如果此时还要再回收一个空,闲块的话,应该怎么处理呢,那由于这个分组已经满了,显然这个空闲块不能把它,放到这个分组当中,所以我们可以把这个新回收的空勤快,作为一个新的分组,不过需要注意的是,我们需要把这个超级快当中的内容,复制到这个新回收的快当中,这样的话,这个新回收的快它作为一个新的分组,它就拥有了指向下一个分组的这些,链接的指针,而由于我们的超级快,永远是要指向第一个分组的,所以超级快的数据就需要进行修改,让他指向第一个分组,也就是新的这个回收快,组成的这个新分组,那由于这个新分组当中,此时只有一个空线快,所以这个地方的数据是一,然后指向他的快号也就是3把,那这是回收的时候遇到的第二种情况,好的这个小节当中,

image-20230822191405070

image-20230822191421982

我们介绍了文件,存储空间管理相关的知识点,刚开始我们介绍了文件卷目录区,文件区的概念,这些概念大家需要结合我们的呃,生活经验,什么c盘d盘,e盘那些进行理解和记忆,另外大家需要注意的是,一个文件卷当中,目录区中会包含呃文件目录,还有像空闲表啊卫士图啊,超级快啊这些,用于文件管理相关的这些数据,而文件区,就是用于存放普通的文件数据的,那之后我们介绍了4种呃,存储空间管理的方法,空闲表法,有可能结合首次适应最佳适应最,坏适应等等这些算法来进行考察,那这个大家还需要回顾,咱们在内存管理那个章节当中,学习过的,这些算法的策略,那在空弦表法当中我们需要注意,在回收的时候,是不是应该对表象进行合并呢,那接下来我们又介绍了空弦链表法,它分要进一步可以细分为空弦盘块链,和空弦盘区链,空弦盘块链是以盘块为单位,组成一个空弦链,而盘区链是以盘区为单位,组成一个空弦链,要注意它们俩的区别,那第三种卫士图法,这是咱们在考试当中最常考察的一个,一个考点,大家要能够自己推出盘块号,还有字号位号之间的这种,转换的公式,另外呢在做题的时候需要注意,二进制0和1,到底哪一个是代表盘块空闲,哪一个是代表不空闲,还需要注意字号位号,盘块号到底是从0开始的,还是从一开始的,那最后我们介绍了成组链接法啊,这是Unix系统采用的一种策略,适合于大型文件系统,乘左链接法的规则比较复杂,并且不太方便用文字进行描述,所以这个知识点也,很难作为考题进行考察,不过,只要理解了刚才咱们分析的那些过程,那即使考到了其实也没有关系,肯定是可以做出来的,好的,那么以上就是这个小节的全部内容

image-20230822191450913

No.7 文件的基本操作

各位同学大家好,在这个小集中,我们会学习文件的几种基本操作,包括创建文件删除,文件读文件写文件,打开文件和关闭文件,这些操作,在背后到底做了一些什么事情,那么其他的一些复杂的操作,也可以由这些基本操作来组合的完成,但是在考试当中,最经常考的还是这几种,首先我们来看一下创建文件的首选

在这里插入图片描述

要做一些什么事情,在我们平时自己使用电脑的时候,大家应该做过这样的操作,就是在某一个文件夹下,然后新建一个文本文档,也就是TXT那种文档,那么在我们点了这个新建之后,其实他在背后做的事情是,调用了操作系统的create,系统调用,那么我们在进行create系统调用的时候,需要提供几个参数,是要说明我们此时新建的这个文件,到底需要占用多大的外存空间,那比如说一个旁块是1KB,然后这次我们,申请的就刚好是一个旁块1KB,这么大小的空间,第二个我们需要说明的是,我们新建的这个文件,它存放的路径是什么地方,那我们在这个例子当中,它存放路径就是d旁的,demo这个目录下,第三我们还需要说明这个文件的,文件名到底是什么,在问到操作系统当中,我们点击右键,新建一个文本文档的时候,他在背后,会帮我们自动的填写这些参数,然后文件名是默认填写为,新建文本文档,点TXT然后大家也可以动手,去自己的电脑上试一下,那操作系统,在接收到我们的系统标准请求的时候,他在背后,需要主要做这样的两件事情,需要在外存当中,找到这个文件所申请的这么一些,词盘块词盘空间,那这个地方,可以结合上个小节,我们学习的空闲练表法,为图法空闲表法,陈组连接法等等这一系列的管理策略,来思考一下,为文件分配存储空间,到底是什么样一个流程,当然根据不同的这种存储空,间管理策略的不同,在分配存储空间的时候,所需要做的事情算法也是不一样的,这个是上个小节介绍的内容,那是系统需要做的第一个事情,第二个事情,那既然我们这个文件,它是放在某一个文件夹一个目录下的,那这样的话,我们肯定是需要找到,这个目录对应的目录表,然后在这个目录当中,插入这个文件对应的目录像,那目录像中需要包含文件名,还有文件的存放位置,等等一系列的信息,这是咱们在文件目录那个小节当中,介绍的内容,那这是创建文件的时候,需要做的两个事情,那删除文件的话

image-20230822193128097

和创建文件刚好是相反的,当我们点右键删除这个文件的时候,其实它在背后是帮我们调用了,操作系统提供的delete系统调用,那在进行DELETE系统调用的时候,需要提供的几个参数是,第一文件的存放路径,这个文件存放在地盘的demo,这个目录下,第二需要提供文件名test点txt,那操作系统在,接收到这个系统调用请求的时候,会根据存放路径这,个参数,来找到demo这个目录对应的目录表,那接下来可以根据这个文件名,找到目录表当中对应的目录像,那既然找到了目录像,我们就可以知道这个文件,在外存当中是存放在什么位置,他占用了多少次方块这些信息,那于是根据目录像当中,啊记录的这些信息,操作系统就可以回收,文件占用的这些磁盘块了,那在回收这些磁盘块的时候啊,又根据空闲表法,空闲电表法等等这些,成熟空间管理的策略不同,也需要做不同的处理,这也是咱们上个小节介绍过的内容,第三,当文件占用的字盘块全部被回收之后,需要把文件,在目录表当中对应的目录像也给删除,那这是删除文件的时候,需要做的一些事情,接下来我们来介绍

image-20230822193238098

大家可能不太熟悉的,操作叫做打开文件,在很多操作系统当中,对文件进行操作之前,都是要求先使用open,系统调用来打开文件的,那么在打开文件的时候,需要提供这样的几个参数,第一,我们要指明我们要打开的那个文件,存放路径是什么地方,文件名是什么,第三我们还需要指明,我们打开这个文件之后,会对文件进行哪些操作,比如说,我们对这个文件只是想进行读操作,或者我们对文件既有可能读,也有可能写,那么,根据我们想要进行的操作类型的不同,也需要提供不同的参数,操作系统在处理open系统内容的时候,主要做了这样的两件事情,第一会根据我们提供的文件存放路径,在,外存当中找到这个目录对应的目录表,那在这个地方,就是demo目录对应的目录表,另外呢不同的用户,对文件的操作权限是不一样的,有的用户可能只可以读这个文件,而有的用户既可以读文件,也可以写文件,而这些用户对文件的这些呃,访问权限的信息,其实也是记录在这个目录像当中的,所以可以根据这个目录像来检查,此时用户请求的这个操作,到底是否合法,如果说用户没有这种操作的权限的话,那就可以拒绝用户打开这个文件,就终止处理,而如果用户是有这种操作权限的话,那么接下来操作系统会把,这个文件对应的目录像,复制到内存当中的打开文件表当中,也就是说在用户打开了一个文件之后,这个文件相关的那些信息,就已经放到内存当中了,那之后用户想要在操作这个文件,只需要根据,这个打开文件表的这个编号,就可以找到,自己想要操作的这个文件的一切信息,这样的话,就不需要每次查文件的时候都,重新访问目录了,因此,把目录像复制到打开文件表当中,是可以大幅度的提升文件访问的,速度的那这是打开文件的时候,需要做的一些事情,另外呢大家需要注意

image-20230822193425403

记得是有两种打开文件表,一种是系统的打开文件表啊,整个系统只有一张,然后这个打开文,件表当中会记录啊所有的,正在被其他进程,使用的文件的一些信息,另外每个进程,也会有一个自己的打开文件表,这张表当中记录了啊自己的这个进程,此时已经打开的文件到底是哪一些,那在进程的打开文件表当中,会有一个系统表的这个锁引号,比如说test点txt这个文件,在系统表当中是编号是k这个表象,那么这个地方的k,就是指向了这个表象,那同样的,如果另一个进程b,也打开了test点txt这个文件,那它同样也会,指向这个系统的打开文件表,那这个地方大家需要注意的是,在系统的打开文件表当中,有一个字段叫做打开计数器,就是用来记录这个文件,此时已经被几个进程打开了,那此时如果有两个进程打开了这个,文件的话,那这个打开计数器就应该修改为2,这样的数值,所以像打开计数器这个字段,是啊,系统的打开文件表当中,所特有的一个字段,那其实在整个系统当中,设置一个打开文件表的总表,这样的方式是比较方便实现某一些,文件管理功能的,比如说,我们在使用Windows操作系统的时候,如果我们要尝试删除某一个TXT文件,那此时如果这个TXD文件,已经被某个记事本进程打开了,那么系统是会提示我们,暂时无法删除该文件,这个大家可以自己动手试一下,那其实系统在背后做的事情就是,当我们选择删除文件的时候,他首先来检,查了一下这个文件,是否已经被某个进程打开了,也就是查询了系统当中的打开文件表,那如果此时这个文件,正在被某个进程使用的话,那这个文件的数据,显然是暂时不能删除的,所以如果我们在系统当中,设置了一个这样的总表的话,那么对于一些文件管理的功能,是很方便实现的,另外在进程的这个打开文件表当中,大家会发现有两个比较特殊的字段,一是叫读写指针,它其实就是记录了这个进程,对文件进行读写操作啊,此时进行到了什么位置,第二在进程的打开文件表当中,还需要标明这个进程,对文件的访问权限,比如说进程a,在打开test点txt这个文件的时候,只是声明了自己是呃,只会对test点txt这个文件进行指,读的操作,那么如果这个进程在之后,尝试对这个文件进行写操作,那系统会检查,他之前申请的这种访问的类型,由于之前他只声明了自己是指读,所以这个写操作应该是被拒绝的,是认为是不合法的,所以在进程的打开文件表当中,比较特殊的是读写指针和访问权限,这两个字段,不同的进程对一个文件进行读写操作,进行到的位置是不一样的,所以不同的进程的读写指针,也是应该不一样,另外,不同的进程在打开一个文件的时候,所申请的这种访问类型也是不一样的,因此访问权限这个字段,也应该放在进程的打开文件表当中,当然除了这个地方列,出的这些字段之外啊,在进程的打开文件表当中,还会有其他的一些文件的信息,这就没有全部列举,那接下来

image-20230822193712006

我们来看一下,当一个用户使用完一个文件,选择关闭文件的时候,他在背后需要做一些什么事情,第一,当这个进程选择关闭一个文件的时候,那么我们可以把这个,进程的打开文件表当中,这个文件对应的表象先给删除,那相应的,需要回收分配给这个文件的内存,缓冲区等等一系列的资源,另外,我们需要对系统打开文件表当中的,这个表象,打开计数器进行一个简易的操作,那由于此时啊,这个打开计数器依然是大于0的,所以说明此时这个文件,还在被其中的某一些进程所使用,因此,系统打开文件表当中的这个表象,暂时不能删除,只有打开计数器为0的时候,才需要删除,系统打开文件表当中的这个表象,那这是关闭文件的时候,需要做的一些事情

image-20230822193806242

我们来看一下读文件,也就是read系统调用,在背后做了一些什么事情,其实在我们双击打开,test点TXT这个文本文本文档的时候,在背后其实是调用了操作系统提供的,read系统调用,也就是读文件的功能,不过通过之前的讲解我们知道,在对文件进行读写操作之前,一定要先打开文件,所以其实在正式开始读文件的时候,记事本这个进程的打,开文件表当中,已经有了这个文件对应的一个表象了,因此记事本这个进程在读文件的时候,只需要指明自己要读的这个文件,他对应的,打开文件表的编号到底是多少,就可以了,那这是读文件的时候,需要提供的第一个参数,就是要指明到底要读的是哪一个文件,第二在读文件的时候还需要指明,此时需要读入的是多少个数据,比如说此时是要把这个文件,全部1KB的内容都读入内存,那么就需要指明此时需要读入的是1KB,这么多另外,还需要指明,这个读入的数据,到底是要放在内存当中的什么位置,那这些参数的填充,都是记事本这个进程,在背后为我们完成的事情,那操作系统在处理这个read,系统标准的时候,会根据啊打开文件表当中读写指针,这个读指针所指向的呃,外存地址那个地方,读入,用户指定的啊大小的这么多的数据,然后放到,用户指定的那个内存区域当中,就是读文件需要做的事情,而写文件的操作其实和

image-20230822193935199

读文件是很类似的,在我们编辑完一个文本文档之后,我们可以点击文件保存这样一个功能,那点击保存之后,其实记事本这个应用程序,在背后是帮我们调用了,操作系统提供的写文件功能,也就是write系统调用,这个系统调养的作用,就是把这个文件在内存当中的数据,再写回到外存,保存到外存当中,所以在进行write系统调养的时候,我们也需要提供啊这样的几个参数,第一是需要指明,我们要呃写的到底是哪个文件,那同样的,这个进程只需要指明,这个文件,在打开文件表当中的序号到底是多少,啊操作系统就知道,我们要写的是哪个文件了,另外还需要指明啊,这个写操作需要写回的,数据到底是多少,比如说要把,这个内存当中的EKB全部写回外存,那么我们指明要写回的是EKB,另外我们还需要指明,我们要写回外存的这些数据,是放在内存当中的什么位置的,那操作系统根据write,系统调用的这些参数,会从用户指定的这个内存区域当中,读出指定大小的那些数据,然后写回,这个写指针所指向的外存区域当中,所以这是写文件要做的事情,它和读文件很类似,好的那么这个

image-20230822194127770

小杰我们介绍了文件的几种基本操作,包括创建文件,删除文件,打开文件关闭文件读文件和写文件,那我们最需要注意的是,打开文件这个操作,这个操作会把目录像的信息,复制到内存当中的打开文件表当中,另外大家需要知道,内存中有两种打开文件表,一种是系统的打开文件表,另外一种是进程的打开文件表,系统的打开文件表当中,包含了所有的正在被使用的文件信息,而进程的打开文件表当中,只包,含了这个进程本身打开了的那些文,件信息,那需要注意的是在打开文件的时候,并不会把文件的数据直接读入内存,只是把文件的目录像,给复制到了内存的打开文件表当中,那这点也是很容易混淆的一个点,另外呢,系统会把打开文件表当中的锁引号,返回给用户,那之后用户就可以根据这个锁引号,来查询打开文件表,然后直接操作自己的文件,而不再需要每一次都查询目录,这个地方的所引号啊,在有的教材上也称为文件描述符,那,这个概念在咱们的考试当中也出现过,所以文件描述符这个术语,大家也需要注意一下,它指的其实就是打开文件表的一个,序号另外呢大家需要注意的是,在进程的打开文件表,和系统的打开文件表当中啊,都会有一些各自特有的属性,比如说每个进程都不一样的读写指针,还有访问权限,这些肯定是需要,放在进程的打开文件表当中,而一个文件总共被多少个进程打开了,这个数据肯定是需要放在,系统的打开文件表当中,那比较容易和打开文件,混淆的是读文件这个操作,只有读文件的时候,才会把文件的数据,真正的从外存读入内存,而对文件进行读写操作的时候,呃用户不需要再提供文件名,文件路径这些信息,只需要提供文件描述符,也就是这个文件,在打开文件表当中的所引号,操作系统就可以知道我们要读,要写的到底是哪个文件了,那打开文件和读文件这两个操作,是最容易在选择题当中进行考察的,大家需要重点关注好了,那么以上就是这个小节的全部内容

在这里插入图片描述

No.8 文件共享

各位同学大家好,在这个小节中,我们会学习操作系统应该怎么实现,文件共享的功能,那用户可以,使用操作系统提供的文件共享功能,然后方便的实现,多个用户,共享的使用同一个文件这样的事情,那文件共享的实现方式有这样的两种,一种是基于索引节点的共享方式,又叫硬链接的方式,另一种是基于符号链的共享方式,又叫软链接的共享方式,这个地方大家需要注意,多个用户共享同一个文件,意味着系统当中其实只有一份,文件数据,并且只要某一个用户,修改了这个文件数据,那其他用户,也可以看到文件数据的变化,而与共享比较容易混淆的,是复制的概念,如果是多个用户,都复制了同一个文件的话,那么系统当中其实是有好几份文件,数据,其中一个用户修改了自己的那一份,文件数据,其他用户,的文件数据其实并不会受到影响,所以这是复制和共享的一个区别,那接下来我们来介绍,实现共享的第一种方式,也就是基于所有节点的共享方式应
在这里插入图片描述

连接的方式,啊锁影节点的知识,咱们是在之前,啊文件目录的小节当中进行介绍的,它其实就是一种文件目录的瘦身策略,由于我们在根据路径检索文件的时候,只需要使用文,件名所以,我们可以把除了文件名,之外的其他信息,都放到锁影节点当中,这样的话目录像就可以变得更小,它只需要包含文件名,还有指向,啊锁影节点的一个指针就可以了,那采用锁引节点的这种策略,能够带来什么好处呢,大家还能不能回忆起来呢,假设此时有一个用户user一,他创建了一个新的文件叫做AAA,那么这个文件会对应一个锁引节点,并且这个锁引节点当中,会包含这个文件的呃,物理地址啊,还有这个文件相关的其他的一些属性,也是包含在锁引节点当中的,另外锁引节点当中还会,设置一个叫做链接技术的变量,就是这个地方的count,用于表示,此时,链接到这个锁引节点上的用户目录像,到底有多少个,什么意思呢,假设此时有第二个用户,他想共享的使用这个文件,那么这个用户的目录当中,也会有一个目录像,是指向这个文件的锁引节点的,那由于此时,有两个目录像是指向这个缩影节点的,所以这个count的值应该加一,也就是变成2,count等于2,也就说明此时有两个用户,正在共享的使用这个文件,那这就是基于锁引节点的共享方式,就是要让不同用户的目录像,指向同一个文件的锁引节点,并且在这个地方大家会发现,不同的用户对于这个文件,起的名字其实是可以不同的,在用户一的目录下这个文件名叫a a,而用户2的目录下这个文件名叫BBB那,如果说藏的是这种共享方式的话,在删除文件的时候,需要注意一些小细节,如果一个用户决定删除这个文件,那么其实系统在背后做的,只是删除了这个用户对应的,这个文件的目录像,然后把这个链接给断掉,那相应的锁应节点的count值也需要减1,不过由于此时count的值是大于0的,说明此时还有别的用户,正在使用这个文件,因此并不可以,直接把这个文件的数据给干掉,那除非这个count值变为了0的时候,这个文件还有它的锁影节点,这些数据,才可以真正的从系统当中删除,所以这是硬链接的共享方式当中,在删除文件的时候,需要注意的一个细节那这,

image-20230822194505719

下我们来看第二种,基于符号链的种共享方式,又叫软链接的共享方式,那我们还是接着刚才的例子,继续往下分析,假设此时系统中有两个用户,user一和user 2,正在使用硬链接的方式在共享的,使用文件1,另一个用户user 3,想要使用软链接的方式来共享,啊这个文件一,那么user 3会建立一个新的文件,这个文件是一种特殊的link型的文件,这个文件当中,记录了文件一的存放路径,比如说我们可以通过c盘,然后user一,然后AAA这样的路径找到文件1,当然,这个地方的存放路径也可以保存为,c盘下面的user 2这个目录,然后在下面的BBB这个文件,用这样的路径也是可以找到文件一的,那其实这种link类型的文件,就有点类似于Windows,操作系统当中的快捷方式,那user 3想要访问CCC这个文件的时候,操作系统首先是判断CCC,它属于link类型的文件,于是会根据这个文件,当中记录的这个路径的信息,一层一层的来查找目录,然后最终找到AAA这个目录像,于是就可以开始访问文件一了,因此,如果采用的是软链接的共享方式的话,那并不是把呃自己的目录像,直接指向这个文件的锁印节点,而是创建了一个新的link型的文件,然后link型的文件当中,记录了这个文件的存放路径,之后操作系统会根据这个路径,来找到想要共享的那个文件,那我们来看一下Windows操作系统当中,快捷方式的例子

image-20230822194540970

比如说我的QQ程序是安装在,这样的一个路径下的,然后在这个路径下有个QQ的启动程序,点exe的一个文件,那我们可以右键点击这个点exe文件,然后发送到桌面快捷方式,于是在桌面当中,就会出现一个这样的快捷方式,并且我们可以给这个快捷方式,随便取一个呃名字,那之后大家可以单击右键,然后查看一下这个啊快捷方式的属性,那大家就会发现,这个快捷方式其实就是用软链接,也就是用一个路径的方式,把它链接到了啊,QQ的那个启动程序那个地,方那当我们双击,桌面上的这个快捷方式的时候,其实操作系统会判断,会根据,这个文件当中记录的这个路径信息,来一层一层的往下解锁目录,最终找到QQ,解锁目录最终找到QQ的这个启动程序,那大家在休息的时候,可以自己捯饬一下Windows操作系统,系统快捷方式的这个属性这些东西,然后通过这个你就可以,理解软链接到底是怎么回事了,那接下来我们再分析一下,如果采用软链接

在这里插入图片描述

image-20230822194927994

方式共享文件的话,删除一个文件,会不会对软链接进行造成什么影响呢,假设此时user,一和user 2都不再需要使用文件一,那由于此时这个count值变为了0,因此这个文件还有它的锁影节点,就可以直接被干掉了,那此时如果user 3,访问CCC这个link型的文件,那同样的,操作系统,首先会检查c盘下面的user这个目录,然后尝试从中找到AAA,这个文件对应的文目录像,但是由于此时AAA,这个目录像已经被删除了,所以通过这个路径,其实已经找不到文件一了,因此这个软链接就失效了,那我们还是结合Windows操作系统为例,我们把这个呃路径下的,QQ的那个启动程序,把它给删除,那此时如果我们双击打开,桌面上的那个快捷方式的话,操作系统就会提示我们,此快捷方式所指向的项目,QQ SC launcher点exe已经删除,也就是说,通过这个软链接当中记录的路径,已经找不到这个文件了,这个文件已经被删除了,因为这个文件名,对应的目录像已经没了,好的,那么这就是硬链接和软链接这两种,文件共享方式,

image-20230822195034708

在这里插入图片描述

那大家需要重点理解的是,硬链接这种共享方式,在删除文件的时候,需要注意的一些事情,只有Ctrl值变为0的时候,才可以真正删除文件的数据,还有文件的锁影接电,否则会导致指针悬空的情况,而软链接,或者叫呃符号链接的这种共享方式,大家只需要自己,回去玩一下自己的Windows操作系统的,快捷方式,其实就可以理解了,它无非就是在另行文件当中,记录了我们要共享的那个文件,存放的路径到底是什么,然后操作系统会根据这个路径,一层一层的查找目录,最终就可以找到需要共享的文件,不过需要注意的是,如果转链接所指,向的那个共享文件已经被删除的话,那么这个另型的文件,其实依然是存在的,只不过,通过这个文件当中记录的路径,再去查找那个共享文件的时候,就会发生查找失败的情况,因为此时已经找不到,那个共享文件所对应的目录像了,另外由于软链接这种方式,每一次在访问共享文件的时候,都需要一层一层的去查询目录,那通过之前的讲解大家也知道,在,一层一层的查询目录的这个过程当中,其实是需要磁盘的l操作的,因此通过软链接的方式,去访问一个共享文件的速度,会比硬链接要更慢,好的,那么以上就是这个学习的全部内容

image-20230822195323478

No.9 文件保护

各位同学大家好,在这个小节中,我们会学习文件保护相关的知识点,那操作系统需要保护文件数据的安全,那一般来说可以采用这样的3种方法,口令保护加密保护和访问控制,那我们会按从上至下的顺序,依次来学习,首先来看一下什么是口令保护比如

image-20230822195443472

说一个用户,为自己的文件设置了一个口令,这个口令是a b c一一二二三三,那,其他的用户想要访问这个文件的时候,就必须提供这个相同的口令,操作系统会负责验证,这个用户提供的口令是否正确,一般来说,这个正确的口令是存放在,与文件相对应的FCB,或者缩印节点当中的,所以操作系统会从,FCB当中读出正确的口令,并且和用户提供的这个口令进行对比,如果这个口令正确,那么就允许这个用户访问文件,所以这种文件保护方式的优点就是,开销小首先是保存这个口令,带来的空间花销是很小的,也就是保存这样一个自付串,另外,当一个用户想要访问一个文件的时候,那操作系统无论如何,肯定是要找到这个文件对应的FCB和,或者缩印节点的,那从FCB或者缩印节点当中,取出这个口令并且进行对比,其实是不需要花太多的时间的,因此验证口令的时间开销也会比较小,但这种方式的缺点就在于,我们这个正确的口令,它是存放在系统内部的,所以如果有人入侵系统,并且知道了正确的口令的话,那么这个人,就可以畅通无阻的访问这个文件了,所以口令存放在系统内部是不安全的,那第二种方式叫做加密保护,就是使用某个

image-20230822195500423

密码对文件进行加密,然后在访问文件的时候,呃用户需要提供正确的密码,才能把这个文件进行正确的解密,我们来举个例子,呃看一个最简单的加密算法亦或加密,如果祭祖的话,大家对易货运算应该是很熟悉的,那假设我们用瑜伽密,解密的密码是01001,这么一呃这么一串二进之位,那文件的原始数据是这样的,那我们可以用这个密码,和文件的这些原始数据,依次的做易货运算,那如果两个相同的二进之位,进行易货运算的话,呃他得到的结果应该是0,如果两个二进之位是不同的话,那么他们进行易货运算,得到的结果应该是1,可以对这些二进之位,依次进行易或运算,那么我们可以得到,用这个密码加密的结果,就是01100,然后接下来再对接下来的,啊这五个二进之位再进行加密,以此类推,这样的话,我们就可以把整个文件的数据,都进行加密,所以其实系统当中保存的并不是文,件的原始数据,而是保存了,对文件进行加密之后的这一份数据,所以,如果一个用户想要访问这个文件的话,那么必须对这个文件进行解密才行,不然的话,读出来其实就是一串没有意义的乱码,那解密的过程,其实也是用这一串密码,对这些二进之位进行,异货运算,那同样的两个相同的二进制位,进行异货啊,得到结果是0啊,这两个二进制位也相同,所以异货之后是0,这两个二进制位不同,所以异货之后是一,这两个相同所以异货后是0,这两个不同所以异货之后是一,那剩下的这些二进之位,也可以用相同的这种异或的算法,把它们都进行依次的解密,那这个地方大家会发现,如果在加密的时候,使用的密码,和解密的时候使用的密码是一致的话,那么加密和解密之后,这个文件的数据其实是完全一样的,大家可以自己动手啊尝试一下,并且对比一下文件的原始数据,还有解密之后的这个结果是否一致,总之如果用户能够提供,相同的正确的密码的话,那么是可以把这个加密的文件,给它解密成原有的那种,数据形式的,但如果用户,使用一个错误的密码进行解密的话,会发生什么情况呢,我们来看一下,假设用户用01111这样的,错误的一个密码来进行解密的话,那么,最终解密出来的结果是这个样子的,那大家可以对比一下,它和文件的原始数据是不一样的,因此如果一个用户不知道这个文件,的加密解密密码的话,那么它是没办法正常的访问,这个文件数据的,所以加密保护这种方式的优点就是保,密性强,并且不需要在系统当中存储密码,用户只需要自己记住啊,自己的密码是多少就可以了,那如果说他想要别的用户,也可以访问自己的这个文件的话,那他只需要,把自己的密码告诉别的用户就可以,不过这种方式的缺点也很很明显,就是在进行加密和解密,或者说,进行编码和译码的这个过程当中,需要花费一定的时间,那就是加密保护第三种

image-20230822195525757

image-20230822195630011

实现文件保护的方式叫做访问控制,系统会在每个文件的FCB,或者锁影节点当中,增加一个访问控制表,在这个访问控制表当中,记录了各个用户,可以对这个文件进行哪些操作,那需要注意的是呃,每一个文件都会有一张自己的,访问控制表,那用户对文件执行的操作,可以分为这样的一些类型,读写执行添加删除列表清单啊等等,那不同的系统,对这种操作的类型的划分不一样,这个地方不是很重要,大家自己看一下就可以了,比如说有一个系统当中,他所需要控制的操作类型就是这几种,并且这个系统当中有三个用户,一个是父亲一个是母亲一个是儿子,那么一个文件的访问控制表,可能就是长这个样子的,呃这个地方的一表示呃允许,0表示拒绝,所以,父亲这个用户可以对这个文件进行读,写执行添加删除,列表清单等等这一系列的操作,那母亲这个用户,只可只可以对这个文件进行读,执行还有列表清单这几种操作,而不能对文件进行写添加删除,而儿子这个用户,对文件的访问权限就是,不可以读,不可以写,什么都不能干,所以在这个系统当中的某个用户,在请求访问某个文件的时候,那操作系统就可以查看一下,这个文件的访问控制表,检查一下,这个用户,是否拥有对文件进行某种操作的权限,如果他没有这个权限的话,那就可以拒绝访问,所以可以用这种方式就保证,文件的安全性,那在这个例子当中,我们是以每个用户为单位,来标识每个用户,对某一个文件的这种读,写各种操作的权限,但是如果说一个计算,机当中有很多个用户的话,那么就有可能会导致这个访问,控制表的,长度很长,会很大那这个问题可以用,精简的访问控制表来解决,所谓精简的访问控制表

image-20230822195649069

其实就是要以组为单位,来标记,各组的用户可以对文件执行哪些操作,比如说,我们可以把一个计算机的用户,分为这样的几个,分组第一组叫做系统管理员,第二组叫做文件组,第三组叫做文件组的伙伴,第四组叫做其他用户,那么每个用户都会,从属于其中的一个或者两个分组,那当一个用户,想要访问这个文件的时候,系统就会检查,他所属的那个分组,是否拥有相应的访问权,限所以其实操作系统也需要,管理这些用户分组的信息,他需要记录哪个用户是属于哪个分组,那精简的访问列表,就可以表示成这个样子,总共有这样的4个分组,每个分组的用户,对于一个文件的这些,呃这操作的权限是不一样的,那么在这个地方同样是一表示允许,0表示拒绝,那可以看到,如果说一个用户,是属于其他用户这个分组的话,那么他既不可以读这个文件,也不可以写这个文件,那如果说这个文件组,想要给某个用户也拥有读的权限的话,那么就可以由文件组把这个用户放到,文件组的伙伴这个分组当中,那这样的话,这个,用户就可以对文件进行读的操作了,那接下来,我们来看一下Windows操作系统,它是怎么实现访问控制的

在这里插入图片描述

首先我们可以给自己的Windows电脑,添加呃一个新的,本本地账户,像win 10例,就可以在设置当中找到,呃添加一个账户的这个选项,自己动手尝试一下,依次选择红框的这些部分,然后它会跳出一个让我们建立,新的账户的一个页面,那因为我们要创建的是本地账户,所以我们点这个地方,就红框的这个部分,于是会弹出一个这样的界面,我们可以呃,输入,我们想要设置的那个新账户的账户名,比如说这个账户叫做临时访客,然后点下一步确认,于是我们就可以在家庭和其他成员,这个地方,看到临时访客这个本地账,户了那如果说我们想要切换到,临时访客这个,本地用户的话,那么我们只需要菜单然后点这个地方,点临时访客就可以切换到这个用户了,接下来我们可以随便打开一个,呃自己的电脑当中的文件或者文件夹,点右键然后选择属性,在安全的这个夜间里,大家会发现,这个地方就可以看见Windows对各种,用户的分组,还有各个用户,实行呃访问控制的一个界面了,那像我的电脑当中,他默认是分为了这样的4个分组,像users这个分组当中的用户,只可以对照片这个文件夹,这个目录进行啊这样的三种操作,那其他的像,写入这种操作就是不允许的,还记得刚才我们创建了一个叫做,临时访客的用户吗,如果我们不想让临时访客那个用户,访问我们的照片这个文件夹的话,那么我们可以点这个编辑这个按钮,于是会挑出一个这样的页面,然后我们再点添加输入临时访客,然后再点确定,于是在这个地方,就会出现临时访客这个用户,相关的选项,接下来我们可以选择,拒绝临时访客这个用户,对照片这个文件夹进行,任何一种类型的操作,那点确定之后,大家会发现,系统给出了一个这样的提示,拒绝项优先于允许项,也就是说,临时访客这个用户,本来它是属于users这个分组的,users这个分组,本来是允许读取文件信息的,但是我们又在临时访客这选择了,拒绝读取这个文件,那由于拒绝项的优先级高,于允许项,所以,虽然临时访客也属于users这个分组,但是操作系统依然会认为,临时访客这个用户,是不允许读取这个文件这个目录的,那接下来我们在这个地方,切换成临时访客这个用户,然后尝试着打开呃照片这个文件夹,于是这个地方大家会发现,操作系统提示我们,此时这个用户无权访问该文件夹,那其实系统在背后做的事情,就是找到了照片这个,目录文件对应的FCB,然后根据FCB当中记录的,访问权限相关的一些信息,来判断临时访客这个用户,到底有没有权限访问这个文件夹,最后发现这个用户是没有权限访问的,于是就弹出了一个这样的提示框,好的那么这个小节,我们学习了3种文件保护的方式

image-20230822195710093

保护加密保护和访问控制,那口令,保护和加密保护是比较容易混淆的,口令保护的,这个口令是存放在系统当中的,然后系统会,验证用户提供的口令是否正确,如果正确的话,才允许用户访问这个文件,而加密保护,其实这个密码不需要保存在系统当中,只有用户自己知道,那另一个用户想要访问一个加密的文,件的话那他需要使用,相同的密码,才可以对文件进行正确的解密,所以加密保护的安全性,要比口令保护要更高一些,但是他所带来的加密解密的开销,又需要花费一定的时间,最后我们介绍了访问控制这种,文件保护方式,绝大多数的现代操作系统,都支持访问控制这种方式来保护,啊文件那大家也可以自己动手去,问到操作系统下面,去看一下各个文件的安全属性,然后啊再动手捯饬一下,就可以对这个部分的内容,有更深的理解,那像口令保护和加密保护,这两种方式的话,只要用户知道了口令或者知道了密码,那用户就可以对这个文件,执行所有类型的操作,但是对于访问控制这种方式来说,它可以实现更复杂的文件保护功能,它可以把,用户对文件的操作,分为各种不同的类型,然后,不同的用户可以执行不同类型的操作,所以,访问控制这种方式实现的文件保护,其实也是要更灵活一些,那再一个大家需要注意的是,如果对某个目录,进行了访问权限的控制,那么,也需要对这个目录下面的所有文件,进行相同的访问权限控制,就像刚才咱们,举到的那个照片文件夹的例子一样,一个用户不允许访问照片,那个文件夹那个目录,那他同时,也不允许访问,这个目录下的所有的文件,好的,那么以上就是这个小节的全部内容

image-20230822195753115

No.10 文件系统的层次结构

No.11 文件系统的全局结构(布局)

好这个视频中,我们一起来看第4章的信号点,文件系统的全局结构,我们从一个词盘出厂,物理格式化,再到逻辑格式化,来一步一步的认识,文件系统在外存当中是如何一步,一步被建立的首先,一个词盘刚被生产出来的时候,它里边没有划分善区,那第一步要做的事情就是低级格式化,又叫物理格式化,物理格式化,会把磁盘分为一个一个的山区,同时在物理格式化的时候,也会检测,这个磁盘当中有没有坏山区存在,如果有坏山区存在,那么就会使用一些备用山区,来顶替坏山区,那坏山区的存在,对于操作系统来说也是透明的,假设现在操作系统要访问这个坏山区,它的编号为n,那么磁盘驱动器在物理格式化之后,他知道这是一个坏善区,那操作系统,他想要访问n号善区的时候,他就会用一个备用善区,一个好的善区来替代坏善区,在背后,悄悄的完成这个替代的一个工作,因此我们说,坏扇区对于操作系统来说也是透明的,他意识不到坏扇区的存在,那物理格式化做的就是划分扇区,并且检测出坏扇区,同时用一些备用扇区来替换坏扇区,好这是物理格式化做的事情,物理格式化完了之后,接下来应该逻辑格式化对吧,又叫高级格

image-20230822200651038

格式化那逻辑格式化,会把词盘分为一个一个的分区,又叫一个一个的卷,比如大家最熟悉的c盘d盘e盘,这就是3个不同的分区,我们的一个词盘被分为多个分区,那每一个分区的大小是多少,它是从哪个地址到哪个地址,它的一个地址范围是多少,这个就需要用分区表,来记录那在每一个分区当中,可以建立各自独立的文件系统,比如说我们在c这个分区里面,可以建立一个Unix的文件系统,那Unix的文件系统,它在内部的一个呃结构就是这个样子,这有一个引导快,然后一个超级快,超级快我们在课程的呃,磁盘空闲分区管理那个部分学过,有了超级快,就可以迅速的找到,这个磁盘分区里边所有的空闲快,这样的话当我们要新建一个文件,给一个文件分配磁盘块的时候,就可以从超级快出发,迅速的找到很多很多个空闲的磁盘块,呃用来分配好,另外这还会有一个,和空闲空间管理相关的一个数据结构,比如说卫视图,它应该也有印象0101对吧,0代表一个磁盘块控弦,一代表一个磁盘块不控弦,位识图,可以迅速的判断某一个特定的磁盘块,此时到底是否控弦,而超级快的作用,更多的是,要迅速的找到若干个呃控弦的盘块,所以这两个数据结构,它们在功能上有一定的重合性,都可以标记哪些盘块空闲,但是二者在实际的使用中啊,会有一些区别,好接下来这有一个i节点区,所谓i节点就是我们熟悉的锁影节点,每个文件都会有一个呃,与之对应的锁影节点,那Unix文件系统当中所有的锁影节点,都是连续存放在这个i节点区的,你可以认为,这个区域就是一个超大的数组,而数组的元素,就是一个一个的锁影节点,由于锁影,节点在这个区域是连续的存放的,而且每一个锁影节点的大小都相同,所以,我们就可以通过一个锁影节点的下标,就是数组的下标,来迅速的定位到一个指定的锁影节点,呃因为我们知道了所有锁影节点的,一个起始存放地址,以及每个锁影节点的大小,在结合上我们要找的那个锁,影节点的下标,那我们就可以迅速的定位到,任何一个锁影节点,所存储的位置,好这是爱节点区,下面是根目录,当我们完成了逻辑格式化之后,根目录也会被建立起来,因为任何一个文件系统,都必须从一个根目录出发,来建立新的下集的目录,或者存储新的文件,好所以逻辑格式化之后,在这个图当中,灰色的这些部分,就是已经有实际数据的部分,这是逻辑格式化填充进去的一些东西,而白色的这些区域,会用于保存其他文件和其他目录,这片区域在逻辑格式化了之后,是暂时为空的,只有你新建了文件,或者新建了其他的目录之后,这些部分才会慢慢的被填充上数据,好那这就是逻辑格式化要做的事情,好那到此为止,我们解决了文件系统在外存当中的呃,布局在外存当中的结构,接下来,我们看文件系统在内存当中的结构,来看一下文件

image-20230822200830908

image-20230822200852730

系统在内存当中是什么样子,那内存分为用户区和内核区,内核区当中有这样的三个重要的东西,一个是目录的缓存你最近访问过的,一些目录的数据,会被暂时缓存在啊内存当中,比如说你最近查找过目录m,那么由于查找目录m,需要把这个目录的数据,也就是呃目录当中包含的这些f,c b都给读入储存,那那如果接下来一段时间内,你又访问到了这个目录m,我们就没有必要,反复的从外存一次一次的读入,这样很耗费时间,所以,近期访问过的一些目录文件的数据,会被缓存在内存当中,那这么做可以加快目录检索的速度,而这是文件系统在内存当中的第一个,呃比较重要的东西,目录的缓存,也就是近期访问过的一些目录数据,那除此之外,还会有两个很重要的数据结构,一个叫系统打开文件表,一个叫用户打开文件表,也可以称为进程打开文件表,那顾名思义,系统打开文件表整个系统只有一张,而进程打开文件表,是每个进程会有一张,这样的打开文件表,那这个打开文件表,是包含在每个进程的PCB当中的,记录了某一个进程,他当前打开了哪些文件,那这就是文件系统在内存中的结构,分为目录的缓存,系统打开文件表和进程打开文件表,这样的3个东西,好接下来,我们不妨用一个例子来梳理一下,这些东西,它是怎么工作的来,

image-20230822200905568

看这样的一个例子,假设现在我们用open系统调用,尝试着打开呃,m这个目录下面的a这个文件,好现在我们,找到了文件a所存放的这个目录m,那接下来会把这个目录m的数据,给读入储存,给它缓存起来,读入储存了之后,是不是就可以检查这个目录像了,一个一个来对比,哎发现其中有一个目录像,这个文件的名字和我们要找的文件a,是能对的上的,那么接下来做的事情,就是要把a这个文件的FCB,目录像,给复制到系统打开文件表当中,复制一份表示这个文件被打开,同时设置它的打开技术为1,这意味着当前有一个进程正在打开,正在使用a这个文件,好另一个方面,刚才发起open系统调用的那个进程,它有一个进程打开文件表,需要在它的进程打开文件表当中,新建一个条目,这个条目当中会记录它的打开方式,打开方式到底是只读还是又要读,还要写,那这也是在open打开文件的时候,要指明的一个东西,在这个进程打开文件表当中,我们不会保存a这个文件的f c b,我们只会有一个指向,系统打开文件表的,所以那这样的话通过进程打开文件表,就可以找到,系统打开文件表当中对应的条目,而这个条目当中,是不是就可以找到呃这个文件,所对应的FCB了,好因此刚说的第三步,我们会在进程打开文件表当中,新建一个调目,同时返回这个调目的一个文件描述符,你可以简单的理解为,这个文件描述符就是指向,进程打开文件表的一个,指针,也就说当我们open打开一个文件之后,这个系统调用会给我们,程序员返回一个文件描述符,描述符FD,接下来我们通过这个文件描述符FD,就可以对我们打开的文件,进行相应的操作,比如接下来我们要对文件a,执行一个读操作,read系统调用,那么我们就只需要传入,这个文件描述符FD,同时指明要读多少个字节,以及要读到什么地方,指明这样的一些信息,那接下来操作系统,在接收到你的这个read系统调用之后,它就可以根据呃文件描述符FD,首先去呃进程打开文件表当中,找到对应的条目,然后再根据这个呃锁影信息,再找到,系统打开文件表当中对应的条目,然后再从这条目当中找到,这个文件它的FCB,好接下来再通过这个FCB,操作系统就可以确定文件a,它存放在外存当中的什么位置,好那通过这个例子,我们就能直观的感受到,文件系统在内存当中的呃这些个东西,他们有什么作用,以及这些东西他们的逻辑关系,好的那么到此为止,我们就完成了这个新考点的一个学习

image-20230822200924959

No.12 虚拟文件系统

来看第四章剩下的两个新考点,虚拟文件系统和文件系统的挂载,首先来认识一下什么是虚拟文件系统,我们先看一个没有虚拟文件,系统的情况,普通的文件系统长这个,样子,我们知道在我们使用计算机的时候,计算机上,难免会插上各种各样的外部存储设备,比如说你可能会插上一个移动硬盘,可能会插上一个u盘,那不同的这种存储设备,它里边的文件系统格式,可能是各不相同的,比如呃移动硬盘,它可能是NTFS这种文件系统的格式,而u盘,有可能是fat这种文件系统的格式,而你自己的磁盘,电脑里边本身就有的这个磁盘,有可能是UFS这种文件系统,所以可以看到,我们的计算机内部,有可能同时存在各种各样的呃,文件系统,那不同的文件系统,它的开发者在开发的时候,是不是有可能定义的函数,接口各不相同,比如说,同样是open打开文件的系统调用,那说不定UFS这个文件系统,它就是只有两个参数,然后NTFS这个文件系统,它可能函数的名字不一样,叫f open然后只有一个参数,fat可能又是另一个函数名字,同时参数列表,以及参数的格式也不一样,那这会导致什么问题呢,我们在写代码的时候,如果我们要从一个文件系统,打开一个文件,那么我们在操作,左边这个文件系统的时候,我们得按照他这个规范来写代码,中间这个文件系统,又是另一种不一样的函数点用的格式,这对于我们上层的用户,上层的程序员而言是不是很麻烦,是不是意味着,我还得根据我要找的这个文件,到底存放在什么样的文件系统里边,来调整我的这个函数代码,只要底层的文件系统不一样,那我可能就得修改我的代码,因此操作系统内核,应该向上层的用户进程,提供一个统一标准的函数调用接口,所以在操作系统当中,就引入了虚拟文件系统,英文缩写叫VFS,这个v就是

image-20230822201453850

Virtual虚拟的意思,好那么有了虚拟文件系统之后,用户进程再打开一个文件的时候,他只需要根据这个虚拟文件系统,制定的标准,来写自己的代码就可以了,比如说我要打开一个文件,那可能这个函数名就叫open,然后里面的参数就是x y z这样的3个,那无论我要打开的这个文件,它实际是存放在哪个文件系统当中的,我写代码的时候我都不用管,我只需要按照,虚拟文件系统,向上提供的这个统一标准的接口,来写我的代码就可以了,好所以,虚拟文件系统的第一个特点,就是向上层的用户进程,提供了统一标准的系统调用接口,因此虚拟文件系统的存在,对于用户而言,是帮用户屏蔽了底层,具体文件系统的实现差异,好这是虚拟文件系统的第一个特性,好现在,虚拟文件系统可以,处理,上层用户发来的一个标准的系统调,用请求然后这个虚拟文件系统,会负责去操作,底层一个具体的文件系统,但是刚才我们不是说每一个文件系统,它的函数呃,可能名字参数列表这些都不一样对吧,有的可能叫,open有的可能叫f open,那这对于虚拟文件系统来说,又是一个麻烦,是不是意味着,只要我下层的这些文件系统,他对外提供的函数调用接口不统一,那么我这个虚拟文件系统,在调用一个具体文件系统的时候,我的这个函数调用代码,也需要根据不同的文件系统,来进行改变,那这就意味着,我得频繁的修改,我这个操作系统内核的代码,对吧那这显然也是不科学的,为了解决这个问题,虚拟文件系统,会要求底层的这些文件系统,必须给我实现,我给你规定好的这些函数接口,比如说任何一个文件系统,只要想在我这个操作系统上,被支持被使用,那么你就必须按照我给你的这个要求,这个标准,去实现我规定好的这个函数,函数名叫什么,函数里边的各个参数分别是什么含义,什么格式,这都是我规定好规定死的,所以,如果我们要创造一个新的文件系统,想要在某一个呃操作系统上,被使用被支持的话,那我们就必须要满足这个操作系统,的虚拟文件系统,提出的这些要求,要实现特定功能的函数,比如说open read write等等,好因此,虚拟文件系统,除了对上层用户,提供了一个统一标准的接口之外,它还会要求,底层的这些具体的文件系统,要实现我规定好的这些函数接口,如果你实现不了那抱歉,你这个文件系统,就不被我这个操作系统所支持,好那这是虚拟文件系统的第二个特性,那现在可,以看到虚拟文件系统的底层,有可能是一个UFS文件系统,有可能是一个f a t文件系统,那我们知道,UFS文件系统的这个目录像以及f

image-20230822201516630

在这里插入图片描述

媒体文件系统的目录像,它们的格式是有很大差别的,UFS这种文件系统,每个目录像,只包含文件名和爱结点编号,这样的两个信息,我们需要根据爱结点的编号,把这个爱结点给读入储存,然然后才可以知道啊这个文件,它具体的一些原数据,以及它的存储地址等等这些信息,而对于fat文件系统来说,只要我读入了啊某一个文件的目录像,这个FCB里边就包含了我想要知道的,关于这个文件的所有信息,那这就造成了一个新的问题,对于虚拟文件系统来说,当我要打开一个具体的文件的时候,如果文件来自UFS这种文件系统,那么我读入的文件信息就长这个样子,而如果这个文件它来自fat文件系统,那我读入的文件信息,就长下面这个样子,这样的话,虚拟文件系统在内存当中,就必须使用不同的数据结构,来表示,来自不同文件系统的这些文件的信息,那这是不是也很麻烦,好所以为了解决这个问题,在虚拟文件系统当中,每当我们open打开了一个文件之后,这个虚拟文件系统就会给这个文件,在储存当中新建一个vino的,又叫微节点,这个vino的里边包含的就是文件的各,种各样的信息,那无论我打开的这个文件是来自于,呃UFS还是来自于fat,管你来自于什么样的文件系统,在我打开这个文件之后,我都会把这个文件相关的信息给,复制到这个vino的节点当中,这样的话,虚拟文件系统,就可以用一个统一的数据结构Vinod,来表示任何一个文件的信息,无论你这个文件,是存放在哪一种文件系统当中,好那这是虚拟文件系统,我们需要注意的第三个特性,每打开一个文件,就会在主存中新建一个vinod,有这样的两个地方值得注意,首先vinod和INOD看起来很像,但他们是两个完全不一样的东西,vinod只存在于主存当中,每一个被打开的文件,在主存中都会有一个与之对应的vinod,那INO,那i nod它既会被调入主存,同时在外存当中也会存储i nod,如果我们此时要打开的文件,刚好是在UFS文件系统当中,那么我们找到这个文件,所对应的目录像之后,会把文件的i note从外存先读入主存,然后在储存当中,不是给他新建了一个vinode吗,我们刚才读入的这个inode的各种信息,这些信息会被复制到vinode当中,好所以注意window和INOD的区别,这点,我认为很适合作为选择题的一个选项,好这是关于window的第一个,呃值得注意的地方,它只存在于储存当中,第二个值得注意的地方,你会看到这个地方,我把呃有一个东西涂,成了更深的红色,函数功能指针是什么东西,

image-20230822201904446

image-20230822202001528

之前我们说不同的文件系统,它需要实现虚拟文件系统规定的,呃一些呃函数的功能,比如说open read write必须实现,那每个文件系统open read right,它背后具体的代码其实是各不相同的,所以这个Renote当中的函数功能指针,其实是指向了,对应文件系统的函数功能列表,这样的话,只要我们open打开了一个文件,那之后我们要对文件进行的任何操作,比如说要对它进行read,或者要对它进行write,那任何一个操作,都可以先找到这个文件的vinod,然后根据vinod当中,记录的这个函数功能指针,再找到具体的对应的这个文件系统,它的函数功能列表,然后去执行这个具体的函数,这样就可以实现从上至下,一层一层的这种,函数调用,好所以在VINO的当中,除了文件的原数据各种信息之外,我们还会保存,这个文件所属的文件系统,他所提供的这个函数功能的列表,好那这就是虚拟文件系统,我们需要注意的一些特性,第一他要,向上层的用户提供一个标准的接口,像Linux里边,就是按照posix标准来定义的接口,另外虚拟文件系统向下也会要求,必须要实现某一些具体的,函数接口,第三,虚拟文件系统当中会有一个数据结构,叫做windowed,每一个被打开的文件,都会有一个与之对应的VINO的同,时这个VINO的里边,保存了具体的函数功能指针,好的那这就是虚拟文件系统,接下来看文件系统的挂载

image-20230822202016427

文件系统的挂载,又叫文件系统的安装,或者叫装载都可以,也就是如何将一个文件系统,挂载到操作系统上,大家经常会使用文件系统挂载的功能,只是你没发现,比如你把一个优盘插到你的电脑上,那你优盘的这个文件系统,就需要挂载到你的操作系统上,那具体来说,就是要挂载到,你操作系统的虚拟文件系统里面,好,那这给大家总结了文件系统的挂载,需要做的一些事情,首先我们需要在虚拟文件系统当中,注册我们新挂载的这个文件系统,在内存当中,这个虚拟文件系统,会管理一个数据结构,叫做挂载表,这个表,包含了每个文件系统的相关信息,包括文件系统的格式,以及这个文件系统的,容量大小等等这些基本的信息,比如像这个图里边,它挂载了呃三个文件系统,那么在虚拟文件系统的挂载表当中,就会有3个表象,三个表象分别指向了这个UFS,NTFS和fat三个文件系统,那当我们要挂载一个新的文件,系统的时候,这个新挂载的文件系统,也得给他新建一个呃表象,那这就完成了呃文件系统的一个注册,可以让,虚拟文件系统发现这个新的文件系统,好接下来每一个文件系统,它对什么open read right,这些函数的实现啊都各不相,同所以,新挂载的文件系统,需要向虚拟文件系统,提供一个自己的函数地址列表,我的open系统调用存放在哪个地址,我的red系统调用,这个代码存放在什么地址,也就是,刚才我们这一页看到的这个东西,有了这个东西,才可以让虚拟文件系统来调用呃,我们新挂载的这个文件系统,所提供的这些,功能函数,好接下来第三步,我们需要把新的这个文件系统,加到我们指定的挂载点当中,也就是要把这个新文件系统,挂载到某一个副目录下面,而这个看起来好像比较抽象,但其实并不难理解,什么是挂载点呢,如果你用的是Windows电脑,那么当你插入一个移动硬盘,或者插入一个u盘的时候,你会发现在你的这个界面上,它会有一个新的盘幅,那每一个盘它会用不同的编号,什么c d e啊这儿的什么h啊g等等,用一个盘幅的编号,来标识一个新的设备,新的文件系统,所以对于Windows操作系统而言,我们新加入新挂载的这个文件系统,它的挂载点就是这个地方,也就是和什么c盘d盘,e盘这些是评级的呃一种关系,而如果你使用的是Mac电脑,那你可以试一下,你在你的电脑上接上一个硬盘,或者接上一个u盘,然后在你的系统跟目录下面,去找到这个叫做volume的文件夹,在这个目录下面,你会看到你新挂载上去的这个文件,系统所以对于慢系统而言,这个呃新的文件系统,它的挂载点就是根目录下面的volume,这个目录支架,这就是所谓的挂载点,一个新加入的文件系统,需要把它挂载到某一个特定的位置,它可以在某一个,原本存在的副目录下面,只有确定了新文件系统挂载的位置,那接下来我们才可以正常的访,问和使用,这个新的文件系统,好那这就是所谓文件系统的挂载,,

image-20230822202042632

image-20230822202056914

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字孪生交通是数字化技术与交通的创新融合

摘要:数字孪生交通数字孪生交通(digitaltwintransportation)是一种新兴的技术概念,指通过大数据分析和处理,将这些数据与数字孪生交通模型相结合,实现对交通系统的全面仿真。 数字孪生交通&#xff0…

海外ios应用商店优化排名因素之视频预览与截图

当我们找到感兴趣的应用程序并转到该应用程序的页面时,首先引起注意的是预览视频。视频旨在以更具吸引力的方式展示应用程序的用户体验和UI。视频长度最多为30秒,其中前5秒最为重要,一定要让它尽可能引人注目。 1、关于优化预览视频的提示。…

2023-08-24 LeetCode每日一题(统计参与通信的服务器)

2023-08-24每日一题 一、题目编号 1267. 统计参与通信的服务器二、题目链接 点击跳转到题目位置 三、题目描述 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台…

Eagle for Mac图片素材管理工具

Eagle for Mac是专门为mac用户设计的一款非常专业的图片素材管理软件,支持藏网页图片,网页截屏,屏幕截图和标注,自动标签和筛选等功能,让设计师方便存储需要的素材和查找,提供工作效率。 使用 Eagle 强大的…

Unity 类Scene窗口相机控制

类Scene窗口相机控制 🍔效果 🍔效果 传送门👈

【前端】CSS技巧与样式优化

目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1)、选择合适的图标2)、合并图片3)、设置背景定位 ②、优化CSS精灵图的技巧1)、维护方便2)、考虑Retina屏幕3&…

开学哪款电容笔值得买?ipad2023手写笔推荐

开学有哪些电容笔值得买呢?比起之前的传统电容笔,现在的电容笔有了更多的特点,例如具有防误触,能避免手指不小心触碰到屏幕而造成书写失灵,还能任意调整线条的粗细。苹果的原装Pencil现在售价很贵。所以,在…

HarmonyOS ArkUI 属性动画入门详解

HarmonyOS ArkUI 属性动画入门详解 前言属性动画是什么?我们借助官方的话来说,我们自己简单归纳下 参数解释举个例子旋转动画 位移动画组合动画总结 前言 鸿蒙OS最近吹的很凶,赶紧卷一下。学习过程中发现很多人吐槽官方属性动画这一章比较敷…

【面试】一文讲清组合逻辑中的竞争与冒险

竞争的定义:组合逻辑电路中,输入信号的变化传输到电路的各级逻辑门,到达的时间有先后,也就是存在时差,称为竞争。 冒险的定义:当输入信号变化时,由于存在时差,在输出端产生错误&…

5G终端视频客服需求及实现方式

5G视频客服的适老化需求聚焦“远程辅助”和“触屏交互”两项功能。 需要UI、AP framework和Modem共同实现完成需求。 UI需要终端自行按需求开发实现。 芯片商提供AP framework层和modem的修改方案。 终端厂商要自行和CMCC客服端进行功能上的调试验证,完成功能认…

RTSP/Onvif视频服务器EasyNVR安防视频云服务平台出现崩溃并重启的情况解决方案

EasyNVR安防视频云服务平台的特点是基于RTSP/Onvif协议将前端设备统一接入,在平台进行转码、直播、处理及分发,在安防监控场景中,EasyNVR可实现实时监控、云端录像、云存储、告警、级联等视频能力,极大满足行业的视频监控需求。 有…

HBP人脑计划结果如何:欧洲投入6亿欧元利用计算机重建人脑?

为期十年的人脑计划将在九月份结束。《Nature》杂志审视了它的成就和动荡的过去。 来自人脑颞叶神经元回路的数字重建。来源:Nicolas Antille 人脑计划(Human Brain Project,HBP)历时长达10年,即将迎来圆满结束。这一庞…

薪火传承 | 天空卫士致敬原三线企业核工业部525厂老同志

上世纪60年代,几百万建设者开创了我国历史上一次规模空前的工业大迁移和工业大开发。创造出“艰苦创业、勇于创新、团结协作、无私奉献”的三线建设精神永为后世所敬仰和学习。 三线企业的前辈们用自己的青春和智慧为中国的科技事业作出了巨大的贡献。时光斗转&…

宠物赛道,用AI定制宠物头像搞钱项目教程

今天给大家介绍一个非常有趣,而粉丝价值又极高,用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道,获取1位铲屎官到私域,这类用户的价值是极高的,一个宠物粉,是连铲个屎都要花钱的,每…

排水管网水位监测方案助力城市“排忧解涝”

城市排水管网是城市地下生命线之一,事关城市安全、健康运行和高质量发展。然而由于排水管网内部自身的复杂性、多样性、隐蔽性等因素的存在,致使城市排水管网存在雨污混接、管网淤堵、入渗入流、运行负荷等现象,导致城市出现内涝、溢流污染等…

实力突出!安全狗云原生安全整体解决方案获优胜奖

近日,经过层层筛选,“2023年网络安全优秀创新成果大赛暨四川省‘熊猫杯’网络安全优秀作品大赛”得出获奖名单。 作为国内云原生安全领导厂商,安全狗旗下解决方案获优胜奖。 厦门服云信息科技有限公司(品牌名:安全狗&a…

创建web应用程序,React和Vue怎么选?

React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。 毫无疑…

C语言:选择+编程(每日一练Day7)

目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:图片整理 思路一: 思路二: 题二:寻找数组的中心下标 思路一&#xff1…

软考A计划-系统集成项目管理工程师-项目风险管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

csdn冷知识:如何在csdn里输入公式或矩阵

目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改,已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单:公式然后进入公式编辑器,选择右边的 ... 可以选择大括号等,右边还有矩阵符号选择后你需要创建几行几列的…