1. 文件的属性
-
文件名,用户自定义的文件名,同一目录下不允许有重名文件
-
标识符,操作系统用于区分各个文件的一种内部名称
-
类型,文件的类型
-
位置,文件存放的路径(用户可见使用)、在外存中的地址(操作系统使用)
-
大小,文件的大小
-
保护信息,对文件进行保护的访问控制信息
-
结构
- 无结构文件,由一系列二进制或字符流组成
- 有结构文件
2. 操作系统提供的文件基本功能
- 创建文件(create系统调用)
- 删除文件(delete系统调用)
- 读文件(read系统调用)
- 写文件(write系统调用)
- 打开文件(open系统调用)
- 关闭文件(close系统调用)
3. 文件的逻辑结构
-
无结构文件
- 文件内部的数据就是一系列二进制流或字符流组成,又称“流式文件”,如:Windows操作系统中的.txt文件
-
有结构文件
-
由一组相似的记录组成,又称“记录式文件”,如:数据库表文件
-
每个记录又若干个数据项组成,每条记录有一个数据项可作为关键字(用于识别不同的记录)
-
根据每条记录的长度(占有的存储空间)是否相等,又可分为定长记录和可变长记录两种
-
逻辑结构
-
顺序文件
-
文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的
-
各个记录在物理上可以顺序存储或链式存储
-
串结构,记录之间的顺序与关键字无关
-
顺序结构,记录之间的顺序按关键字顺序排列
-
链式存储
- 无论是定长或者是可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找
-
顺序存储
-
可变长记录
- 无法实现随机存取,每次只能从第一个记录开始依次往后查找
-
定长记录
- 可实现随机存储,记录长度为L,则第i个记录存放的相对位置是i*L
- 采用串结构,无法快速找到某关键字的对应的记录
- 采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)
-
-
-
索引文件
- 建立一张索引表以加快文件的检索速度,每条记录对应一个索引项
- 索引表本身是定长记录的顺序文件,可以快速找到第i个记录对应的索引项
- 可将关键字作为索引号内容,若按关键字顺序排列,可以支持按照关键字折半查找
- 用于对信息处理的及时性要求比较高的场合
- 可以用不同的数据项建立多个索引表
-
索引顺序文件
- 索引文件和顺序文件思想的结合
- 建立一张索引表,一组记录对应一个索引表项
- 索引顺序文件的索引项不需要关键字顺序排列,可以提升新表项插入的速度
-
多级索引顺序文件
- 建立多级索引表,提高检索效率
-
-
4. 文件目录
-
文件控制块
- 目录文件中的一条记录就是一个“文件控制块(FCB)”
- FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项
- FCB中的最重要、最基本的是文件名、文件存放的物理地址
- FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)
-
目录结构
-
单级目录结构
- 整个系统中只建立一张目录表,每个文件占一个目录项
- 单级目录实现了“按名存取”,但是不允许文件重名
- 创建文件时,先检查目录表是否存在重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入到目录表中
- 不适用于多用户操作系统
-
两级目录结构
- 分主文件目录(MFD)和用户文件目录(UFD)
- 主文件目录记录用户名及相应用户文件目录的存放地址
- 用户文件目录由该用户的文件FCB组成
- 允许不同用户的文件重名
- 可以在目录上实现访问控制
- 用户不能对自己的文件进行自定义分类
-
多级目录结构
- 又称树形目录结构
- 用户访问某个文件时要用文件路径名标识文件,文件路径名时个字符串
- 各级目录之间用“/”隔开,从根目录出发的路径称为绝对路径
- 从当前目录出发称为“相对路径”,在Linux中,“.”表示当前目录
- 不便于实现文件的共享
-
无环图目录结构
- 树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图
- 可以方便地实现多个用户间的文件共享
- 可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)
- 设置每个共享节点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点请求时,只是删除该用户的FCB,并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点
- 共享文件不同于复制文件,在共享文件,由于各用户指向的是同一个文件,文件数据一旦被修改,所有用户都可以看到文件数据的变化
-
-
索引结点
- 文件控制块(FCB)的简化改进
- 除了文件名之后的所有信息都放到索引结点中,每个文件对应一个索引结点
- 目录项中只包含文件名、索引结点指针,每个目录项的长度大幅减小,磁盘块可以存储更多个目录项,检索文件时磁盘的I/O的次数就会减少
5. 文件的物理结构
- 磁盘中的存储单元会被分为“块/磁盘块/物理块”,很多操作系统中,磁盘块的大小与内存块、页面的大小相同,有利于内存与磁盘之间的数据交换
- 在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为一个个的文件“块”,文件的逻辑地址表示为(逻辑块号,块内地址)的形式
- 操作系统以块为单位为文件分配存储空间
- 用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射
6. 文件分配方式
-
连续分配
- 每个文件在磁盘中占用一组连续的块
- 文件目录中记录存放的起始块号和长度
- 操作系同可以直接算出逻辑块号对应的物理块号,连续分配支持顺序访问和直接访问(即随机访问)
- 连续分配的文件在顺序读/写时速度最快
- 物理上采用连续分配的文件不方便拓展
- 物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片,可以耗费很大的事件代价用紧凑来处理碎片
-
链接分配
-
采取离散分配的方式,可以为文件分配离散的磁盘块,可分为隐式链接和显式链接两种
-
隐式链接
- 文件目录中存储了起始块号和结束块号,或者增加一个字段来表示文件的长度
- 每个硬盘块中保存指向下一个盘块的指针,这些指针对用户时透明的
- 采用链式分配(隐式链接)方式,只支持顺序访问,不支持随机访问,查找效率低
- 每个磁盘块会耗费少量的空间存储指针
- 采用链式分配(隐式链接)方式,方便文件拓展,不会有碎片问题,外存利用率高
-
显式链接
- 文件目录中只存储文件的起始块号
- 把用于链接文件各物理块中的指针显式地存放在一张表中,即文件分配表(FAT)
- 一个磁盘仅设置一张FAT,启动时,将FAT读入内存,并常驻内存
- FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的
- 采用链式分配(显式链接)方式,支持顺序访问,也支持随机访问,块号转换不需要访问磁盘,直接访问内存,查找效率较快
- 采用链式分配(显式链接)方式,文件分配表会占用内存
-
-
-
索引分配
-
采取离散分配地方式,系统会为每个文件建立一张索引表
-
索引表记录了文件的各个逻辑块对应的物理块
-
索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块
-
文件目录存储索引块的块号,通过索引块可以找到对应的物理块,从而实现文件逻辑块号到物理块号的转换
-
支持随机访问,文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)
-
索引表需要占用一定的存储空间
-
文件太大,索引项不能使用一个硬盘块全量存入的解决方案
-
链接方案
- 使用指针把索引块链接起来,文件目录存储第一个索引块
- 磁盘I/O次数过多,查找效率低下,找第i号索引块,必须先读入0~i-1号索引块
-
多级索引
- 建立多层索引,是第一层索引块指向第二层索引块,文件目录存储顶级索引表
- 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块需要K+1次读盘操作
- 即便小文件,访问一个数据块依然需要K+1次读磁盘
-
混合索引
- 顶级索引表中包含直接地址索引(直接指向内存块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表),文件目录存储顶级索引表
- 对于小文件,访问一个数据块所需的读磁盘次数更少
-
-
7. 文件存储空间管理
-
存储空间的划分与初始化
- 存储空间的划分,将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
- 存储空间的初始化,将文件卷划分为目录区、文件区,目录区主要存放文件目录(FCB),文件区存放文件数据
-
存储空间管理
-
空闲表法
- 适用于“连续分配方式”
- 分配连续的存储空间,可采用首次适应、最佳适应、最坏适应的算法决定为文件分配区间
- 回收时需要注意表项的合并问题
-
空闲链表法
-
空闲盘块链
- 以盘块为单位组成一条空闲链,操作系统保存着链头、链尾指针
- 分配空间时,从链头开始依次进行盘块分配,并修改空闲链的链头指针
- 回收空间时,回收的盘块依次挂到链尾,并修改空闲链的链尾指针
-
空闲盘区链
- 以盘区为单位组成一条空闲链,操作系统保存着链头、链尾指针
- 分配空间,可采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到适合的空闲盘区分配给文件
- 回收空间时,回收区和空闲盘区相邻,则需要将回收区合并到空闲盘区中,若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到盘尾
-
-
位示图法
- 每个二进制位对应一个盘块
- 分配空间,顺序扫描位示图,找到位标识为空闲的连续或不连续的盘块;根据字号,位号算出对应的盘块号,将相应盘块分配给文件;将相应位设置为已分配标识
- 回收空间,根据回收的盘块号计算出对应的字号、位号;将相应位设为空闲标识
-
成组链接法
- UNIX采用的策略,适合大型文件系统
-
8. 文件的基本操作
-
创建文件
-
create系统调用
-
进行create系统调用,需要提供的主要参数
- 所需的外存空间大小
- 文件存放路径
- 文件名
-
操作系统处理create系统调用时,主体流程
- 在外存中找到文件所需的空间
- 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项
-
-
删除文件
-
delete系统调用
-
进行delete系统调用,需要提供的主要参数
- 文件存放路径
- 文件名
-
操作系统处理delete系统调用时,主体流程
- 从目录中找到文件名对应的目录项
- 根据目录项纪录的文件在外存的存放位置等信息,回收文件占用的磁盘块
- 从目录表中删除文件对应的目录项
-
-
打开文件
-
open系统调用
-
进行open系统调用,需要提供的主要参数
- 文件存放路径
- 文件名
- 要对文件的操作类型(如:r只读;rw读写等)
-
操作系统处理open系统调用时,主体流程
- 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项,检查用户是否有指定的操作权限
- 将目录项复制到内存中的“打开文件表”中,返回对应表目的索引号(也称“文件描述符”),之后用户使用打开文件表的编号来指明要操作的文件
-
打开文件表
- 每个进程有自己的打开文件表、系统中也有一张总的打开文件表
- 进程打开文件表中的特有属性,读写指针、访问权限(只读?读写?)
- 系统打开文件表中的特有属性,打开计数器(有多少个进程打开了多少该文件)
-
-
关闭文件
-
close系统调用
-
进行close系统调用
-
操作系统处理close系统调用时,主体流程
- 将进程的打开文件表相应表项删除
- 回收分配给该文件的内存空间等资源
- 系统打开文件表的打开计数器count减1,若conut=0,则删除对应表项
-
-
读文件
-
read系统调用
-
进行read系统调用,需要提供的主要参数
- 打开文件表的索引号
- 指明读入的数据量
- 指明读入的数据放在内存中的位置
-
操作系统处理close系统调用时,主体流程
- 从读指针指向外存中,将用户指定大小的数据读入用户指定的内存区域中
-
-
写文件
-
write系统调用
-
进行write系统调用,需要提供的主要参数
- 提供文件在打开文件表中的索引号
- 指明写入的数据量
- 指明写入的数据放在内存中的位置
-
操作系统处理write系统调用时,主体流程
- 从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存
-
9. 文件共享
-
操作系统为用户提供文件共享功能,可以让多个用户共享地使用同一个文件
-
基于索引结点的共享方式(硬链接)
- 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的目录项数
- 当链接计数变量count>0的时候,还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空
- 当链接计数变量count=0的时候,系统负责删除文件
-
基于符号链的共享方式(软链接)
- 通过创建Link类型的文件,记录文件存放路径
- 即使软链接指向共享文件已被删除,Link型文件依然存在,只是通过Link型文件中的路径区查找共享文件会失败
- 访问共享文件时要查询多级目录,会有多次磁盘I/O,访问速度相对硬链接会较慢
10. 文件保护
-
口令保护
- 口令存放在文件对应的FCB或索引结点中,用户访问校验的时候,会与FCB中存储的口令进行对比
- 保存口令的空间开销不多,验证口令的时间开销也很小
- 正确的“口令”存放在系统内部,不够安全
-
加密保护
- 通过加密算法对文件进行加密,在访问文件时,需要提供正确的“密码”才能对文件进行正确的解密
- 保密性强,不需要在系统中存储“密码”
- 编码/译码,或者说加密/解密要花费一定时间
-
访问控制
- 每个文件的FCB(或索引结点)增加一个访问控制列表(ACL),记录各个用户可以对该文件执行哪些操作
- 访问类型包含,读,写,执行,添加,删除,列表清单
- 精简的访问控制列表,简化访问控制列表,以“组”为单位,标记各“组”用户可以对文件执行哪些操作
- 实现灵活,可以实现复杂的文件保护功能
11. 文件系统的层次结构
-
层次排序(从上至下)
- 用户接口->文件目录系统->存储控制模块->逻辑文件系统与文件信息缓冲区->物理文件分配模块->辅助分配模块,设备管理模块
-
用户接口
- 文件系统需要向上层的用户提供一些简单易用的功能接口
- 用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)
-
文件目录系统
- 根据用户给出的文件路径找到相应的FCB或索引结点
- 所有与目录、目录项相关的管理工作都在本层完成,如:管理活跃的文件目录表、管理打开文件表等
-
存储控制模块
- 文件保护相关功能
-
逻辑文件系统与文件信息缓冲区
- 将记录号转换为对应的逻辑地址
-
物理文件分配模块
- 将上一层提供的文件逻辑地址转换为实际的物理地址
-
辅助分配模块
- 负责文件存储空间的管理,负责分配和回收存储空间
-
设备管理模块
- 直接与硬件交互,负责和硬件直接相关的一些管理工作,如:分配设备、分配设备缓冲区等
11. 总结
- 重点:文件的逻辑结构
- 重点:文件目录
- 重点:文件分配方式
- 重点:文件存储空间管理
- 重点:文件共享
- 请各位大佬发现错误,能指导菜鸟小弟
- 菜鸟也想努力进大厂,加油