这部分感觉也有点令人迷惑,还是依照惯例先过一下王道,然后再做一个全局的图片
文件
对文件的虚拟
对文件自身
【操作系统视角】文件:byte 串
【用户视角】文件的逻辑结构,更多细节见 4.1.2. 文件的逻辑结构1
【虽然我觉得这和 filesys 关系不大,也不知道为啥会出现在这里,但是王道考研出现了,所以就提及一下】
一切皆文件
在 linux 系统下,一切皆文件,包括我们通常意味上的文件,文件管理的数据结构和 IO
关于文件管理结构
- 目录项/条目:也是一种文件,但是是记录很多文件关系的文件。==条目是通过将索引节点编号与文件名相关联来将索引节点和文件固定在一起的粘合剂==。
- FCB 事实上是一个历史术语,具体参见维基百科的解释,事实上现在它在现实生活中已经不适用了。可以理解为这个词等于目录项
- 多个目录项聚集在一起形成目录
- 索引节点:文件的元信息,数据在磁盘的位置
索引节点(index node) | 目录项(directory entry) | |
---|---|---|
内容 | 文件的元信息,数据在磁盘的位置 | 文件的名字和层级关系 |
位置 | 磁盘 | 内存 |
文件的物理结构
既然我们知道了一切皆文件,那么我们看看这些文件在真实生活中到底如何被存储
连续分配
连续分配要求每个文件在磁盘上占有一组连续的块
链接分配
有隐式链接和显式链接
注意:一个磁盘仅设置一张 FAT。开机时,将 FAT 读入内存,并常驻内存。 FAT 的各个表项在物理上连续存储,且每一个表项长度相同,因此,物理块号可以隐含
后者可以防止链接丢失
索引分配
会为每个文件建立一张索引表
但是有可能存在索引表太大的问题,所以我们有一些解决办法,比如多层索引,混合索引【in real life 的 unix 文件管理办法】
总结
嗯...这种优点和缺点可以出选择题
文件目录的结构
对于文件目录,也存在一些结构...
单级目录结构
顾名思义,是单级...
注意,这个单级文件目录不允许文件重名
【虽然但是,我理解讲课的时候提到这个单级文件目录作为一个最朴素的文件目录的 idea,但是在考试的时候就会退化成莫名其妙的“小朋友,请问哪个文件目录的结构不允许文件重名啊?“这种考点】
两级文件目录
早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD)和用户文件目录(UFD)
多级目录结构
不同目录下的文件可以重名
无环图目录结构
可以共享,设置共享计数器-> 软链接和硬连接【todo】
总结
唉总结,唉选择题
内容 | 好处 | 坏处 | |
---|---|---|---|
单级文件目录 | 一层的目录 | - | 不允许文件重名 |
两级文件目录 | 存在全局目录和用户目录 | 早期的多用户操作系统 | 对于某一个用户来说,不能对自己的文件进行分类管理 |
多级文件目录 | 存在多层目录 | 很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护 | 不便于实现文件的共享 |
无环图文件目录 | 在树形目录结构的基础上,增加了一些指向同一节点的有向边 | 利于共享 |
文件系统
我们有了文件和目录作为我们的构建块,这样我们就可以开始搭建自己的文件系统(强行...),这个文件系统应该具有若干功能,列举如下
- 储存空间的初始化
- 基本操作
- 空闲分区管理
- 文件共享
- 文件保护
- 磁盘管理
储存空间的初始化
划分: 将物理磁盘划分为一个个的文件卷(逻辑卷、逻辑盘),如 C 盘、D 盘等
【todo:文件卷是上图的?】
初始化: 把每个文件卷划分为目录区、文件区
- 目录区: 存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
- 文件区: 用于存放文件数据
文件的基本操作
这个文件系统必须要满足一些基本操作:create2/delete3, open4/close5,read6/write7,然而这是怎么做到的呢,快和小编(确信)一起看看吧
其实考试意义上比较重要的只有 open,但是首先我们先看一下文件系统的基本结构,然后解释一下 open 怎么回事
文件系统基本操作的基本结构
这个标题好像比较拗口,不过意思大概就是字面义
下图是文件系统在内存里的布局
但是和我们基本操作比较相关的主要是左侧的部分:操作系统维护一个全局的 open file table,以及对每个进程维护一个 file descriptor table
open
会考选择题,所谓的打开文件到底是把什么调入了内存?
【王道考研原文-就是把目录项复制到内存中的打开文件表里】所谓“打开”,是指调用 open 根据文件名搜索目录,将指明文件的属性 (包括该文件在外存上的物理位置),从外存复制到内存打开文件表的一个表目中,并将该表目的编号 (也称索引)返回给用户。当用户再次向系统发出文件操作请求时,可通过索引在打开文件表中查到文件信息,从而节省再次搜索目录的开销。当文件不再使用时,可利用系统调用 close 关闭它,操作系统将会从打开文件表中删除这一条目。
打开文件 (Open)
参数:
- 路径
- 文件名
- 操作类型 (r, rw...)
做的事:
- 从路径找到目录文件,目录中找到文件名对应目录项,检查是否有权限
- 将目录项复制到内存中“打开文件表”中。返回对应表项索引号(文件描述符) 。之后用户使用打开文件表的编号来指明要操作的文件
两种打开文件表: 进程的和系统的。
空闲分区管理
对于文件外存的空闲块,我们怎么管理捏
空闲表法
维护一个表,记录空闲磁盘区的起始点和长度
类似内存管理中的动态分区分配算法8,同样可采用首次适用、最佳适应、最坏适应等算法来决定要为文件分配哪个区间
注意,磁盘回收时会合并空闲区,所以可能有计算题,问你一同操作后还有多少空闲区之类的
空闲链表法
可以盘块链也可以盘区链
操作系统保存着链头、链尾指针
位视图法
通过字号和位号,以及 0 和 1,表示一个盘块有无被使用
成组链接法 todo
unix in real life 采取的方法,结合空闲表和空闲链表两种方法
【没明白,找一个图解 linux 之类的看看,考研文章真看不懂啊 😭】
文件共享
4.1.7. 文件共享
硬链接
基于索引结点
索引结点,对 FCB 进行瘦身(存放文件名, 指针)
索引结点中设置一个链接计数变量 count,用于表示链接到本索引结点上的用户目录项数
- 若 count = 2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。
若某个用户决定“删除〞该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的
count 值减 1。- 若 count > 0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
- 当 count = 0 时,系统负责删除文件
软链接
基于符号链接
索引节点指向 Link 类型的文件(源文件被删除依然存在 link 文件)。类似 快捷方式
[2009 统考真题] 设文件 F1 的当前引用计数值为 1,先建立文件 F1 的符号疑接(软链接)文件 F2,再建立文件 F1 的硬链接文件 F3,然后删除文件 F1。此时,文件 F2 和文件 F3 的引用计数值分别是 B 1, 1
问题来了,所谓的 path/to/file
指向的到底是什么,应该是目录项及其中的 inode 罢
文件保护
内容 | 好处 | 坏处 | |
---|---|---|---|
口令 | 建立文件提供口令,储存在 fcb;提供正确口令才可以访问 | 开销不多 | 口令存在系统内部,不够安全 |
密码 | 文件用密码加密 | 保密性强 | 加密解密消耗时间 |
访问控制表 | 每个文件目录有一个该表,以此规定访问权限 | 可以使用复杂的访问方法 | 长度无法预计空间管理复杂 |
精简的访问控制列表 | 拥有者 + 组 + 其他 | 空间管理简单 |
磁盘管理
placeholder,这部分留到下面 io 来说
4.1.2. 文件的逻辑结构
逻辑结构,从用户角度来看
物理结构,从操作系统角度来看
无结构文件:二进制流或字符流组成,又称“流式文件”。
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录由若干数据项组成,每条记录由一个数据项作为关键字,分为定长和不定长记录顺序文件:文件中的记录一个接一个顺序排列,记录可以是定长或不定长,物理上存储可以是顺序存储,链式存储
有两种结构:
- 串结构: 记录之间的顺序与关键字无关(如按存入时间排列)
- 顺序结构: 记录之间的顺序按关键字排列
能否随机存取?
顺序文件: 默认物理上顺序存储的文件,缺点是增加,删除记录困难(串结构简单)
-
链式存储只能依次查找
-
顺序存储
-
可变长记录,只能依次查找
-
定长记录,可以实现随机存储。
- 串结构,无法快速找到关键字对应记录
- 顺序结构,可以快速找到对应关键字的记录(如折半查找)
-
索引文件: 本身是定长记录的顺序文件, 主要用于对信息处理的及时性要求比较高的场合(索引号,长度, 指针)
- 可以用不同的数据项建立索引文件
- 关键字顺序排列,可以实现快速查找
索引顺序文件:在索引文件的基础上,不是一个记录对应一个索引表项,而是一组记录对应一个索引表项 (分块的思想)索引项组成 (键,地址)
多级索引顺序文件:高级索引顺序文件索引项为低一级的索引顺序文件,索引项组成 (键,地址) ↩
创建文件 (Create)
参数:
- 外存空间大小
- 文件路径
- 文件名
做的事:
- 在外存中找到文件所需的空间
- 根据文件存放路径信息找到目录文件,在目录中创建该文件对应的目录项, 包含文件名,外存中存放的位置 ↩
删除文件(Delete)
参数:
- 路径
- 文件名
做的事:
- 根据文件路径找到对应目录文件,从目录中找到文件名对应的目录项
- 根据目录项记录的外存存放位置、文件大小等信息,回收文件占用的磁盘块
- 从目录表中删除文件对应的目录项 ↩
打开文件 (Open)
参数:
- 路径
- 文件名
- 操作类型 (r, rw...)
做的事:
- 从路径找到目录文件,目录中找到文件名对应目录项,检查是否有权限
- 将目录项复制到内存中“打开文件表”中。返回对应表项索引号(文件描述符) 。之后用户使用打开文件表的编号来指明要操作的文件
两种打开文件表: 进程的和系统的。 ↩
关闭文件(Close)
做的事:
- 将进程打开文件表对应表项删除
- 回收分配给文件的资源
- 打开文件表的打开计数器 count - 1, 若等于 0 删除表项 ↩
读文件 (Read)
真正从外存读入内存
- 读的文件(操作系统看来是打开表的编号)
- 将读指针所指的外存中,将用户指定大小的数据读入用户指定的内存区域中) ↩
写文件 (Write)
- 指明文件
- 修改大小
- 外存数据在内存中位置
- 将数据从内存写入外存 ↩
动态分区分配算法
↩
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于