文章目录
第四章 文件管理
00-文件管理知识框架
-
文件属性
- 右键属性
- 文件名
- 标识符
- 类型
- 位置(用户用的存放路径)(外存存放的地址)
- 大小
- 创建时间、上次修改时间
- 文件所有者信息
- 保护信息:不同分组的用户不能访问,儿子的用户以后不能访问我的游戏
-
文件内部数据组织形式
- 无结构文件——由一系列二进制或者字符流组成
- 有结构文件——记录——数据项
-
文件之间怎么组织起来
- 树状目录(特殊的有结构文件)
-
OS提供哪些功能能让用户、应用程序使用文件
- create系统调用
- read系统调用
- write系统调用
- delete系统调用
- open系统调用
- close系统调用
- 复制的实现——> create - read -write
-
文件的数据怎么存放在外存上
- 外存也是存储单元组成,叫做磁盘块
-
文件共享————文件保护怎么做到?
01-文件的逻辑结构
1.1无结构文件
无结构文件——由一系列二进制或者字符流组成
1.2有结构文件
由一组相似的记录组成,又称“记录式文件”。每条记录有若干个数据项组成。如:数据库表文件。
一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)
可分为【定长记录】【可变长记录】
1.3顺序文件
文件中的记录一个一个的顺序排列,记录可以是定长的或变长的。各个记录在物理上可以顺序存储或链式存储
- 串结构:记录之间的顺序与关键字无关**(按照存入时间的先后顺序)**
- 顺序结构:记录之间的顺序按关键字顺序排列
链式存储不论定长还是可变长记录,都无法直接计算出某个元素在物理上的存放地址**(无法随机存取)**
顺序存储的可变长记录文件 也 都无法直接计算出某个元素在物理上的存放地址**(无法随机存取)**
顺序存储的定长记录文件****可实现随机存取,记录为L,则第i个记录存放的相对位置是 i*L
但是顺序存储的定长记录文件采用串结构无法快速找到关键字对应的记录(因为按照存入时间排序)
采用顺序结构可以快速找到关键字对应的记录(如折半查找)
1-4索引文件
因为可变长记录文件无法快速索引
- 建立一张索引表【索引号】【长度】【指针】
- 每条记录对应一个索引表项
- 索引表本身是定长记录的顺序文件
- 文件中的这些记录可以在物理上离散存放
- 将关键字作为索引号,按照关键字顺序排列就能支持关键字折半查找
- 可以根据不同数据项建立多个索引表
1-5索引顺序文件
索引表的表项可能比文件的某些记录还要大。
因此大家提出了索引顺序文件
- 一组记录对应一个索引表项,索引表项中只存地址,占用的很少,索引到一组记录之后再顺序查找,节省了很多效率
可以使用多级索引顺序文件
02-文件目录
2.1文件控制块(FCB)
linux ls-l出来的那个样子
- 由记录组成,有**文件名、**类型(目录or文件类型)、存取权限、、、、物理位置(外存)
- FCB实现了文件名和文件之间的映射【按名存取】(比如java IO流中只需要指定文件路径和文件名)
2.2 需要对文件目录进行哪些操作
- 搜索:用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
- 创建文件增加目录项
- 删除目录:删除目录项
- 显示目录:显示目录的所有文件和相应属性
- 修改目录:修改某个属性
2.3 早期单级目录结构
不允许文件重名
2-4早期两级目录结构
- 主文件目录
- 用户文件目录
允许不同用户文件重名以及可以进行访问权限控制
2-5多级目录结构(树型目录结构)
每个目录下面都可以有下一级目录以及文件
有问题就是如果多级目录,访问一级目录就需要在外存查询一次目录表
2-6设置当前目录
获取到当前目录之后就可以直接查找当前目录的目录表
树形目录结构不利于实现文件的共享
2-7 有向无环图目录结构
可以用不同的文件名指向同一个文件甚至可以指向一个目录
为了方便删除,为每一个文件设置一个共享计数器,有人删除他就让共享计数器减一,如果当前共享计数器为0就删除
2-8 索引节点(FCB的改进)
其实查找各级目录只需要文件名,所以可以把目录表瘦身
索引节点用于存储目录表除了文件名以外的所有信息,目录表中只需要多加一个索引节点目录项
03-文件的物理结构(上)(非空闲)
-
对非空闲磁盘块管理
-
对空闲磁盘块的管理
磁盘块
- 磁盘的存储单元被分为一个个磁盘块
- 很多操作系统中磁盘块和内存块大小相同
- 文件的逻辑地址也可以表示为(逻辑块号,块内地址)
- 操作系统要把这个逻辑块号映射到物理地址
3.1连续分配
- 连续分配方式要求每个文件在磁盘上占有一组连续的块
- 物理块号=起始块号+逻辑块号
- 需要检验逻辑块号是否合法
- 磁头移动距离短时间快,顺序读写速度最快
缺点 -
- 文件修改的时候,大小不变的时候,需要整体迁移,开销很大
- 存储空间利用率低,会产生难以利用的磁盘碎片,紧凑处理会花费巨大的时间代价
3.2链接分配
可以离散分配
- 隐式链接(题目链接分配默认)
- 目录项中需要在FCB中记录起始块号和结束块号
- 除了最后一个磁盘块以外所有磁盘块都保存指向下一个盘块的指针,这些指针对用户是透明的(不可见)
- 实际运行中
- 通过起始地址的指针不断获得新的磁盘块,直到遇见结束块,
- 优点:利于文件扩展,没有碎片问题,外存利用率高
- 缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针需要耗费少量的存储空间
- 显示链接
- FAT表,把连接文件各个物理块的指针显式的存放在一张表中【物理块号】【下一块】-1用来表示文件结尾
- 整个外存只需要一张FAT表,开机就读入内存并且常驻内存,物理块号是隐含的
- 优点:支持随机访问,地址转换不用访问外存,文件访问效率高,也利于文件拓展,也没有碎片问题
- 缺点:文件分配表需要占用内存
04-文件的物理结构(下)
4.1索引分配
可以离散分配
系统会为每个文件建立一张索引表——记录文件各个逻辑块对应的物理块
索引表存放的磁盘块叫做索引块,文件数据存放的磁盘块称为数据块
逻辑块号也隐含
目录表中需要记录文件的索引块是几号磁盘块
支持随机访问
文件磁盘块太多一个磁盘块不够放
-
链接方案:多个索引块逐个链接起来,但是这样的话如果链接的索引块特别多,靠后面的索引块就需要从头开始沿着链接找很久
-
多层索引:
两个重点算法:
算文件的最大长度
-
先算出一个索引表项占大小,
-
因为一个索引表大小不能超过磁盘块大小,可算出一个索引表有多少索引表项
-
然后算出最底层一共有多少索引表项,乘以磁盘块大小得出文件的最大长度
(索引到的所有磁盘块,不包含负责索引的磁盘块比如一级索引表)
根据逻辑块号和多级索引表求磁盘块号
-
逻辑块号 计算机除 顶级索引表的索引项数量可以找到是第几个索引项存放下一级索引表
-
余数就是下一级索引表中存放目标信息的索引表项
(重复以上过程知道找到数据项,每次都读一次外存,最后找到数据项再加一次)
所以访问K层索引结构稀少访问K+1
问过分了
- 混合索引:
- 顶级索引表中既包含直接地址索引(指向数据块),又指向下一级索引表(最底层表),又指向向下一级索引表(多级表)
- 算最大文件长度(算出一共多少磁盘块就可以)
05-逻辑结构VS物理结构
这两玩意一点关系没有
逻辑结构是用户视角的,有相应的 - 顺序文件,索引文件,索引顺序文件,
物理结构是操作系统做的事 ,有相应的;连续分配,链接分配,索引分配,但是和用户没关系,他负责通过逻辑地址获得数据-
反正就是硬件那里无论用什么方法,给你的感觉都是一大片存储空间,你自己随便造
06-文件存储空间管理(空闲)
- 用什么方式记录、阻止空闲块
- 如何分配磁盘块
- 如何回收磁盘块
6.1存储空间的划分和初始化
- 划分成文件卷,然后每个文件卷划分成目录区和文件区
- 目录区存FCB和用于磁盘存储空间管理的信息
- 有的系统支持多个物理磁盘组成一个文件卷
6.2 存储空间管理——空闲表法
【第一个空闲盘块号】【空闲盘块数】
(适用于文件的物理结构是连续分配的)
分配时同样分为首次适应,最佳适应,最坏适应算法来决定
回收的时候也要合并
6.3存储空间管理——空闲链表法
-
空闲盘块链
- 盘块为单位,每个盘块中存有指向下一个盘块的指针
-
空闲盘区链
- 盘区是指连续的盘块可以成为盘区
- 空闲盘区中的第一个盘块记录了盘区的长度和下一个盘区的指针
-
空闲盘块链分配和回收
- 操作系统保存链头链尾指针,需要分配就从链头向下摘,结束后改变链头指针
- 需要回收就接在链尾,结束后改变链尾指针
-
空闲盘区链分配和回收
- 分配时根据算法规则(最佳适应,首次适应之类)分配,如果没有足够的也可以分配多个
- 回收时注意和相邻的空闲盘区的合并
6.4存储空间管理——位示图法
每个二进制位对应一个盘块,0代表空闲,1代表已分配,
位示图一般用连续的字表示,比如字长为16,那么表示盘块号12就是(0,12) 表示盘块号33就是(2,1)
要注意这里盘块号位号字号都是0开始的情况
6.5存储空间管理——成组链接法(UNIX系统使用)
因为空闲表可能过大。
文件卷的目录区有一个磁盘块叫做超级块,系统启动需要把超级块读入内存,并且要保证内存与外存中的超级块数据一致。
-
超级块
- 顶部第一个盘块记录下一组空闲盘块的数量跟在后面的盘块分别记录下一组空闲盘块号分别是多少
- 被超级块记录的下一组空闲盘块中,顶部的那一个盘块还是用于记录其链接的再下一组盘块的盘块数量跟在后面的盘块分别记录下一组空闲盘块号分别是多少然后才是超级块中注明磁盘块的的空闲块们
- 后面还是以此类推,直到倒数第二组,因为他的下一组不用索引再下一组了。所以他需要提示下一组,将第一个下一组的空闲盘块号标注为-1,这样下一组空闲盘块号的第一位就不用担任索引任务
-
分配回收
- 分配时查找第一个超级块指向的那组空闲盘块号,看能不能满足,满足的话要把超级块里面映射的被满足的块给清空了,相应的减少超级快中的数量,如果对应的这组空闲盘块号满了,就把这组空闲盘块号从链接中去除掉,去除之前要把自己链接下一组的信息给超级块,刚好用来代替自己。
- 回收时如果回收的时候第一组空闲盘块号没满就把他插入到第一组里面,然后在超级块那里做修改,
- 如果满了的话我们就增加一组空闲盘块号,然后把超级块的内容拿过来,让超级盘块号指向这个新的分组
07-文件的基本操作
-
创建文件create系统调用
- 参数(需要的外存空间大小,文件存放路径,文件名)
- 操作系统做的事
- 1.在外存中找到文件需要的空间
- 2.找到对应的目录表创建文件对应的目录项
-
删除文件delete系统调用
- 参数(文件存放路径、文件名)
- 操作系统做的事
- 1.根据文件存放路径找到对应目录文件,从目录表中找到文件名对应的目录项
- 2.根据目录项记录的文件在外存的存放位置、文件大小等信息,回收磁盘块
- 3.删除对应的目录项
-
打开文件open系统调用
- 参数(文件路径、文件名、操作类型(读写))——r只读 rw读写
- 操作系统做的事
- 1.找到对应目录项,检查权限
- 2.将目录项复制到内存的打开文件表中
- 3.将打开文件表的索引号返回给用户(打开文件不会把文件数据直接读入内存)(索引号也成文件描述符)
-
**注意:**打开文件表分为
- **系统打开文件表:**整个系统就一张,记录所有文件被某个进程使用的信息,
- 例如被哪些进程打开计数、统筹安排
- 用户进程的打开文件表:进程自己打开的文件
- 【文件名】【读写指针(读写操作的当前位置)】【(声明)访问权限】
- 进程打开表中有一项是【系统表索引号】指向系统打开文件表
- 系统打开文件表有一个【打开计数器】来展现这个文件是否被某个进程使用,(删除,更改,时是否使用中)
- **系统打开文件表:**整个系统就一张,记录所有文件被某个进程使用的信息,
-
关闭文件close系统调用
- 进程的打开文件表项删除
- 回收资源
- 系统打开文件表的打开计数器减一。count==0则删除表项
-
读文件read系统调用
- open系统调用
-
写文件write系统调用
- 参数(哪个文件、写出多少数据、写回外存的数据放在内存的什么位置)
08-文件共享
8.1 基于索引结点的共享方式(硬链接)
之前提到为了简化目录表,提高索引效率把除了文件名以外的信息(文件物理地址等)全部放在了索引节点(2.8)里
这下好了,如果有共享需求就让别人在索引节点的位置也添加这个指向这个索引节点的指针,但是索引结点自身需要添加一个count计数器来计算索引节点当前被连接的目录项数量,在其中一个目录项被删除的时候,当count==0才删除这个索引结点
8.2基于符号链的共享方式(软链接)
索引节点指向一个新的link类型文件,link文件中记录了想要链接的文件,类似于快捷方式
删除时不会考虑软链接的链接
09-文件保护
9.1口令保护
为文件设置口令(FCB里面),用户请求访问该文件时必须提供口令
优点:保存口令的空间小,验证时间小
缺点:不够安全
9.2加密保护
比如异或加密
优点:相对安全
缺点:加密解密需要花费一定时间
9.3访问控制
增加访问控制表ACL——记录了各个用户被允许对文件执行哪些操作(r 、w、run、add、delete、列表清单)
但是关系可能会很混乱,
所以用用户组来控制,给每个组一定的权限
比如分为系统管理员,文件主,文件主的伙伴,其他用户
10-文件系统的层次结构(复习用)
-
用户/应用程序
-
用户接口(07-文件的基本操作)
系统调用
-
文件目录系统((02-文件目录)
根据用户给的文件路径,找到对应的FCB或者索引节点。所有和目录、目录项相关的管理工作
-
存取控制模块(09-文件保护)
文件保护,访问权限
-
逻辑文件系统and文件信息缓冲区(01-文件的逻辑结构)
前者:记录号转换成逻辑地址
后者:(索引寻记录的文件结构1-4)用于调入索引表
-
物理文件系统(03-文件的物理结构)
逻辑地址转物理地址
-
辅助分配模块(06-文件的存储空间管理)
分配和回收物理空间
-
设备管理模块
直接和硬件交互,启动释放设备,磁盘调度
- 设备
-
-
-
-
-
-
记忆方法:用户要删除 D:/工作目录/学生信息.xlsx最后一百条记录
-
- 用户需要通过操作系统提供的接口发出上述请求——用户接口
- 操作系统一层一层找到目录项——文件目录系统
- 操作系统验证用户是否对这个文件有他请求的权限——问存取控制模块
- 根据用户提供的记录号得到逻辑地址——逻辑文件系统与文件信息缓冲区
- 知道了目标记录对应的逻辑地址之后,还需要转换成实际的物理地址——物理文件系统
- 对磁盘发出请求——设备管理程序模块
- 删除之后回收空闲盘块,——服务分配模块
11-文件系统实例
实例:某个操作系统文件管理
环境:
-
- 文件的物理结构索引分配
- 文件目录的实现——inode结点
- 空闲分区管理——位示图
-
磁盘块分配
-
0号块位示图用来表示所有磁盘块是否被占用
-
1号磁盘块用来储存所有inode结点信息,对应每一个inode结点【类型】【所有占用的磁盘块号】
-
2号块根目录**【文件名】【inode结点】**
- 所以根目录自然占用一号磁盘块中的第一次个**【一号inode结点】****【目录】【2】**
-
综上所述,完成环境搭建,位示图中012号都应标注为已占用的**【1】**
-
操作及变化
-
-
在根目录中新建一个“唐诗.txt”,文件占用两块磁盘块
-
变化
根目录 新增项**【唐诗.txt】【2号inode结点】**)
【2号inode结点】【txt】【3,4】
位示图显示3,4号标注为已占用的**【1】**
3,4号磁盘块写入唐诗.txt
-
-
-
-
在根目录创建子目录 “学习资料”(目录占用一个磁盘块)
-
变化
根目录新增项**【学习资料】【3号inode结点】**
【3号inode结点】【目录】【5】
位示图显示5号标注为已占用的【1】
5号磁盘块以后就是学习资料目录**【文件名】【inode节点】**
-
-
-
-
在学习资料目录下创建一个文件 “ 资料.avi ”,10个磁盘块
-
变化
学习资料目录新增项**【资料.avi】【4号inode结点】**
【4号inode结点】【avi】【6,7,8,9,10,11,12,13,14,15,】
位示图标注6、7、8、9、10、11、12、13、14、15位已占用的【1】
6、7、8——15号磁盘块被占用
-
-
-
混合索引
-
**注意:**每一个inode结点实际上包含一个索引表,n个【直接索引信息】,还有间接索引表。
-
例如如上的第三问在混合索引表(令直接索引有三个)的使用下:
-
- 在学习资料目录下创建一个文件 “ 资料.avi ”,10个磁盘块
-
变化
学习资料目录新增项**【资料.avi】【4号inode结点】**
【4号inode结点】【avi】【直接索引:6,7,8】还剩七个磁盘块,一级间接索引【9】
位示图标注6、7、8、9位为【1】
6、7、8磁盘块放入“资料.avi”的前三个逻辑块 ,
9磁盘块放入一级索引表【逻辑块号】【物理块号】
注意,这里的逻辑块号是这个文件的第一个逻辑块号为0开始算
所以9号磁盘块一级索引表存入
【逻辑块号】【物理块号】
【3】【10】
【4】【11】
【5】【12】
………………
【9】【16】
根据这个一级索引表我们知道10——16磁盘块将填入“资料.avi”的后七个逻辑块
位示图做相关改变
-
系统打开文件过程举例
open(“/学习资料/资料.avi”);
操作系统检查1号inode结点信息(一号磁盘块中),找到根目录在二号磁盘块
读入2号磁盘块,可知学习资料的目录文件的inode编号为3
检查3号inode信息,可知"学习资料"目录文件存放在5号磁盘块
读入5号磁盘块可知资料.avi文件的inode编号为4
操作系统把4号inode信息读入内存
read(资料.avi,2号逻辑块)
操作系统根据4号inode索引表保存的2号逻辑块为8号磁盘块读入
read(资料.avi,7号逻辑块)
操作系统根据4号inode索引表找到 我们需要查找一级间接索引:【9号物理块】
读入9号物理块
就知道七号逻辑块的磁盘块号为14
12-磁盘的结构
磁盘、磁道、扇区
一圈一圈的划分磁盘,每一圈就是一个磁道。
把圈分成一个一个扇区,一个扇区就是一个磁盘块
盘面,柱面
盘面是多个立体放置的,盘面中相对位置和相同的磁道组成柱面
所以可以用**【柱面号】【盘面号】【扇区号】来定位任意一个【磁盘块】**
13-磁盘调度算法
13.1 一次磁盘读写操作需要的时间和影响因素
①寻找(道)时间(启动磁头臂,移动磁头)——————磁盘调度算法
②延迟时间(旋转磁盘定位)—————————————磁盘转速
③传输时间(从磁盘读出或想磁盘写入)————————磁盘转速
13.2 操作系统改变寻道时间的调度算法
磁头移动数量是相对的,
比如99到1就是98,
是随着时间动态变化的,
可以算出一段时间内平均每次移动多少个磁道
来评价调度算法速度
-
先来先服务FCFS
- 先来先服务
- 优&&缺点:公平&&如果比较分散性能就很差
-
最短寻找时间优先SSTF
- 等待队列最近的先服务
- 优&&缺点:时间短&&可能产生饥饿
-
扫描算法(SCAN)电梯算法
- 磁头移动到最外面才能向内移动,磁头移动到最内侧才能向外移动
- 优&&缺点:性能不错,不会饥饿&&①****只有到了最边上才会回头,应该是遇到这个方向最值处就回头
- 缺点:②*对各个位置访问速度不平均,靠边上频率集中
-
LOOK调度算法
- 改进SCAN算法①缺点,边移动边观察,到了最边上的请求就掉头
-
C-SCAN循环扫描算法
- 改进了响应频率不均②缺点,只有磁头朝内或朝外的时候才处理请求,
- 返回时直接快速移动至起始端不处理任何请求
- 优点:对各个位置磁道访问时间更平均
- 缺点:只有到了最边上才会回头,应该是遇到这个方向最值处就回头
-
C-LOOK调度算法
- 改进的C-SCAN算法,边移动边观察,到了最边上的请求就掉头
14-减少磁盘延迟的方法
-
交替编号(同一盘面)
-
错位命名(不同盘面)
-
【柱面号】【盘面号】【扇区号】柱面号在前不需要移动磁头臂就可以更换一个坐标在遍历
- 扇区号通过盘面转动改变,盘面号通过不同磁头臂通电改变,柱面号需要移动磁头臂(花费时间最长)
- 所以以柱面为最高级单位时,大量的信息存储在不同的盘面和扇区,在获得信息时很可能就不用移动磁头臂
- 扇区号通过盘面转动改变,盘面号通过不同磁头臂通电改变,柱面号需要移动磁头臂(花费时间最长)
15-磁盘的管理
磁盘初始化
-
低级格式化(物理格式化)把磁道划分成扇区
一个扇区可以分为【头】,【数据区域如512B】、【尾】三个部分组成
管理扇区的数据结构放在头尾两部分(如扇区校验码,奇偶校验,CRC循环冗余校验)
-
磁盘分区:分的是柱面,
-
逻辑格式化:详见11-文件系统实例-环境
引导块
- ROM中的自举程序【初始化程序】
现在的ROM只存放很小的”自举装入程序“,这个自举程序会找到磁盘上的引导块
完整的自举程序在磁盘的引导块(/启动分区)上,开机会被ROM中的初始化程序读入内存,完成初始化
拥有启动分区的磁盘叫做启动磁盘或者系统磁盘(C盘)
坏块的管理
操作系统可以
- 逻辑格式化的时候,检查坏块,标明哪些扇区是坏扇区
- 比如:在FAT上面标注
硬件本身也可以留一点备用扇区,磁盘内部硬件在维护一个坏块链表,

1438

被折叠的 条评论
为什么被折叠?



