
(以下内容全部出自上述课程)
目录
- 初识文件管理
-
- [1. 文件属性](#1. 文件属性)
- [2. 文件数据怎么组织?](#2. 文件数据怎么组织?)
- [3. 文件之间怎么组织?](#3. 文件之间怎么组织?)
- [4. 操作系统应该提供哪些功能?](#4. 操作系统应该提供哪些功能?)
- [5. 文件如何存放在外存?](#5. 文件如何存放在外存?)
- [6. 其他](#6. 其他)
- [7. 小结](#7. 小结)
- 文件的逻辑结构
-
- [1. 无结构文件](#1. 无结构文件)
- [2. 有结构文件](#2. 有结构文件)
-
- [2.1 顺序文件](#2.1 顺序文件)
- [2.2 索引文件](#2.2 索引文件)
- [2.3 索引顺序文件](#2.3 索引顺序文件)
- [2.4 多级索引顺序文件](#2.4 多级索引顺序文件)
- [3. 小结](#3. 小结)
- 文件目录
-
- [1. 文件控制块](#1. 文件控制块)
- [2. 目录结构](#2. 目录结构)
-
- [2.1 单级目录结构](#2.1 单级目录结构)
- [2.2 两级目录结构](#2.2 两级目录结构)
- [2.3 多级目录结构](#2.3 多级目录结构)
- [2.4 无环图目录结构](#2.4 无环图目录结构)
- [3. 索引结点](#3. 索引结点)
- [4. 小结](#4. 小结)
- 文件的物理结构
-
- [1. 文件块、磁盘块](#1. 文件块、磁盘块)
- [2. 文件分配方式](#2. 文件分配方式)
-
- [2.1 连续分配](#2.1 连续分配)
- [2.2 隐式链接](#2.2 隐式链接)
- [2.3 显式链接](#2.3 显式链接)
- [2.4 索引分配](#2.4 索引分配)
- [3. 小结](#3. 小结)
- [逻辑结构 vs 物理结构](#逻辑结构 vs 物理结构)
-
- [1. 无结构文件](#1. 无结构文件)
-
- [1.1 逻辑结构](#1.1 逻辑结构)
- [1.2 物理结构](#1.2 物理结构)
- [2. 顺序文件](#2. 顺序文件)
-
- [2.1 物理结构](#2.1 物理结构)
- [2.2 逻辑结构](#2.2 逻辑结构)
- [3. 索引文件](#3. 索引文件)
-
- [3.1 逻辑结构](#3.1 逻辑结构)
- [3.2 物理结构](#3.2 物理结构)
- [4. 小结](#4. 小结)
- 文件存储空间管理
-
- [1. 存储空间的划分与初始化](#1. 存储空间的划分与初始化)
- [2. 存储空间管理](#2. 存储空间管理)
-
- [2.1 空闲表法](#2.1 空闲表法)
- [2.2 空闲链表法](#2.2 空闲链表法)
- [2.3 位示图法](#2.3 位示图法)
- [2.4 成组链接法(了解)](#2.4 成组链接法(了解))
- [3. 小结](#3. 小结)
初识文件管理

1. 文件属性
我们正常使用电脑中的文件管理器,里面就放着我们日常使用的文件。
每个文件你点开他,都能看见一大堆的信息。

同一个文件夹下的文件不能重名 ,因为我们都是根据文件名来区分哪个文件是哪个文件的。

2. 文件数据怎么组织?
- 无结构文件=流式文件:就类似于你直接建了一个文本文件在里面打字。
- 有结构文件=记录式文件:就类似于你建立了一个excel文件。
- 数据项:excel中的一个小格子。
- 记录 :excel中的一行。

因为有结构文件有很多种存放方式,比如顺序啊链式啊什么的,我们之后就要讨论用哪种存放方式存数据。

3. 文件之间怎么组织?
文件间就是我们说的C盘D盘,哪个文件夹包含哪个文件夹。


4. 操作系统应该提供哪些功能?
- 创建文件:我们平时右击桌面就可以新建文件,底层是操作系统帮我们调用函数创建的新文件。
- 读文件:双击打开文件的时候,也是操作系统调用函数帮助我们打开的文件。
- 写文件:我们在文件中打字,也是操作系统调用底层函数帮我们写上数据的。
- 删除文件 :同上,只不过我们不知道操作系统帮助我们实现功能而已。

通过这几个比较基础的功能,就可以叠加实现更加复杂的功能。
比如说复制文件的本质就是新建文件,读入原文件内容,再写入同样的内容。

5. 文件如何存放在外存?
存入外存,这就涉及到了物理地址。(物理就是摸得到的东西,比如硬盘就可以摸到)
- 操作系统把存储空间分成了一块一块的空间用来存储数据。(所以一个大房子被一个人住也是占了一个大房子的面积)
- 内存-->外存,这就涉及到了逻辑地址与物理地址映射的问题,怎么找到数据...神马的。
- 映射问题大差不差,具体可见:基本地址变换机构
- 为了便于外存和内存一一对应,所以大致来看,两者差不多。

很多块,就会出现连续不连续的问题,就会出现碎片的问题,还会涉及到文件怎么存的问题。
具体和内存大差不差,具体可见:连续分配管理方式

6. 其他

7. 小结

文件的逻辑结构

1. 无结构文件
无结构,没什么好讨论的,所以重点在下文的有结构的文件上。

2. 有结构文件
- 关键字:就是不能重复的字段,类似于学号啊什么的。
- 数据项:就是一个格子,格子里面记录的数据。
- 记录 :就是一行格子。

- 定长记录 :类似于我们用mysql建立表的时候添加的固定字长。(比如电话只能11位)

- 可变长记录 :比如图中的特长,有的人可以有很多,有的人可以没有。

逻辑结构上可以分为这三种: - 顺序文件:像日记本,只能从头翻;
- 索引文件:像带目录的电话本,一查就找到;
- 索引顺序文件 :索引顺序文件:像分类快递柜,先找区再找人。

2.1 顺序文件
-
链式存储:比如一堆乱序但是标了页码的文件。
-
顺序存储:比如你写日记,只能写完今天的才能再写明天的。
-
串结构:按时间排序。
-
顺序结构 :按关键字排序。(比如学号的大小一直都是确定的)

提到顺序文件,基本都默认是使用顺序存储的,所以把链式存储pass掉。
-
可变长记录:比如你的日记一天长一天短,就没办法根据天数判断出第n天是第几页。
-
定长记录:你规定日记只能一天写一页,这样就可以根据天数找到页数。
-
串结构:如果你这一天突然想修改前一天的日记,按照时间排序,昨天的就排到今天的后面了,有误差所以无法快速找出。
-
顺序结构:你给每篇日记按照第n天编号为n,所以就可以快速找到这天的笔记了。
缺点 :因为都是按照顺序来的,所以你的日记就没办法很方便地在两天中间再添加其他内容了。

2.2 索引文件
- 索引文件:比如一本书。
- 索引表-定长:这本书的目录。
缺点:如果这本书非---常厚,那么目录也就只能变得特----别长。

2.3 索引顺序文件
就是上面两种的结合。
-
索引顺序文件:超厚大书超详细目录。
-
索引表 :把超厚大书过于详细的目录通过分组整合成小的目录。
-
顺序体现:小目录下的详细目录是顺序排列的。(如图第二列的表)
-
索引体现 :小目录是详细目录的索引。

-
顺序文件:(最好1次找到+最差10000次找到)/2次查找次数=平均查询5000次
-
索引顺序文件 :10000分为100组100个记录。
先找组:(最好1次找到+最差100次找到)/2次查找次数=平均查询50次
再找具体记录:(最好1次找到+最差100次找到)/2次查找次数=平均查询50次
所以相加就是平均100次才能找到想要的记录。
-
更多记录怎么办? :答案是套娃!

2.4 多级索引顺序文件
纯套娃:
- 第一列:相当于书上的章
- 第二列:相当于书上的节
- 第三列:相当于书上的x.x.x节

3. 小结


文件目录


1. 文件控制块
目录 :有结构文件,所以也可以用表格的形式表现出来。
因为我们之前说过我们都是按照名字来找文件的,所以这里文件名就相当于是关键字 。

- FCB :记录=一行,就是一个文件控制块。

这里对标上文的操作系统提供的功能,反正都是创建删除等的操作。

2. 目录结构
2.1 单级目录结构
类似于一个盘只让你建立平级的文件夹,不可以在文件夹里再建文件夹。
这样就只能一个用户用,因为根本区分不了用户的不同,而且一个用户这么用也不是很便利。

2.2 两级目录结构
一个用户自己相当于一个文件夹,他自己也只能建立平级文件夹。
虽然能够分出不同用户使用,但是对于用户来说还不是很便利。

2.3 多级目录结构
就是现在我们用的目录结构,文件夹随便儿建,只要不在同一个文件夹里就可以重名。
- 绝对路径 :只能从根目录开始往下找。

- 相对路径 :可以根据当前目录的位置来寻找文件。

2.4 无环图目录结构
之前的目录结构无法实现两个不同的用户可以访问同一个内容,所以又出现的无环图目录结构。
两个用户的FCB可以同时指向同一个文件,这样这两个用户打开自己的这个文件时,访问到的都是被指向的文件。
- 共享计数器 :表示这个文件被几个人共享。
如果一个用户删除了自己共享的这个文件,源文件并不会被删除,只是把用户电脑上的映射删掉了,同时共享计数器-1.
如果有用户修改了这个文件,其他用户也能看见被修改的内容。(有点儿像在线文档)

3. 索引结点
因为FCB这一行中包含的内容太多了,很多内容是我们用户用不到的,所以就可以把这个表头精简一下,这样搜索速度就可以更快了。


4. 小结

文件的物理结构


1. 文件块、磁盘块
内存的内容,具体可见:内存

- 用户:比如你编写代码像输出a的值。(逻辑地址)
- 操作系统 :根据逻辑地址转为物理地址,找到这个值,把值返回给你。

2. 文件分配方式
2.1 连续分配
空闲块连在一起。
- 逻辑地址-->物理地址:
物理块号=起始块号+逻辑块号-->不可能从头开始就有连续位置,所以需要加上起始块号
块内地址:因为内存和外存分的块大小相同,所以不用变。
类似于:你从逻辑搬家搬到物理,就变了个房子位置,但是里面的装修还都是一样的。 - 支持顺序访问和直接访问

因为连在一起,所以读写都很方便。

如果一个占了3个块的文件想要再添一个块的数据,但是它后面没有空闲块了,因为必须连续分配,所以就必须先把前3块复制到后面有4个连续空闲块的位置,然后再把想新添的内容填到后面的空闲块上。
无论如何:必须保持连续!

因为太依赖连续了,所以肯定有很多零零散散的空闲块,就很浪费空间,如果想把他们紧凑移到一起还很浪费时间。


2.2 隐式链接
空闲块用指针链接在一起,很好地解决了空闲块分散的问题。
- 指针透明:就是用户看不见指针,所以才叫隐式链接。
- 因为用户都不知道哪儿指向哪儿,所以只支持顺序访问,不支持直接访问(也就是随机访问)

想拓展文件,就直接放进一个空闲块里然后用指针链接上就可以,避免了空闲块的空间浪费问题。


2.3 显式链接
多了一个FAT表,知道谁指向谁了,所以叫做显式链接。

知道每块指向的下一块是哪块之后,就支持直接访问了。


2.4 索引分配
有索引两个字一定会有索引表,索引块就是索引表放在了哪块里,就直接去那块找目录查自己想要的文件在哪个物理块里。
因为可以直接找到物理块号,所以也支持直接访问。

如果索引表太大,一块装不下怎么办?

又是套娃,链接:
- 分好几个索引块,把索引块链接起来

纯套娃: - 章-节-小节的分法

顶级索引未读入内存,就需要K+1次读磁盘操作。

混合(大一统): - 直接+间接
- 直接:就一查就查到索引了
- 一级间接:得查两次
- 二级间接:得查三次
- 当然,如果顶级索引没被读入内存,每种都需要+1次读磁盘


3. 小结

逻辑结构 vs 物理结构

1. 无结构文件

1.1 逻辑结构
逻辑结构就是我们能看的到的
我们数到第16个字符是o,想用代码显示出来
16就是逻辑地址,所以最后输出的也是o

1.2 物理结构
物理结构就是操作系统看到的
它调用函数才知道我们要的东西在什么位置,然后才能调出来给我们

2. 顺序文件

2.1 物理结构
可以把操作系统看成商家,对于商家来讲,可以有很多种方式放货物。
连续分配:
- 类似于按照供货商分配货物

链接分配: - 类似于有空我就塞进去,先不浪费空间,位置记上就好

索引分配: - 类似于我都随便儿塞,但是我有记录哪里是哪里就好

2.2 逻辑结构
切换到我们的视角:
- 顺序存储:我们看得到商家按编号给我们发出货物,刚好按顺序到
- 链式存储:我们看得到商家发出的货物根据运输速度不同,到达的顺序也不同,但是编号还是在的
- 但是对我们来说,我们看不到商家的货都放在哪里对吧

- 这个就是凑巧了,我们用链式商家也是链接分配

3. 索引文件
3.1 逻辑结构
我们看到的是目录是目录,货物是货物

3.2 物理结构
操作系统看到的是:拆完了全塞进货架

4. 小结
- 逻辑结构:我们看得到的,文件对我们来说看得见,所以逻辑结构都是XX文件
- 物理结构 :操作系统决定自己的货物怎么分配,所以都是XX分配、XX链接

文件存储空间管理


1. 存储空间的划分与初始化
就是划分C盘、D盘。

2. 存储空间管理
2.1 空闲表法
首次适应等算法,具体可见:动态分区分配算法
- 空闲表法 :连续的空闲块组成一个区。


2.2 空闲链表法
- 空闲盘块链:按块连起来
- 空闲盘区链 :把连续的块变为区连在一起



2.3 位示图法
0表示空闲,1表示已分配。
每15块为一组(第一行),以此类推。


2.4 成组链接法(了解)








3. 小结
