操作系统-第十章-文件系统
一、文件概念
1.基本概念
- 文件:
- 操作系统对存储设备的物理属性加以抽象,从而定义逻辑存储单位
- 文件为抽象数据类型
- 文件由操作系统映射到物理设备上
- 存储设备通常是非易失的
- 计算机中信息存储的基本组织形式
- 记录外存上的具有文件名的相关信息集合
- 从用户角度上看,文件是逻辑外存的最小分配单元,数据只有通过文件才能写到外存
- 通常,文件表示程序(源形式和目标形式)和数据
- 通常,文件为位、字节、行或记录的序列,其含义由文件的创建者和用户定义
- 文件信息由创建者定义,文件可以存储许多不同类型的信息
- 操作系统对存储设备的物理属性加以抽象,从而定义逻辑存储单位
- 文件名:
- 文件被命名以方便用户,并且通过名称可以引用
- 按名存取:文件名⇨存储位置
- 文件名由一串ASCLL码或(和)汉字构成
- 名字长度:
- 8.3规则:文件名8个字符,类型3个字符,之间有"."分割
- 长文件名:可以最多输入255多个字符作为文件名
- 文件名可能大小写敏感
- 当文件被命名后,它就独立于进程、用户,甚至创建它的系统
2.文件结构
- 文件结构是指文件内信息的组织方式
- 文件类型可用于指示文件的内部结构
- 目的:便于程序理解文件内容
- \(\color{red}{操作系统}\)和\(\color{red}{应用程序}\)决定了文件的结构
- pdf文件的结构由pdf阅读器决定
- 可执行文件的结构由操作系统决定
- 常用文件结构
- 无结构:文字流、字节流等
- 简单记录结构:线性、固定长度、可变长度等
- 复杂结构:格式化文档、多媒体文件等
- 让操作系统支持多个文件结构带来一个缺点:操作系统会变得太复杂
- 解决:系统强加(并支持)最小数量的文件结构
- 操作系统不对这些位做出解释,灵活性大但支持的也少
- 每个应用程序必须包含自己的代码,以便按适当结构来解释输入文件
- 所有操作系统必须支持至少一种结构,即可执行文件的结构,以便系统能够加载和运行程序
- 解决:系统强加(并支持)最小数量的文件结构
3.内部文件结构
- 在内部,定位文件的偏移对操作系统来说可能是比较复杂的
- 磁盘系统通常具有明确定义的块大小,由扇区大小决定
- 所有磁盘I/O按块(物理记录)为单位执行,而所有块的大小相同
- 将多个逻辑记录包装到物理块中
- 逻辑记录大小、物理块大小和打包技术确定了每个物理块可有多少逻辑记录
- 打包可以通过用户应用程序和操作系统来完成
- 文件都可当作块的序列
- 所有基本I/O功能都以块为单位来进行
- 磁盘空间按块为单位来分配,因此每个文件的最后一块的某些部分通常会被浪费
- 所有文件系统都有内部碎片;块大小越大,内部碎片也越大
4.文件类型
- 文件类型一般由扩展名决定
- 文件扩展名(也称文件后缀名)
- 标识文件类型的一种机制
- 扩展名跟在主文件名后面,由一个分隔符"."分隔
- 指示文件类型和可用于文件的操作类型
- 扩展名不总是必需的
5.文件属性
- 文件名:唯一,便于记忆
- 标识符:这种唯一标记(通常为数字)标识文件系统的文件;它是文件的非人类可读的名称
- 文件位置:设备上文件位置的指针
- 文件类型:文件的格式
- 文件大小:文件当前大小
- 保护:读、写、执行等访问控制信息
- 时间、日期和用户标识:保护、 安全和使用跟踪的数据
- 文件属性保存在目录结构中
- 目录结构保存在外存上
- 目录条目由文件的名称及其唯一标识符组成
- 根据标识符可定位其他文件属性
- 由于目录(如文件)必须是非易失性的,因此必须存在设备上,并根据需要而被调入内存
- 有些文件系统支持扩展文件属性,包括文件的字符编码和安全功能,如文件校验和
6.文件操作
- 创建文件
- 必须在文件系统中为文件找到空间
- 必须在目录中创建新文件的条目
- 写文件
- 使用一个系统调用指定文件名称和要写入文件的信息
- 系统应保留写指针,用于指向需要进行下次写操作的文件位置,每当发生写操作时,写指针必须被更新
- 读文件
- 使用一个系统调用指定文件名称和需要文件的下一个块应该放在哪里(在内存中)
- 系统应保留读指针,用于指向需要进行下次读操作的文件位置,每当发生读操作时,写指针必须被更新
- 在文件内重定位
- 搜索目录以寻找适当的条目,并且将当前文件位置重新定位到给定值
- 不需要涉及任何实际的I/O
- 删除文件
- 截断文件
- 允许所有属性不变(除了文件长度),但让文件重置为零,并释放它的文件空间
- 打开文件
- 需要数据结构:
- 打开文件表:跟踪打开文件,维护所有打开文件的信息
- 首次引用文件时,操作open()根据文件名搜索目录,以将目录条目复制到打开文件表
- open()接受访问模式信息,根据文件权限检查模式,如果允许请求模式,则会为进程打开文件
- open()返回一个指针,以指向打开文件表的对应条目,指针不是实际的文件名,指针可以用于所有的I/O操作
- 请求文件操作时,可通过该表的索引指定文件,而不需要搜索
- 文件最近不再使用时,进程关闭它,操作系统从该表中删除它的条目
- 文件指针:指向最后一次读写的位置,每个进程1个,对操作文件的每个进程是唯一的,因此必须与磁盘文件属性分开保存
- 打开文件计数器:打开文件次数(调用open次数)
- 文件存储位置:文件存放在存储设备上的位置信息,该信息存放在内存中
- 访问权限:每个进程的访问权限
- 打开文件表:跟踪打开文件,维护所有打开文件的信息
- 优点:
- 方便文件共享
- 提高文件存取效率
- 需要数据结构:
- 关闭文件
二、逻辑文件及其访问方法
- 逻辑文件:
- 文件内容组织方式
- 面向用户
- 逻辑文件(文件逻辑结构):是指文件呈现在用户面前的组织结构
- 逻辑文件决定了文件访问方法
- 目录:
- 文件组织形式
- 文件属性
- 物理文件:
- 文件存储方式
- 面向系统
- 文件访问方式,即逻辑文件是影响文件访问效率的因素之一
- 有些系统只为文件提供一种访问方法;而其他的支持多种访问方法(访问设备因素影响)
1.顺序文件
- 顺序文件:顺序文件由一系列\(\color{red}{不等长记录}\)按照某种顺序(一般是写入时间)排列形成
- 访问方式:顺序访问
- 最简单的访问方式
- 文件信息按照存放顺序,一个记录一个记录地依次访问
- 典型存储设备:磁带
- 编辑器、编译器使用这种方法
- 依次访问数据,不能直接跳转到文件的指定位置
- 读和写构成文件的大部分操作
- 优点:记录存储紧凑,节省存储空间
- 缺点:访问效率差
- 例:
2.直接(随机)文件
- 直接文件一般组织为记录等长文件
- 由于逻辑记录为固定大小,所以容易读、写和删除记录
- 访问方式:直接(随机)访问
- 可以直接定位到文件的某条记录进行访问
- 必须修改文件操作以便包括块号作为参数
- 典型设备:磁盘
- 存放在磁盘上的顺序文件可以直接访问
- 直接通过计算得到需要读写记录的位置,直接跳转进行文件读写
- 对于大量信息的立即访问,直接访问文件极为有用。数据库通常是这种类型的
- 用户提供给系统的块号,通常为相对块号
- 相对块号:是相对于文件开头的索引
- 优点:访问效率高,可以直接定位到某条记录
- 缺点:浪费存储空间
- 例:
3.索引文件
- 顺序文件的存储形式,直接文件的检索方式
- 索引文件中,索引表的表项一般等长
- 基本方法:为顺序文件建立索引表或根据某个检索项作索引
- 索引文件存储容量接近顺序文件,访问速度接近直接文件
- 对于大文件,索引文件可能变得太大而无法保存在内存中
- 解决方案:为索引文件创建索引。主索引文件包含指针,以指向辅助索引文件;而辅助索引文件包括指针,以指向实际的数据项
- 解决方案:为索引文件创建索引。主索引文件包含指针,以指向辅助索引文件;而辅助索引文件包括指针,以指向实际的数据项
三、文件目录
1.文件控制块(FCB)
- 存放操控文件所需的各类文件属性信息
- 文件名
- 文件长度
- 创建时间
- 存放位置
- 访问控制权限
- 类似一个索引项
2.目录项和目录
- 目录:
- 包含着所有文件信息的节点集合
- 根据文件名检索文件的桥梁
- 目录项的有序集合
- 用户和文件之间的一个桥梁
- 目录可视为符号表,可将文件名称转成目录条目
- 目录项:
- 存放一个文件的各类属性
- 有的系统等同于文件控制块
- 目录文件:
- 目录组织形式
- 目录作为一个文件存在于文件系统
3.目录结构
- 目录和文件都驻留在存储设备(如磁盘)
- 文件存储在随机存取存储设备上,包括硬盘、光盘和固态(基于内存)盘
- 一个存储设备可以按整体来用于文件系统;也可以细分,进行划分分区,以提供更细粒度的控制
- 每个分区可以有单独的文件系统
- 分区可用于限制单个文件系统的大小、将多个类型的文件系统放在同一设备上,或留下设备的一部分以为他用
- 卷:设备的每个分区都可以用于创建文件系统,包含文件系统的的分区通常称为卷
- 卷可以是设备的一部分,或整个设备,或由多个设备组成的RAID集
- 每个卷可以作为虚拟磁盘
- 卷可以存储多个操作系统,以允许引导和运行多个操作系统
- 设备目录或(卷目录表):每个包含文件系统的卷中,所包含的有关系统内的文件信息保存在设备目录或卷目录表中,记录卷上的所有文件的信息,如名称、位置、大小和类型等
- 每个目录项中存放了文件在存储设备的存放地址
4.目录相关操作
- 操作是将指针地址进行变换,并没有对文件本本身的内容进行改变
5.目录访问
- 用户根据文件名访问文件,而文件是存储在设备上的
- 文件检索:负责把文件名转换为文件在存储设备上的位置,根据文件名找文件存储位置信息的过程
- 文件检索是一个遍历目录项的过程:
- 1.根据文件所在目录打开目录文件
- 2.从磁盘读入该目录文件的1个(物理块),该块包含若干个目录项
- 3.根据文件名遍历内存中的该块,如找到对应文件名的目录块则结束
- 4.判断该目录文件是否还有物理块没有读入,如果是转到2;否则,结束。表示该目录中没有此文件名的文件。
- 目录项由于经常变化,一般不排序
- 平均遍历目录项数:(1+n)/2
- 不包括文件查不到的情况
- 不包括文件查不到的情况
6.目录项的检索性能
- 物理块(Block):内存和存储设备数据交换基本单位。一个物理块一般为4KB、8KB和16KB等。每次读写文件都是以块为单位,至少一块
- 例如:当前物理块大小是4KB,则一个读入文件的1个字节的操作也要从存储设备读入4KB
- 目录性能:为了提高文件的检索效率,需要读入尽可能少的物理块(耗时少)
- iNode:降低ds
- 例:
7.文件保护
- 访问控制列表和分组:
- 访问模式:读/写/执行,用R/W/X来表示
- 三种类型的用户:
- 所有者 7 -> 1/1/1(R/W/X)
- 同组用户 6 -> 1/1/0(R/W/X)
- 公共用户 1 -> 0/0/1(R/W/X)
- 建立一个组,加入一些用户
- 对特定的文件或目录(game),定义适当的访问权限
四、目录结构
1.目录结构的设计目标
- 效率:
- 快速定位文件位置
- 提高文件访问效率
- 命名:
- 方便用户使用
- 同名的不同文件
- 不同名的相同文件
- 分组:
- 文件分组(子目录)
- 兼顾效率和方便性
1.单层结构
- 所有文件在同一目录中,只有一级目录:根目录
- 适用文件数量少的情况,数量多时,检索效率差
- 根目录(/):一个文件系统最顶层的目录
- 每次会读入内存,太多会影响内存的性能
- 优点:结构简单
- 缺点:
- 检索效率差(目录下文件过多)
- 跟踪这么多的文件是个艰巨的任务
- 不能有同名文件,一个文件只能有一个名称
- 对用户而言,起名较为困难(很多名称被用了)
- 不能分组
2.双层目录
- 每个用户有自己的目录结构(用户文件目录,UFD)
- UFD具有类似的结构,但是只列出了单个用户的文件
- 用户目录本身必须根据需要加以创建和删除
- 当用户作业开始或用户登陆时,搜索系统的主文件目录(MFD)
- 通过用户名或账户可索引MFD,每个条目指向该用户的UFD
- 目录下的目录
- 路径名:
- 指定用户名和文件名,定义了在树中从根(MFD)到叶(指定文件)的路径
- 系统内的每个文件都有一个路径名,为了唯一地命名文件,用户必须知道所需文件的路径名
- 不同目录存在同名文件,为了区分引入了路径
- 从根目录开始到文件的路径
- 路径名=目录名+分隔符+文件名
- /user4/a、/user1/a
- 搜索路径:用于搜索给定名称的文件所用的目录序列
- 有效的将一个用户与另一个用户隔离
- 当用户需要完全独立时,隔离是个优点
- 当用户需要在某个任务上进行合作并且访问彼此的文件时,隔离是个缺点
- 优点:
- 不同用户可有相同文件名的文件
- 比单层目录提高检索效率(文件分布在多个用户目录中)
- 缺点:
- 同一用户无法分组
- 同一用户不能有相同文件名的文件
3.树型目录
- 有一个根目录,系统内的每个文件都有唯一的路径名
- 目录(或子目录)包括一组文件或子目录
- 目录只不过是一个文件,但是它是按特殊方式处理的
- 所有目录具有同样的内部格式
- 每个目录条目都有一位来将条目定义为文件(0)或子目录(1)
- 通过特殊的系统调用,可创建和删除目录
- 特点:
- 检索高效(子目录增多导致每个目录下文件减少)
- 可以分组,用户可以自由建立子目录
- 允许重名,不同子目录可以有同名文件
- 当前目录:工作目录
- cd/spell/mail/prog
- type list
- 当引用一个文件时,就搜索当前目录
- 为了改变目录,用户可使用系统调用以重新定义当前目录,该系统调用需要有一个目录名作为参数
- 每当用户需要,用户就可以改变当前目录
- 绝对路径:从根开始的路径名
- 相对路径:
- 从当前目录开始的路径名
- 提高检索效率
- 允许用户定义自己的子目录,可以使它按一定结构来组织文件
- 这种结构可能导致,不同的目录关联不同主题的文件
- 如何删除目录:
- 有的系统不能删除目录,除非它是空的
- 指令命令提供选项:当请求删除目录时,所有目录的文件和子目录也要删除
- 树型目录不能实现文件共享
- 采用树形目录系统,用户除了可以访问自己的文件外,还可以访问其他用户的文件
- 双层目录的扩展:2层->N层
4.图型目录
- 文件共享:不同目录中的文件指向同一个物理文件,也就是它们内容相同
- 图型目录可以实现文件共享
- 无环图目录
- 通用图目录(有环图)
- 无环图:有向边无环
- 公共子目录应该共享,一个共享的目录或文件可同时位于文件系统的两个(或多个)地方
- 允许目录共享子目录和文件,同一文件或子目录可出现在两个不同的目录中
- 需要避免重复遍历无环图的共享部分
- 通用图目录:
- 图中有环
- 需要避免多次搜索同一部分,设计不当的算法可能会无穷搜索环而从不终止
- 可以限制在搜索时访问目录的数量
- 通常需要使用垃圾收集方案,以确定何时最后引用已被删除并重新分配磁盘空间。用于磁盘文件系统的垃圾收集是极为费时的,因此很少使用
- 对于处理目录和链接的特殊情况,一个简单算法是在遍历目录时避开链接,这样,既避免了环,又没有其他开销
- 保证无环:
- 仅允许指向文件的链接,不允许指向子目录的链接
- 垃圾回收,发现环就消除
- 每当加入新链接时,使用环路检测算法判断是否正确
- 优化遍历目录算法,避免对环的重复搜索
5.文件共享
- 链接:实际上是另一文件或子目录的指针
- 两种共享文件方式:
- 符号链接(软链接)
- 硬链接(Hard Link):一个物理文件可以有几个文件名,但是只有一个FCB,每个文件名有自己的目录项,也就是inode,但共享一个FCB
- 硬链接:
- 一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,删除其中一个,对另外一个没有影响
- 每增加一个,inode节点上的链接数目增加一;每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块
- 文件和文件名是不同的东西,指令删除的只是这个文件名,而文件名对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收
- 通过禁止对目录的多重引用,可以维护无环图结构
- 符号链接:
- A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同同,A和B指向的是两个不同的inode,继而指向两块不同的数据块
- 但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)
- A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接
6.文件系统安装
- 要访问一个文件系统,必须先安装它
- 一个未安装的文件系统将被安装在一个安装点(mount point)上
作者:方知有
Motto: 热爱可抵岁月漫长
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
所有评论和私信都会在第一时间处理,如有问题或建议,请多多赐教!
支持博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!