操作系统第四章(1)---文件管理

概念

文件就是一组有意义的信息/数据集合

但是文件有不同种类:文档(.doc、.docx)、pdf、图片(.png、.jpg)等等很多很多

因此不同种类的图片有不同的属性

接下来我们还会学习文件内部是如何组织起来的
文件之间又应该怎么组织起来

文件属性

文件名:文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。(这玩意儿不用我多讲吧)

标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。

类型:指明文件的类型

位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)

保护信息:对文件进行保护的访问控制信息

还有别的:创建时间、上次修改时间、文件所有者

文件组织

文件其实有两种无结构文件和有结构文件

无结构文件由一系列二进制或字符流组成(就是平常用的什么文档啊、word啥的)

有结构文件由一条条记录组成(一条记录会有好几个数据项)

至于文件之间就是由目录连接起来的,很明显我们用此电脑的时候,有三个根目录(有的只有两个、再垃圾点的可能只有一个,看个人电脑分区而言),然后根目录下还能有目录,也可以有文件(注:这个目录其实也是一种有结构文件,类似于一种表)

操作系统提供的基本功能

(1)创建文件(create系统调用)

(2)删除文件(delete系统调用)

(3)读文件(read系统调用)

(4)写文件(write系统调用)

(5)打开文件(open系统调用)
一般在读/写文件之前,需要打开文件

(6)关闭文件(close系统调用)
一般在读/写文件之后,需要关闭文件

别的操作基本上都可以用这几个基本功能做出来,比如复制文件,(就是先创建一个,然后把那个文件写入新创建的文件中)

这里还有两个非常重要的功能:文件共享(不同用户都可以用这个文件)和文件保护(保证不同用户对一个文件的操作权限不同)

文件的存储

不管是外存还是内存,都是以块为单位进行文件存储空间分配的(也就是说即使只有10B的大小,一块有1KB大小,他也是占据1KB大小的)

而在实际的存储中,他们也是有连续存储和离散存储的

知识点回顾

在这里插入图片描述

文件的逻结构

在上面也讲了,文件的逻辑结构分为两种:无结构文件和有结构文件

无结构文件

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。 如:Windows操作系统中的.txt 文件。

这个文件就是典型的无结构文件,没有明显的结构特性。。。这个大家稍微的思考一下就懂了

有结构文件

有结构文件:由一-组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。

如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID )

根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录

定长记录举例:
每个学生都有学号、姓名、性别、专业
这个分别用32B、32B、4B和60B来存储,并且不会改变

那么这个就可以称为定长记录

定义:每条记录的长度都相同,各个数据项都处于记录中相同的位置,具有相同的顺序和长度

可变长记录举例:
每个学生都有学号、姓名、性别和特长
这个分别用32B、32B、4B和不知道多少的空间来存储(毕竟总有些人简历很厚,有些人简历空白)

那么这个就称为可变长记录

定义:由于数据项的长度不确定,就导致了记录的长度不确定,这就是可变长记录

有结构方式的存储方式:顺序文件、索引文件、索引顺序文件

顺序文件

顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储

既然是顺序文件,那么和数据结构中的顺序结构一样有两种方式:顺序表和链表(就是物理上是否相邻)

顺序文件也有两种结构:串结构(记录之间的顺序与关键字无关)和顺序结构(记录之间的顺序按关键字顺序排列)

注意:顺序表存储和链式存储的功能也不一样(就和数据结构里的不一样似的)

链式存储:无论是定长可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找

顺序存储:
针对可变长记录:无法实现随机存取。每次只能从第一个记录开始依次往后查找(因为针对可变长记录,我们在存储时还需要用一个长度数据项来保存)

针对定长记录:可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i*L;若采用串结构,无法快速找到某关键字对应的记录;若采用顺序结构,可以快速找到某关键字对应的记录(这里就会用到查找方法,比如折半查找)

注:一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。之后的讲解中提到的顺序文件也默认如此。可见,顺序文件的缺点是增加/删除一个记录比较困难( 如果是串结构则相对简单)

当然,为了减少I/O开销,一般系统会有一个日志文件,每隔一定的时间再去对内存进行操作,减少开销

索引文件

因为生活中很多很多都是可变长记录,但是顺序文件又不能解决这个问题,于是就出现了索引结构

索引表本身是定长记录的顺序文件。因此可以快速找到第i个记录对应的索引项。

可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。(一般用于对信息处理的即使性要求比较高的场合)

这边其实就是和页表差不多,你拿着要找的东西问索引表在哪,他给起始地址和长度,你去访问

另外,可以用不同的数据项建立多个索引表。如:学生信息表中,可用关键字“学号”建立一张索引表。也可用“姓名”建立一张索引表。这样就可以根据“姓名”快速地检索文件了。
(Eg:SQL就支持根据某个数据项建立索引的功能)

这个不就是数据库的思想么。。。

索引顺序文件

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。(因为一条记录一个索引的话可能开销太大了)

举例:
文件的每个记水平均只占8B,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了

所以他实际上就是又是结合体,先分组,组中是混乱的,组与组之间是有序的按关键字来的,这样才能减少开销

针对太多了的咋办,多级索引!!!(这不就是多级么)

知识点回顾

在这里插入图片描述
在这里插入图片描述

文件目录

这个就是一层一层放下去,大家找此电脑里面的文件的时候肯定都用过,就不多介绍了

这个可以使文件之间的组织结构清晰,易于查找

知识点框架
在这里插入图片描述
操作系统对于文件目录其实也是使用有结构文件的管理方式

也就是建立表:
在这里插入图片描述
当我们双击打开文件夹的时候其实做了一下操作

当我们双击“照片”后,操作系统会在这个目录表中找到关键字“照片”对应的目录项(也就是记录),然后从外存中将“照片”目录的信息读入内存,于是,“照片” 目录中的内容就可以显示出来了。

而这个表中的一个记录项就是一个文件控制块(FCB)

并且FCB的有序集合称为“文件目录”(就是电脑中的文件夹)

FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息( 是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)

当然最最重要的还是文件名和文件存放的物理地址

因为这是操作系统中用户可以实现按名存取的操作,就是知道名字就能访问物理地址

对目录的操作

搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项

创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项

删除文件:当删除一个文件时,需要在目录中删除相应的目录项

显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性

修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)

这些都是我们日常在用的,就不过多解释了

目录结构

正是因为有了文件目录,因此我们就有了表,那么随之而来的又是经典的一张表太大,要减少开销了

目录结构就出现了,有四种目录:单级目录、两级目录、多级目录、无环图目录

单级目录

早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。

单级目录实现了“按名存取”,但是不允许文件重名。

在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。

显然,单级目录结构不适用于多用户操作系统。

两级目录

早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory)

这里是分为了用户目录和用户文件目录

主文件目录(用来记录用户名和相应用户文件目录的存放位置)

用户文件目录就是该用户的文件目录

两级目录结构允许不同用户的文件重名,也可以进行访问限制(但是用户依旧不能对自己的文件进行分类)

多级目录(树形目录)

用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间“/”隔开。从根目录出发的路径称为绝对路径

在这里插入图片描述
例如:自拍jpg 的绝对路径是“/照片/2015-08/自拍.jpg”
系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的
存放位置后,从外存读入对应的目录表;再找到“2015-08”目录的存放位置,再从外存读入对应目录表;最后才找到文件“自拍.jpg”的存放位置。整个过程需要3次读磁盘I/O操作。

很多时候,用户会连续访问同一目录内的多个文件(比如:接连查看“2015-08"目录内的多个照片文件),显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。

例如,此时已经打开了“照片”的目录文件,也就是说,这张目录表已调入内存,那么可以把它设置为
“当前目录”。当用户想要访问某个文件时,可以使用从当前目录出发的“相对路径”

(这个绝对路径和相对路径用过的应该都是知道的!!!我就不多解释了吧)

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构

无环图目录

在这里插入图片描述
这个就是啥呢,可以让不同目录中的文件指向同一个文件

需要为每个共享结点设置-一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。

只有共享计数器减为0时,才删除结点。

注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。(这里就指明了共享文件和复制文件的区别)

索引结点

这是对FCB的一种改进

因为表中内容太多了,很繁杂,所以进行了改进,因为检索的时候只需要文件名进行寻找,所以可以把表变成只有两个数据项的表:文件名和索引结点指针

这时候举个例子对比一下为什么快:

假设一个FCB是64B,磁盘块的大小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有640个目录项,则共需要占用640/16 = 40个盘块。因此按照某文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)。

若使用索引结点机制,文件名占14B,索引结点指针站2B,则每个盘块可存放64个目录项,那么按文件名检索目录平均只需要读入320/64=5个磁盘块。显然,这将大大提升文件检索速度。

经典减少开销

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。

存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等

知识点回顾

在这里插入图片描述

文件的物理结构

操作系统对磁盘进行管理的方式也就两种情况:对非空闲磁盘的管理(文件分配方式)和对空闲磁盘的管理(文件存储空间管理)

文件分配方式

文件分配方式描述的就是文件数据应该如何存放在外存之中

文件分配方式有三种:连续分配、链接分配、索引分配
在这里插入图片描述

基本概念

1.磁盘其实和内存相似,也是分成一块块或者一页页的,并且在很多操作系统中,磁盘块的大小与内存块的大小相同(这样子方便直接以块作为单位进行数据交换)

2.进程的逻辑地址空间被分为一个个页面、文件的逻辑地址空间也被分为一个个文件的块(用逻辑块号,块内地址的形式表示)

基于逻辑块号和物理块号之间的映射方式不同,分为了连续分配、链接分配和索引分配

连续分配

连续分配方式要求每个文件在磁盘上占有一组连续的块。

既然是连续分配,和前面的方式也是一模一样

关于逻辑地址转换到物理地址的方式也是一样,会有一张表格来记录文件名和其相对应的起始块号和长度
在这里插入图片描述
至于怎么算就不用多说了吧,在逻辑上的第n块,就是起始块号+逻辑块号(注意:养成习惯昂~要判断有没有越界,即逻辑块号有没有 ≥ \ge 长度)

优点:
1.能够随机访问------因此和所有的连续存储方式一样,连续分配是可以实现随机访问的(就是类似于给出数组下标,就能直接访问;顺序访问的话就是类似于链表一样的,必须一个结点一个结点访问下去才行)

2.读/写快速------读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。这就导致了连续分配的文件在顺序读/写时速度最快

缺点:
1.在物理上不方便拓展------若此时文件A要拓展,需要再增加一个磁盘块(总共需要连续的4个磁盘块)。由于采用连续结构,因此文件A占用的磁盘块必须是连续的。因此只能将文件A全部“迁移”到空闲区域。

2.存储空间利用率低------和内存中的连续分配一样,产生一些难以利用的碎片,并且如果用紧凑技术来处理的话,开销太大(紧凑技术:就是把文件挪一挪,空闲的块合起来)

链接分配

链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。(其实就是离散的,然后用链表的方式连接起来)

隐式链接

会有一张表记录文件名和对应的起始块号和结束块号,也可以有一个长度

并且在物理存储中,每一个块的最后都会有一个next指针,指向下一个物理块(这个不就是单纯的链表吗)

这种方式就是链表中寻找下标i的方式:先把起始块号读入内存,然后用0号块的尾部指针读入1号块,依次读入,知道目标下标的磁盘块被读入(因此这里的指针对用户是透明的)

优点:
1.方便拓展文件,不会产生碎片,内存利用率高------这个就是链表相对于顺序表的优点了,链表的结点容易实现插入删除,所以拓展文件就只需要把文件挂到链表后面就行了

缺点:
1.只支持顺序访问------链表相对于顺序表的缺点上过数据结构的应该都知道,就不在强调,所以他只支持顺序访问

显示分配

把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT, File Allocation Table )

也就是不仅会有一张文件名和相对应的起始块号表,还有一张专门对应每个磁盘块下一块指向的表(这个表是长期放置在内存中的),如下图所示

举个例子:
文件aaa的磁盘块顺序是2→5→0→1
文件bbb的磁盘块顺序是4→23→3
在这里插入图片描述
因此据图可知是如何排列的了,如果磁盘块是结尾块的话

注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT 的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。(这种隐含就不用多讲了吧,直接就是目标块号*长度)

逻辑地址转换为物理地址:就是直接读文件名和相对应的起始块号表,然后在通过起始块号去查FAT

优点:
弥补了隐式链接的缺点
1.既可以顺序访问也可以随机访问(这个不用随机访问时不用依次读入寻找,但是还是要是FAT中顺序查找的)
2.访问效率更高------因为不需要依次读入磁盘,所以时间开销大大降低

别的的话就是隐式链接的优点,就不重复赘述了

缺点:
1.存储空间被占用------因为在内存中的FAT一定会占据一定的存储空间

注意:题目中如果提到的是链接分配,而没有指明是哪种方式,那么默认为隐式链接

索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表------建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

这个其实先来一张文件名和其相对应的索引块的磁盘块号,然后在那个磁盘块中存储逻辑块号和相对于的物理块号

假设某个新创建的文件“aaa”的数据依次存放在磁盘块2 →5→13 →9。

7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容。
在这里插入图片描述
在这里插入图片描述
可以用固定的长度表示物理块号(如:假设磁盘总容量为1TB= 2 40 2^{40} 240B;磁盘块大小为1KB,则共有 2 30 2^{30} 230个磁盘块,则可用4B表示磁盘块号),因此,索引表中的“逻辑块号”可以是隐含的。(说了半天还是表示逻辑块号可以隐藏)

逻辑地址转换为物理地址:

这个其实就是先去找到文件名对应的索引块,然后其索引块里面找到相对应的块号,然后找到对应的磁盘块号就可以了

优点:
这个就是支持随机访问并且容易实现文件拓展(随便离散的分配一个,再加到索引表里面就行了)

缺点:
1.存储空间被占用------就是索引表会占据一个磁盘块嘛

这时候所有人都会想到一个问题:如果这个文件太大了,他的索引表溢出了咋办(通俗的讲就是索引块如果只够存256个物理块,但是文件被分为了1024个磁盘块咋办)

索引分配有三种解决方案
1.链接方案
2.多层索引
3.混合索引

链接方案

如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。(就是在索引块的最后放一个指针,指向下一个索引块)

举例:
假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。

若一个文件大小为256* 256KB =65,536 KB = 64MB
该文件共有256256个块,也就对应256256个索引项,也就需要256个索引块来存储,这些索引块用链接方
案连起来。

若想要访问文件的最后一个逻辑块,就必须找到最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前255个索引块。

多级索引

这个就是针对于上面的索引表只能顺序访问实施的

建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。(这个模式太熟悉不过了吧,具体就看下面的例子吧)
在这里插入图片描述
举例:
假设磁盘块大小为1KB,一个索引表项占4B,则-一个
磁盘块只能存放256个索引项。

若某文件采用两层索引,则该文件的最大长度可以到
256* 256*1KB = 65,536 KB = 64MB(注意:这个最大长度要会算)

可根据逻辑块号算出应该查找索引表中的哪个表项。
如:要访问1026号逻辑块,则

1026/256= 4,1026%256= 2

因此可以先将一级索引表调入内存, 查询4号表项, 将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可知道1026号逻辑块存放的磁盘块号了。访问目标数据块,需要3次磁盘I/O。

注:如果我们采用的是K层索引结构,并且顶级(就是最开始需要查找的表)未调入内存,则访问一个数据块需要K+1次读磁盘操作

混合索引

这个就是针对于小文件还采用多层索引的方式,太浪费了

多种索引分配方式的结合。例如,一一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含级间接索引 (指向单层索引表)、还包含两级间接索引 (指向两层索引表)

在这里插入图片描述
这个图配合文字应该挺好理解

这里的读磁盘操作就看具体情况而言了,看是直接地址还是一级间接地址还是二级间接地址

注:这个也是要学会计算最大长度的=直接地址*长度+一级间接地址*直接地址数*长度+二级间接地址*一级间接地址数*直接地址数*长度

知识点总结

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表, 索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表------建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

若文件太大,索引表项太多,可以采取以下三种方法解决:

①链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。缺点:若文件很大,索引表很长,就需要将很多个索引块链接起来。想要找到i号索引块,必须先依次读入0~i-1号索引块,这就导致磁盘I/O次数过多,查找效率低下。

②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。缺点:即使是小文件,访问一个数据块依然需要K+1次读磁盘。

③混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。

超级超级超级重要考点:
①要会根据多层索引、混合索引的结构计算出文件的最大长度(Key: 各级索引表最大不能超过一一个块) ;

②要能自己分析访问某个数据块所需要的读磁盘次数(Key: FCB中 会存有指向顶级索引块的指针,因此可以根据FCB读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外,要注意题目条件------顶级索引块是否已调入内存)

知识点总结

在这里插入图片描述

文件存储空间管理

知识点框架
在这里插入图片描述
存储空间也有好多种管理方法:空闲表法、空闲链表法、位示图法、成组链接法,下面会详细介绍

存储空间的划分与初始化

安装Windows操作系统的时候,一个必经步骤是------为磁盘分区(C:盘、D: 盘、E: 盘等),当然就算没有重装系统的也知道自己的电脑分为C盘、D盘、E盘等,这些盘被称为文件卷(也称为逻辑卷、逻辑盘)

并且一个文件卷划分为目录区和文件区,日录区主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息,文件区用于存放文件数据

当然,有的系统支持超大文件,可支持多个物理磁盘组成一个文件卷(PS:像我自己的电脑就是1TB的SSD,由两块512GB的SSD组成,合并成一个300G的C和700G的D盘)

空闲表法

这种方法的表示方式为第一个空闲盘块号和空闲盘块数,如下图所示:
在这里插入图片描述
这个应该挺好理解的

因此这个就很适合用来进行连续分配

主要专注于如何分配磁盘块:
与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况------①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。

这个其实分配和回收的方式和内存管理是一样的,不懂得就回去理解一下内存管理

空闲链表法

空闲链表法分为两种:空闲盘块链和空闲盘区链(其中的主要区别就是一个是以盘块为单位,一个是以盘区为单位)

盘块就是普通的空闲盘块、盘区就是连续的一块空闲盘块

放出下面的图方便理解:
在这里插入图片描述

空闲盘块链

操作系统保存着链头、链尾指针。

如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。

如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。

这个不就是去掉k个头结点和插入n个尾结点嘛,就不用多说了吧,数据结构,懂得都懂

这种方式适用于离散分配的物理结构,为文件分配多个盘块时可能会重复多次操作(就是把头结点一个一个摘下来,然后放上去,要重复多次)

空闲盘区链

操作系统保存着链头、链尾指针。

如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。

如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区邻,将回收区作为单独的一个空闲盘区挂到链尾。

这个既适用于离散分配,也适用于连续分配,并且为一个文件分配多个盘块时效率更高(因为他不是一个一个块放进去的,他是一个区一个区放进去的)

位示图法

这玩意儿。。。咋说呢,看图理解吧,个人感觉看图才能理解那么一丢丢

在这里插入图片描述
在这里插入图片描述
这是一个磁盘和相对应的位示图表示

首先0、1、2、3中0、2是空闲的1、3是有数据的,因此表示就是0101,然后每行都是用字表示,上图中字的字长就是16位

因此官方解释:

位示图:每个二进制位对应一个盘块。在本例中,“0” 代表盘块空闲,“1”代表盘块已分配。位示图- -般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一-位对应-一个盘块。因此可以用(字号,位号)对应一个盘块号,当然有的题目中也描述为(行号,列号)

最最最!!!重要的:自己可以推出盘块号与(字号,位号)相互转换的公式

要注意题目条件:盘块号、位号从0开始还是从1开始

上图中是从0开始,字长n=16

因此盘块号=n*字号+位号 \qquad 字号=盘块号/n \qquad 位号=盘块号%n

如何分配:若文件需要K个块,①顺序描位示图,找到K个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应盘块分配给文件:③将相应位设置为“1”

如何回收:①根据回收的盘块号计算出对应的字号、位号;②将相应二进制位设为“0”

这个东西咋说呢,反正都是一一对应的,没啥好解释的

这个对于连续分配和离散分配都适合

成组链接法

空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX 系统中采用了成组链接法对磁盘空闲块进行管理。

文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致

这玩意儿太难理解了。。。我直接放视频吧。。。(菜鸡泪流满面,主要是下面说很难作为考题。。。侥幸一下)
文件存储空间管理

知识点回顾

在这里插入图片描述

文件的基本操作

知识点框架
在这里插入图片描述
上面也讲过了,文件操作的基本功能就这么几个:创建、删除、读、写、打开、关闭

创建文件

使用了Create系统调用,需要提供一些主要参数:
1.所需外存空间大小(如:一个盘块,即1KB)
2.文件存放路径(D:/)
3.文件名(这个地方默认为新建xxx.xxx)

这个操作我们在使用的时候一般都是由操作系统完成的,外存空间根据文件种类而定,存放路径就是当前路径,文件名就是默认的新建xxx

操作系统在处理Create系统调用的时候,主要做了两件事:
1.在外存中找到文件所需的空间------这个就是和上面文件存储空间管理的方法结合了

2.创建该文件对应的目录项------根据文件存放的路径信息找到该目录对应的目录文件,然后加入他自己的FCB,包含文件名、文件在外存中的存放位置等信息

删除文件

进行Delete系统调用时,需要提供的几个主要参数:
1.文件存放路径(“D:/Demo”)
2.文件名(“test.txt” )

操作系统在处理Delete系统调用时,主要做了几件事:

1.寻找对应的FCB------根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。

2.回收磁盘块------根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(回收磁盘块时,根据空闲表法、空闲链袈法、位图法等管理策略的不同,需要做不同的处理)

3.删除------从目录表中删除文件对应的目录项

打开文件

在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供的几个主要参数:

1.文件存放路径(“D:/Demo”)

2.文件名(“test.txt” )

3.要对文件的操作类型(如: r只读;rw读写等)

操作系统在处理open系统调用时,主要做了几件事:

1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。

2.将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。

注:其实对于这个文件有两个文件打开表,一个是系统的文件打开表(整个系统只有一张);另一个是进程中的文件打开表,这样子的话进程再次操作文件的时候就可以直接打开,不需要查目录,加快访问速度(优点类似于进程的快表???)
在这里插入图片描述
这里可以看到一个红色的字段:打开计数器(用来记录此时有多少个进程打开了此文件)

可以方便实现某些文件管理的功能。例如:在Windows系统中,我们尝试删除某个txt文件,如果此时该文件已被某个“记事本进程打开,则系统会提示我们“暂时无法删除该文件”。其实东统在背后做的事就是先检查了系统打开文件表,确认此时是否有进程正在使用该文件。

这里可以看到进程表中海油两个与系统打开文件表的不同字段:读写指针和访问权限(因为不同进程访问的位置不同,以及权限不同,所以是放在进程的表中)

读写指针:用来标注该进程对文件的读/写操作进行到的位置

访问权限:打开文件时声明的是什么,只读的话无法对文件进行修改,但是读写权限的话就可以进行修改

关闭文件

进程使用完文件后,要“关闭文件”操作系统在处理Close系统调用时,主要做了几件事:

1.将进程的打开文件表相应表项删除
2.回收分配给该文件的内存空间等资源
3.系统打开文件表的打开计数器count减1,若count =0,则删除对应表项。

读文件

进程使用read系统调用完成写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据(如:读入1KB)、指明读入的数据要放在内在中的什么位置。

记录一下我的理解:我们在读文件之前,已经用进程打开文件了,放入了文件打开表中,所以我们只需要知道他在文件打开表中的编号即可,还有就是读入多少数据(这决定我们在内存中给他分配空间)、要放入内存中的什么位置(这取决于我们读的是什么文件)

操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。

写文件

进程使用write系统调用完成写操作,需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写出多少数据(如:写出1KB)、写回外存的数据放在内存中的什么位置

操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。

知识点回顾

在这里插入图片描述

文件共享

操作系统为用户提供文件共享功能,可以让多个用户共享地使用同一个文件(注:是共享!!!不是复制,文件只有一份,谁改了,别人看到的也会改)

文件共享有两种方式:基于索引结点的共享方式(硬链接)和基于符号链的共享方式(软链接)

基于索引结点的共享方式(硬链接)

索引结点可以根据前文理解

共享方式的实现就是两个文件目录的目录项的索引结点指针都指向同一个索引结点即可
在这里插入图片描述
可以发现,上图中索引结点有一个链接计数变量Count,用于表示链接到本索引结点上的用户目录项数。

并且在不同文件目录中文件名可以不同,只要指向同一文件即可

针对于删除,要注意Count必须=0的时候,才能删除磁盘中内容,不然就是删除对应文件目录的目录项和Count- -。

基于符号链的共享方式(软链接)

这种就是创建一个新的索引结点,并且索引结点的内容是一个Link类型的文件,里面是要指向的文件的路径
在这里插入图片描述
这个其实类似于快捷方式,我们看似是点击桌面的.exe进入,实际上访问的还是快捷方式指向的路径内的文件(注:这个文件名是可以不同的)

注:这里的删除就不一样了,你如果删除了这个软连接,对原来的不会有任何的影响(就像你删除了快捷方式还能再搞一个出来),但是你删除了本来的文件,那么这个软连接就会失效(就像你删除了qq,qq的快捷方式就会失效)

这个会比硬链接的更慢,因为你要访问多级目录,而不是直接找到在哪

知识点回顾

在这里插入图片描述

文件保护

文件保护的方式有三种:口令保护、加密保护、访问控制

口令保护

为文件设置一个“口令”(如: abc112233) ,用户请求访问该文件时必须提供“口令”。

口令般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件

优点:保存口令的空间开销不多,验证口令的时间开销也很小。

缺点:正确的“口令”存放在系统内部,不够安全。

我的理解:就是密码验证。。。只是这个密码是存放在系统内部的,如果被入侵了,密码就被知道了

加密保护

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

Eg:一个最简单的加密算法–异或加密假设用于加密/解密的“密码”为“01001

在这里插入图片描述
这个如何得到我就不一一算了吧,就是用01001进行异或运算

并且如果用错了,将会获得错误的数据

优点:保密性强,不需要在系统中存储“密码”

缺点:编码/译码,或者说加密/解密要花费一定时间。

访问控制

在每个文件的FCB (或索引结点)中增加一个访问控制列表(Access-Control List, ACL), 该表中记录了各个用户可以对该文件执行哪些操作。

如果访问类型有以下几种:读、写、执行、添加、删除、列表清单

那么就会有这么一张表
在这里插入图片描述
但是,如果这个计算机的用户有成千上百个,那样的话一一记录会有很大的开销

因此推出了精简版的访问列表,就是把所有的用户分为几组(举例:系统管理员、文件主、文件主的伙伴、其他用户)

这样子的话,要给响应的权限就给他相对应的身份就可以了
在这里插入图片描述

注:如果针对某个文件目录进行了访问控制,那么这个文件目录下的所有文件都会变成相同的访问控制

知识点回顾

在这里插入图片描述

文件系统的层次结构

我们可以讲文件系统分为:用户接口、文件目录系统、存取控制模块、逻辑文件系统与文件信息缓冲区、物理文件系统、辅助分配模块、设备管理模块和设备

如下图所示:
在这里插入图片描述

用户接口

文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求( Read、Write、 Open、Close等系统调用)

使用的其实就是文件操作的基本功能

文件目录系统

用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如:管理活跃的文件目录表、管理打开文件表等。

这个就是用来读、写啥的

存取控制块

为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。

因为对于文件需要进行保护,所以我们要对用户的权限进行验证

逻辑文件系统与文件信息缓冲区

用户指明想要访问文件记录号,这层需要将记录号转换为对应的逻辑地址

这一层是用来进行获取逻辑地址的

物理文件系统

这一层是用来进行逻辑地址转化为物理地址的

辅助分配模块

负责文件存储空间的管理,即负责分配和回收存储空间

设备管理模块

直接与硬件交互,负责和硬件直接相关的一些管理 工作。如:分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等

这个就是对硬件资源的分配了

对应内容

其实这个层次我已经全部记录过了
用户接口:文件基本操作
文件目录系统:文件目录
存取控制模块:文件保护
逻辑文件系统与文件信息缓冲区:文件的逻辑结构
物理文件系统:文件的物理结构
辅助分配模块:文件存储空间管理
设备管理模块:后面会有的磁盘管理

实际操作模拟

用一个例子来辅助记忆文件系统的层次结构:

假设某用户请求删除文件“D:/工作目录/学生信息.xIsx"的最后100条记录。

1.用户需要通过操作系统提供的接口发出上述请求------用户接口

2.由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项------文件目录系统
3.不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限------存取控制模块(存取控制验证层)

4.验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址------逻辑文件系统与文件信息缓冲区

5.知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址------物理文件系统

6.要删除这条记录,必定要对磁盘设备发出请求------设备管理程序模块

7.删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收------辅助分配模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值