目录
一、文件系统基础
(一)基本概念
- 文件的属性
文件名:由用户决定,同一目录下不允许有重名文件。
标识符:一个系统内的各文件标识符唯一,用于区分各个文件。
类型:指明文件的类型
位置:文件的存放路径(文件可见)、在外存中的地址(操作系统可见,用户不可见)
大小:指明文件大小
保护信息:对文件进行保护的访问控制信息
创建时间、上次修改时间、文件所有者信息 - 文件的逻辑结构
有结构文件(记录式文件)、无结构文件(流式文件)
- 文件的基本操作
创建文件:create系统调用
读文件:read系统调用
写文件:write系统调用
删除文件:delete系统调用
多个基本功能组合就能完成复制等复杂的功能。 - 文件的物理结构
操作系统以块为单位为为文件分配存储空间。当文件大时文件连续或者离散占用多个磁盘块。
- 其他需要实现的功能
文件共享:使多个用户可以共享使用一个文件
文件保护:如何保证不同的用户对文件有不同的操作权限
小节回顾
(二)文件的逻辑结构
指用户看来文件内部的数据应该使如何组织起来的。
无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如txt文件。
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。
有结构文件
- 顺序文件
文件中的记录一个接一个地顺序排序(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。
⭐一般来说,考题中所说的“顺序文件”指的是物理上顺序存储的顺序文件⭐。
⭐顺序文件的缺点使增加/删除一个记录比较困难⭐。 - 索引文件
每个文件建立索引表,以加快文件检索速度。每条记录对应一个索引项。
索引表本身使定长记录的顺序文件。
- 索引顺序文件
就是套娃
索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
小节回顾
(三)⭐文件目录⭐
文件控制块
FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。
FCB中包含了文件的基本信息,最重要最基本的是文件名、文件存放的物理地址。
目录结构
- 单级目录结构
早期操作系统并不支持多级目录,整个系统中之间里一张目录表,每个文件占一个目录项。
单级目录结构实现了“按名存取”,但是不允许文件重名,单级目录结构不适用于多用户操作系统。 - 两级目录结构
早期的多用户操作系统,采用两级目录结构。分为主文件目录和用户文件目录
允许不同用户的文件重名,但是缺乏灵活性,用户不能对自己的文件进行分类,就是不能创建文件夹。 - 多级目录结构(树形目录结构)
用户(或用户进程)要访问某个文件时要用文件路径标识文件,文件路径名是各字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护但是,树形结构不便于实现文件的共享。 - 无环图目录结构
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)
需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点。
⭐注意⭐:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。
索引节点
当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。
存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。
相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在改问该文件等。
小节回顾
(四)文件的物理结构
磁盘中存储单元也会被分为一个个“磁盘块”,而磁盘块会分成与内存页面大小相等的页面。
在外存管理中,为了方便对文件数据管理,文件的逻辑地址空间也被分为了一个一个的文件“块”。
文件的逻辑地址可以表示为(逻辑块号,块内地址)的形式。
连续分配
要求每个文件在磁盘上占有一组连续的块。
目录表中应当由**“起始块号”与“长度”字段。用户给出要访问的逻辑块号,则物理块号=起始块号+逻辑块号**。
优点:
1、连续分配方式支持随机访问和顺序访问。
2、连续分配的文件在读写时速度最快。
缺点:
1、物理上采用连续分配的文件拓展不方便
2、物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片。可以采用紧凑方式处理磁盘碎片。
链接分配
⭐若题目中未指明是什么链接,则一律以隐式链接为准。⭐
1、隐式链接
缺点:只支持顺序访问,不支持随机访问,查找效率低。
优点:很方便文件拓展,不会有碎片问题,外存利用率高
2、显示链接
用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表FAT。
注:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT各个表项在物理上连续存储,每个表项长度相同,所以物理块号可以隐含。
优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点:文件分配表的需要占用一定的存储空间。
⭐索引分配⭐
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表――建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
- 链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
- 多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层索引块。这可根据文件大小的要求再建立第三层、第四层索引块。
⭐若采用多层索引,则各层索引表大小不能超过一个磁盘块⭐。 - ⭐混合索引⭐:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)
优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。
⭐⭐超级超级超级重要考点⭐⭐
①要会根据多层索引、混合索引的结构计算出文件的最大长度(Key:各级索引表最大不能超过一个块)
②要能自己分析访问某个数据块所需要的读磁盘次数(Key:FCB中会存有指向顶级索引块的指针,因此可以根据FCB读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外,要注意题目条件——顶级索引块是否已调入内存)
小节回顾
(五)文件存储空间管理
存储空间的划分与初始化
空闲表法
记录每一个空闲区间的起始块号和区间大小(空闲盘块数)
与内存管理中的动态分区分配类似,可以采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
在回收时也与内存管理类似,进行表项的合并。
空闲链表法
空闲盘块链:以单个空闲块为单位
空闲盘区链:以连续的空闲盘区为单位。
空闲盘块链
空闲盘区链
⭐位示图法⭐
连续分配与离散分配都适用。
⭐⭐重要:要能自己推出盘块号与(字号,位号)相互转换的公式⭐⭐。
⭐成组链接法⭐
第一个为超级块,标明了下一组空闲盘块数和空闲块号。当第一个盘块号为-1时标明已经没有分组了,下一组无分组。
回收与分配都要讲超级块当成链头来看待,进行回收与分配。
小节回顾
(六)文件共享
操作系统为用户提供文件共享功能,可以让多个用户共享地使用同一个文件。(系统中只有一份数据,一个用户修改其他用户也看得到修改)
- 基于索引节点的共享方式(硬链接)
让不同用户的目录项指向同一个索引节点。
删除一个文件只是删除了对应用户的目录项,并且索引节点-1。当索引节点数量等于0时文件才进行删除。
- 基于符号链的共享方式(软链接)
linux系统的.lnk文件
小节回顾
(七)文件保护
保护文件数据的安全
- 口令保护
为文件设置口令,当用户请求访问该文件的时候必须给出相应口令,操作系统会根据输入口令和FCB中的口令进行比较,相同才可以访问。
优点:保存口令的空间开销不多,验证口令的时间开销也很小
缺点:正确的“口令”存放在系统内部,不够安全。 - 加密保护
使用某个密码对文件进行加密,访问文件时需要提供正确的密码才能进行正确的访问。
优点:保密性强,不需要在系统中存储“密码”
缺点:编码/译码,或者说加密/解密要花费一定时间。 - 访问控制
在每个文件的FCB中增加一个访问控制列表,该表中记录了各个用户可以对该文件执行哪些操作。
精简访问列表,就是windows的用户组方式,将用户分别放入各个组中,然后通过组来进行分配访问权限,文件这一个章节要是自己尝试写一个文件管理系统,会理解的很快。
小节回顾
二、文件系统
(一)文件系统的层次结构(408不考)
(二)文件系统的全局结构(新考点)
磁盘分区
- 磁盘刚出场还没有分区。
- 首先先进性物理格式化。
物理格式化,即低级格式化——划分扇区,检测坏扇区,并用备用扇区替换坏扇区。 - 进行逻辑格式化
逻辑格式化后,磁盘分区(分卷),完成各分区的文件系统初始化。
open系统调用打开文件
近期访问过的目录项都会放入目录缓存中。
(三)虚拟文件系统&文件系统挂载(新考点)
虚拟文件系统
①向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
②VFS要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求
③每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。
文件系统挂载
即文件系统安装/装载——如何将一个系统挂载到操作系统中。
①在VFS中注册新挂载的文件系统。内存中的挂载表( mount table)包含每个文件系统的相关信息,包括文件系统类型、容量大小等。
②新挂载的文件系统,要向VFS提供一个函数地址列表
③将新文件系统加到挂载点(mount point) ,也就是将新文件系统挂载在某个父目录下
由于我的书是王道2022,跟这2023的有偏差,所以这里会有一些缺。但也问题不大。