导图社区 第四章 文件管理
这是一篇关于第四章 文件管理的思维导图,主要内容包括:文件存储空间管理,逻辑结构vs物理结构,文件的物理结构(文件分配方式),文件目录,文件的逻辑结构,初识文件管理。超级详细的王道资料,超级有条理。
编辑于2025-01-25 12:26:41第四章 文件管理
初识文件管理
os作为系统资源的管理者
提供的功能
处理机管理
存储器管理
文件管理
文件就是一组有意义的信息/数据集合
设备管理
目标
安全、高效
文件的属性
文件名
由创建文件的用户决定,主要是为了方便用户找到文件
同一目录下不允许有重名文件
标识符
一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称
类型
方便os为每种类型的文件设置一个默认的打开的应用程序
指明文件的类型
位置
文件存放的路径(让用户使用)
在外存中的地址(操作系统使用,对用户不可见)
大小
指明文件大小
创建时间、上次修改时间
文件所有者信息
保护信息
对文件进行保护的访问控制信息
文件内部组织(文件的逻辑结构)
文件
有结构文件/记录式文件
由一组相似的记录组成
记录是一组相关数据项的集合
数据项是文件系统中最基本的数据单位
有结构文件中,各个记录应该如何组织的问题
文件的逻辑结构
顺序存放
索引表来表示记录间的顺序
...
记录1
数据项1
数据项2
...
记录2
记录3
....
无结构文件/流式文件
由一系列二进制或字符流组成
文件之间组织(目录结构)
根目录
目录其实也是一种特殊的有结构文件
所谓的目录,其实就是我们平时说的文件夹
目录1
目录2
目录a
用户可以自己创建一层一层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序地组织起来了
目录b
目录c
普通文件a
普通文件b
目录3
普通文件1
普通文件2
os向上提供的基本功能
可用几个基本操作完成更复杂的操作
比如复制文件
先创建一个新的空文件
再把源文件读入内存
再将内存中的数据写到新文件中
创建文件(create系统调用)
eg点击新建后,图形化交互界面在背后调用了create系统调用
删除文件(delete系统调用)
eg点击删除之后,图形化交互界面在背后调用了delete系统调用,将文件从外存中删除
读文件(read系统调用)
将文件数据读入内存,才能让CPU处理
eg双击记事本后,记事本应用程序通过os提供的读文件功能,即read系统调用,将文件数据从外存读到内存,并且显示在屏幕上
写文件(write系统调用)
将更改过的文件写回外存
eg我们在记事本编辑文件内容,点击保存后,记事本应用程序通过os提供的写文件功能,即write系统调用,将文件数据从内存写回外存
打开文件(open系统调用)
读/写文件之前,需要打开文件
关闭文件(close系统调用)
读/写文件结束之后,需要关闭文件
文件如何存放在外存(文件的物理结构)
与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B). 每个存储单元对应一个物理地址
类似于内存分为一个个内存块,外存会分为一个个块/磁盘块/物理块。每个磁盘块大小相等,每块一般包含2的整数幂个地址
操作系统以块为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它在内存中依然占据1KB的磁盘块; 外存中的数据读入内存时候依然以块为单位
如果一个磁盘块不够分一个文件,那就给文件多分几个磁盘块,只不过这几个磁盘块可能是离散地存储在硬盘中
同样类似的是,文件的逻辑地址也可以分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转化为外存的物理地址(物理块号,块内地址)的形式,块内地址的位数取决于磁盘块的大小
标注
文件的逻辑地址通常是指 文件系统中的抽象表示,它表示的是文件内容在程序运行时被访问时的虚拟地址
os如何管理外存中的空闲块(存储空间的管理)
其他需要os实现的文件管理功能
文件共享
使多个用户可以共享一个文件
文件保护
如何保证不同的用户对文件有不同的操作权限
文件的逻辑结构
所谓的逻辑结构,就是指在用户看来,文件内部的数据应该是如何组织起来的。 而物理结构指的是在os看来,文件的数据是如何存放在外存的
类似于数据结构的逻辑结构和物理结构
线性表就是一种逻辑结构,在用户看来,线性表就是一组有先后关系的元素序列,如a,b,c,d,e
线性表这种逻辑结构可以用不同的物理结构实现,如顺序表/链表。顺序表的各个元素在逻辑上相邻,在物理上也相邻;而链表的各个元素在物理上可以是不相邻的。
顺序表可以实现随机访问,链表无法实现随机访问、
算法的具体实现与逻辑结构、物理结构都有关
文件也一样,文件操作的具体实现与文件逻辑结构、物理结构都有关
无结构文件/流式文件
文件内部的数据就是一系列二进制流或字符流组成
没有明显的结构特性
如windows操作系统的txt文件
有结构文件/记录式文件
特点
由一组相似的记录组成
每条记录又由若干个数据项组成
每条记录都有一个数据项可以作为关键字
根据每条记录的长度
定长记录
每条记录的长度都相同
各数据项都处在记录中相同的位置
具有相同的顺序和长度
可变长记录
数据项的长度不确定
有结构文件的逻辑结构
根据有结构文件的各条记录在逻辑上如何组织
顺序文件
一般来说,考试说的顺序文件指的是物理上顺序存储的顺序文件。
可见顺序文件的缺点是增加/删除一个记录比较困难(串结构则相对简单,反正不用按顺序插入)
为了减少I/O次数,os会维护一个日志记录一些修改记录,最后在间隔一段时间统一合并,可以减少增删改查带来的开销
表现
文件中的记录一个接一个地顺序排列(逻辑上)
记录
定长
可变长
需要显示地给出记录长度,假设用一字节表示记录长度
0
L0+1
...
LO+L1+L2+L3+...+LI-1+I
物理上
顺序存储
逻辑上相邻的记录物理上也相邻(类似于顺序表)
链式存储
逻辑上相邻的记录物理上不一定相邻(类似于链表)
按照记录的顺序与关键字的关系
串结构
无关
通常按照记录存入的时间决定记录的顺序
顺序结构
记录之间的顺序按照关键字顺序排列
可支持快速检索
分类
链式存储
无论是定长/可变长,都无法实现随机存储,每次只能从第一个记录开始往后依次找
顺序存储
可变长记录
无法实现随机存储,每次只能从第一个记录开始依次往后找
定长记录
可实现随机存取,记录长度为L,则第i各记录存放的相对位置为i*L
串结构
无法快速找到某关键字对应的记录
顺序结构
可以快速找到某关键字对应的记录(如折半查找)
快速检索
索引文件
思想
建立一张索引表以加快文件检索速度。
包括索引号+长度+指针(指向文件的记录)
索引表本身是定长记录的顺序文件,因此可以快速找到第i个记录对应的索引项
可将关键字作为索引号内容
如果按照关键字顺序排列,则还可以支持按照关键字折半查找
也可以用不同的数据项建立多个索引表
每条记录对应一个索引项
每当增加/删除一个记录的时候,需要对索引表进行修改,由于索引文件又很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合
文件中的记录在物理上可以离散的存放
缺点
每个记录对应一个索引表项,因此索引表可能会很大
比如说,文件中的每个记录平均只占8B,而每个索引项占32B,那么索引文件比文件内容大四倍,这样对存储空间的利用率就太低了
索引顺序文件
思想
索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但是不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项
先分组,每个分组就是一个顺序文件,分组内的记录不必按照关键字排序;
索引顺序文件的索引项也不需要按照关键字顺序排序,这样可以极大方便新表项的插入
检索效率分析
文件10000条记录
顺序文件从头开始顺序查找
平均5000个记录
索引顺序文件
将10000个记录分成100组,每组100个记录
则先按照顺序查找索引表找到分组,平均50次
找到分组后,再在分组中顺序查找记录,平均50次
50+50=100
缺点
如果记录多了,查找次数依然很多
多级索引顺序文件
示例
对于一个含106个记录的文件
先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表有10000个表项
再将10000个定长记录分组,每组100个
为其建立顶级索引表,故顶级索引表共有100个表项
这样算是二级索引哦!
50+50+50=150
tips
要为N个记录的文件建立K级索引,则最优分组时每组N1/(k+1)个
检索一个记录的平均查找次数是(N1/(K+1)/2)*(K+1)
文件目录
对用户
文件之间的组织结构清晰,易于查找
编程时候也可以很方便的用文件路径找到文件,用户可以很轻松地实现按名存取
文件控制块FCB(实现文件目录的关键数据结构)
目录文件本身就是一种有结构文件,由一条条记录组成。
每条记录对应一个放在该文件下的文件
当我们双击图片后,os会在这个目录表中找到关键字照片对应的目录项(也就是记录),然后在外存中将照片目录的信息读入内存,于是照片目录中的内容就可以显示出来了
含义
目录文件中的一条记录就是一个文件控制块(FCB)
FCB的有序集合就是目录文件,一个FCB就是一个文件目录项
要区分文件目录项和文件记录是不一样的东西,一个是文件外的,一个是文件内的
内容
FCB包含了文件的基本信息
文件名
物理地址
最重要、最基本
FCB实现了文件名和文件之间的映射,使得用户(用户程序)可以实现按名存取
逻辑结构
物理结构
存取控制信息
是否可读/可写
禁止访问的用户名单
使用信息
文件的建立时间、修改时间
需要对目录进行的操作
搜索
当用户要使用一个文件时候,系统要根据文件名搜索目录,找到该文件对应的目录项
创建文件
创建一个新文件时,需要在其所属的目录中新增一个目录项
删除文件
当删除一个文件时,需要在目录中删除相应的目录项
显示目录
用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
修改目录
某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如文件重命名)
目录结构
单级目录结构
早期os并不支持多级目录,整个系统中之建立一张目录表,每个文件占一个目录项
单级目录实现了按名存取,但是不允许文件重名
在创建文件时候,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中
显然,单级目录结构不适用于多用户操作系统
两级目录结构
早期的多用户操作系统,采用两级目录结构
主文件目录
记录用户名及相应用户文件目录的存放位置
用户文件目录
由该用户的文件FCB组成
两级目录结构允许不同用户的文件重名,也可以在目录上实现访问限制(检查此时登录的用户名是否匹配)
缺点
两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类
多级目录结构(树形目录结构)
常识
用户要访问某个文件时候要用文件路径名标识文件,文件路径名是个字符串。
各级目录之间用/隔开
从根目录出发的路径称为绝对路径
/照片/2015-08/自拍.jpg
系统根据绝对路径一层一层地找到下一级目录。
刚开始从外存中读入根目录的目录表;找到照片目录的存放位置后,从外存中读入对应的目录表。
再找到2015-08目录的存放位置,再从外存读入对应目录表
最后才找到文件自拍jpg的存放位置
整个过程需要三次I/O操作
从当前目录出发
.表示当前目录(在linux中)
./2015-08/自拍.jpg
从当前目录出发只需要查询内存中的照片目录表,就可以知道2015-08目录表的存放位置,从外存调入该目录,即可知道自拍.jpg存放的位置
整个过程只需要一次I/O操作
磁盘的I/O次数少了,提升了访问文件的效率
优点
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够有效的对文件进行管理和保护
缺点
不利于实现文件的共享
无环图目录结构
在树形目录结构的基础上,增加一些指向同一节点的有向边,使得整个目录成为一个有向无环图,可以更方便地实现多个用户间的文件共享
可以用不同的文件名指向同一个文件,甚至指向同一个目录(共享同一目录下的所有内容)
共享文件不同于复制文件,在共享文件中,由于个用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。复制的话就不行,因为只是内容相同的副本而已。
需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方共享该结点
用户提出删除结点的请求时,只是说出该用户的FCB,并使共享计数器减1,并不会直接删除该共享结点
只有共享计数器减为0时,才删除结点
索引结点(对文件控制块的优化)
提出原因
其实在查找各级目录的过程中,只需要用到文件名这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以考虑让目录表瘦身来提升效率
实现
将除了文件名之外的文件描述信息都放到索引结点中
目录表项就只保留文件名和索引结点指针
当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点记录了文件的各种信息,包括文件在外存中的位置,根据存放位置即可找到文件
存放在外存的索引结点
磁盘索引结点
放入内存后
内存索引结点
需要增加一些信息
文件是否被修改
此时有几个进程正在访问文件等
好处
假设磁盘块的大小是1KB,目录有640个目录项
不使用索引结点机制
假设一个FCB是64B,则每个盘块只能存放16个FCB,因此需要占用640/16=40个盘块。
按照文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)
使用索引结点机制
假如文件名占14B,索引结点指针占2B,则每个磁盘块可以存放64个目录项
那么按照文件名检索目录平均只要360/64=5个磁盘块,大大提高了文件检索速度
文件的物理结构(文件分配方式)
文件数据是怎么样存放在外存中
操作系统需要对磁盘
对非空闲磁盘块(存放了文件数据)
文件的物理结构/文件分配方式
对空闲磁盘块的管理
文件存储空间的管理
前提须知
类似于内存分页,磁盘中的存储单元也会被分为一个个"块/磁盘块/物理块"
很多操作系统中,磁盘块的大小与内存块、页面的大小相同
内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以”块“为单位进行的。即每次读入一块,每次写出一块
在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为一个一个的文件块,于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式
用户通过逻辑地址来操作自己的文件,os要负责实现从逻辑文件到物理地址的映射
分类
连续分配
要求
每个文件在磁盘上占有一组连续的块
os如何将(逻辑块号,块内地址)->(物理块号,块内地址)
只需要转换块号就行,块内地址保持不变
用户给出要访问的逻辑块号,os找到该文件对应的目录项(FCB),FCB要包含起始块号和长度(总共占用几个块)
检查用户提供的逻辑块号是否合法(逻辑块号>=长度就不合法)
物理块号 = 起始块号+逻辑块号
优点
支持顺序访问和直接访问(即随机访问)
连续分配的文件在顺序读写的时候速度最快
读取某个磁盘块的时候,需要移动磁头,访问的两个磁盘块相隔越远,移动磁头所需要的时间就越长
缺点
不方便文件拓展
存储空间利用率低,会产生磁盘碎片
可以用紧凑来处理碎片,但是需要耗费很大的时间代价
链接分配
若考试题目没有指明是显/隐式,默认是隐式
隐式链接
特点
PCB中记录了文件存放的起始块号和结束块号,当然,也可以增加一个字段来表示文件的长度
结束块号可以标识文件的结束
除了文件的最后一个磁盘块之外,每个磁盘块都会保存指向下一个盘块的指针,这些指针对用户是透明的
os如何将(逻辑块号,块内地址)->(物理块号,块内地址)
读入i号逻辑块,需要进行i+1次磁盘I/O
用户给出要访问的逻辑块号i,os找到该文件对应的目录项FCB
从目录项中找到起始块号(即逻辑上的0号块),将0号逻辑块读入内存
由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置......以此类推
优点
很方便文件拓展
不会有碎片问题,外存利用率高
缺点
只支持顺序访问,不支持随机访问,查找效率低
指向下一个盘块的指针也需要占用少量的存储空间
显式链接
特点
目录中只需记录文件的起始块号(可以直接用下一项是-1标识是结束块号)
把用于链接文件个物理块的指针显示地存放在一张表中,即文件分配表FAT
FAT
一个磁盘仅设置一个FAT
开机时,将FAT读入内存并且常驻内存
FAT的各个表项在物理上连续存储,且每一个表项长度相同,所以物理块号字段可以隐含
os如何将(逻辑块号,块内地址)->(物理块号,块内地址)
用户给出要访问的逻辑块号i,os找到该文件对应的目录项FCB
从目录项中找到起始块号,若i>0(i=0就直接是起始块号,不用继续找了),则查询内存中的FAT,往后找到第i个逻辑块对应的物理块号
因为FAT在内存中,所以逻辑块号转化为物理块号的过程中不用进行读磁盘操作
优点
很方便文件拓展
不会有碎片问题,外存利用率高
支持顺序访问和随机访问(想访问i号逻辑块,不用访问0-i-1号逻辑块),地址转换不用访问磁盘,因此文件的访问效率更高
缺点
文件分配表需要占用一定的存储空间
索引链接
思想
允许文件离散地分配在各个磁盘块中
文件数据存放的磁盘叫做数据块
系统会为每个文件都建立一张索引表,索引表记录了文件的各个逻辑块对应的物理块
注意区分:在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张
索引表存放在的磁盘块叫做索引块
索引表
逻辑块号+物理块号
可以用固定的长度表示物理块号,所以逻辑块号是可以隐含的
假设磁盘总容量为1TB=240B,磁盘块大小为1KB,则共有230个磁盘块,则可用30位二进制表示物理块号,所以4B就够了)
目录中需要记录文件的索引块是几号磁盘块
优点
索引分配方式可以支持随机访问
文件拓展也很容易实现
只需要给文件分配的是一个空闲块,并增加一个索引表项即可
缺点
索引表需要占用一定的存储空间
存在问题
若每个磁盘块1KB,一个索引表项4B,则一个磁盘块只能存放256个索引项,如果一个文件的大小超过了256块,那么一个磁盘块是转不下文件的整张索引表的,怎么办?
解决方案
链接方案
思想
如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放
FCB的索引块只需要记录第一个索引块号就可以
缺点
如果需要把很多个索引块链接起来。这时候要访问最后一个索引块,就要把前面的索引块都读入内存中,这非常低效
多层索引
思想
建立多层索引(类似多层页表)。使得第一层索引块指向第二层的索引块,当然还可根据文件的大小建立三四层,以此类推
计算核心
若采用多层索引,则各层索引表的大小不能超过一个磁盘块
计算示例
若采用两层索引,文件的最大长度?
256*256*1KB
可根据逻辑块号算出应该查找索引表中的哪个表项,eg1026号
1026/256=4
1026%256=2
因此可以先将一级索引表调入内存,查询四号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项可以知道1026号逻辑块存放的磁盘块号
计算总结
FCB中会存有指向顶级索引块的指针,因此可以根据FCB读入顶级索引块,每次读入下一级的索引块都需要一次读磁盘操作
要注意题目条件,顶级索引块是否已经进入内存
采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作
缺点
即使是小文件,访问一个数据块仍然需要K+1次读磁盘
混合索引
思想
多种索引分配方式的结合
例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表),还包含两级间接索引(指向两层索引表)
对于小文件,只需较少的读磁盘次数就可以访问目标数据块(一般计算机中小文件更多)
逻辑结构vs物理结构
逻辑结构
用户(文件创建者)的视角看到的亚子
在用户看来,整个文件占用连续的逻辑地址空间
文件内部信息的组织完全由用户自己决定,os并不关心
物理结构
由os决定文件采用什么物理结构存储
把用户的文件切分成一个一个的逻辑块,然后再映射到磁盘块
这里的逻辑块和用户看到的逻辑地址是不一样的
os负责将逻辑地址转变为(逻辑块号,块内偏移量)的形式,并负责实现逻辑块号到物理块号的映射
文件存储空间管理
对空闲块的管理
存储空间的划分
为磁盘分文件卷
将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
为文件卷分磁盘
有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷
存储空间的初始化
我们之前学过
硬盘级(物理层)
交换区
数据区
文件卷C
目录区
文件区
文件卷D
目录区
文件区
将各个文件卷划分为目录区和文件区
目录区
用于存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
文件区
用于存放文件数据
存储空间的管理
空闲表法
记录与组织
空闲盘块表
第一个空闲盘块号
空闲盘块数
如何分配磁盘块
连续分配方式
首次适应
最佳适应
最坏适应
如何回收磁盘块
四种合并情况
前后无空闲
前后都空闲
前空闲
后空闲
空闲链表法
空闲盘块链
记录与组织
以盘块为单位组成一条空闲链
os保存着链头、链尾的指针
空闲盘块中记录着下一个空闲盘块的指针
如何分配磁盘块
离散分配方式
从链头开始依次摘下
修改链头指针
为文件分配多个物理块可能多次
如何回收磁盘块
依次挂到链尾
修改链尾指针
空闲盘区链
记录与组织
以盘区为单位组成一条空闲链
os保存着链头、链尾的指针
空闲盘区中的第一个盘块内记录了盘区的长度、下一个盘区的指针
如何分配磁盘块
离散分配、连续分配
先连续
采用上面提到的首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小合适的空闲盘区
将不同盘区的盘块同时分给一个文件
为一个文化分配物理块的效率更高,一个区一个区地给
分配后要修改相应的链指针和盘区大小
如何回收磁盘块
回收区与某个空闲盘区相邻
合并
回收区不与任何一个空闲盘曲相邻
挂到链尾
位示图法
记录与组织
用连续的字来表示(字中的每一位对应一个盘块,1为已分配,0为未分配)
用(字号,位号)/(行号,列号)对应一个盘块
要注意盘块号、字号、位号是从0or1开始,公式会不一样
0
(i,j)盘块号 b = n*i+j
i=b/n
j=b%n
如何分配磁盘块
离散、连续分配
顺序扫描位示图,找到K个相邻or不相邻的0
根据字号、位号推出对应的盘块号,将对应的盘块分配给文件
将相应的位置置为1
如何回收磁盘块
根据回收的盘块号推出相应的字号、位号
将相应二进制位设为0
成组链接法(UNIX采用的方法)
提出原因
空闲表法和空闲链表法不适用于大型文件系统,链表过长
记录与组织
文件卷的目录区中专门用一个磁盘块作为"超级块"
当系统启动时候需要将超级块读入内存
并且要保证内存与外存中的超级块数据一致
超级块存放空闲盘块号栈,卷中的目录区、文件区划分信息
将空闲盘块分成若干组,每100块一个组,每一组(除了最后一个)的第一个空闲盘块作为索引块,都存放着下一组的空闲盘号和空闲盘块数,然后将这几个链接起来
第一组的专门存在内存中的空闲盘块号栈中
如何分配磁盘块
注意底是在上
检查第一个分组的块数是否足够,如果足够,分配,更改数据
当分到栈底时候,需要将栈底对应的数据复制到空闲盘块号栈上,然后再将其分配出去
如何回收磁盘块
还未到顶,则继续回收
当第一个分组已有100个,还需要回收一个的时候,将空闲盘块号栈的数据复制到新回收的块中,并修改块号栈的内容,让新回收的块成为第一个分组
文件的基本操作
创建文件(create系统调用)
参数
所需的外存空间大小(默认分配最小磁盘块)
文件存放路径
文件名
os
在外存中找到文件所需的空间(存储空间的管理章节)
根据文件存放路径的信息找到该目录对应的目录文件,在目录文件中创建该文件对应的目录项。
删除文件(delete系统调用)
参数
文件存放路径
文件名
os
根据文件路径找到对应的目录文件,从目录文件中找到文件名对应的目录项。
根据该目录项记录的文件在外存中的存放位置、文件大小等信息,回收文件占用的磁盘块。(存储空间的管理章节)
从目录表中删除文件的对应项
打开文件(open系统调用)
参数
文件存放路径
文件名
要对文件的操作类型
os
根据文件存放路径找到对应的目录项,从目录中找到文件名对应的目录项,并且检查该用户是否有指定的操作权限
将目录项复制到内存中的打开文件表中,并将对应表目的编号(用户进程的)返回给用户。之后用户使用打开文件表中的编号来指明要操作的文件。
打开文件表
系统的
整个系统只有一张
方便实现某些进行文件管理的功能
组成
编号
文件名
外存地址
。。。
打开计数器
记录此时有多少进程打开了这个文件
用户进程的
之后用户进程A再操作该文件就不用每次都重新查目录了,可以加快文件的访问速度
组成
编号
文件名
读写指针
记录了进程对文件的读写操作进行到的位置
访问权限
系统表索引号
关闭文件(close系统调用)
参数
文件描述符
os
将进程的打开文件表相应表项删除
回收分配给该文件的内存空间等资源
系统打开文件表的打开计时器减1,若count=0,则删除对应表项
读文件(read系统调用)
参数
文件描述符
读入数据大小
读入的数据要存放在内存的什么位置
os
在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
写文件(write系统调用)
参数
文件描述符
写出数据大小
写回外存的数据要放在内存中的什么位置
os
在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。
文件共享
&文件复制
硬链接
基于索引结点的共享方式
索引结点设置一个count变量,记录用于链接到本索引结点上的用户目录项数量
只有count=0才会删除结点
让两个目录项的索引结点指针指向同一个索引结点
软链接
基于符号链的共享方式
让索引结点中指向的文件为Link类型的文件,记录了想共享的文件的地址,类似于windows的快捷方式
即使软链接记录的共享文件已被删除,Link型文件仍然存在,只不过会查找失败
用软链接的方式要一层一层地查询多级文件(I/O),所以比直接用硬链接的慢
文件保护
口令保护
机制
为文件设置一个口令,用户访问的时候必须提供口令
口令一般存放在文件对应的FCB或者索引结点中。
用户访问文件前输入口令,由os进行比对
优点
保存口令的开销不大,验证口令的开销也不大
缺点
正确的口令存放在系统内部,不够安全
加密保护
机制
使用某个密码对文件进行加密,在访问文件时需要提供正确的密码才能对文件进行正确地解密
比如异或加密
优点
保密性强,不需要在系统存储密码
缺点
编码/译码(加密/解密)需要花费一点时间
访问控制
机制
增加访问控制列表,记录各用户能对文件执行哪些操作
改进
有的计算机可能有很多个用户,因此用精简的访问列表解决这个问题
以组为单位,标记各组用户的访问权限
系统需要管理组的信息
优点
更加灵活,精细划分权限
文件系统的层次结构
文件系统的全局结构(布局)
外存中
磁盘
原始磁盘
空空
物理格式化/低级格式化后
划分扇区,检测坏扇区,并用备用扇区替换坏扇区(对os是透明的,即os也不知道这个坏扇区换成了备用扇区)
磁盘分区后(分卷)
逻辑格式化后,完成文件系统初始化
灰色的有数据,白色的没有(上面)
内存中
过程(open为例)
open()根据路径一级一级读入目录
会加入缓存
找到目标文件的FCB,复制到系统打开文件表
在进程打开文件表中新建一个条目,并且返回文件描述符
用户通过文件描述符找到系统打开文件表索引,找到目录项,通过FCB找到文件并且读写
虚拟文件系统&文件系统挂载
虚拟文件系统VFS
向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
VFS要求下层的文件系统必须实现某些规定的函数功能。
每打开一个文件,VFS就在主存中新建一个vnode ,统一存储文件信息,并且有一个函数功能指针,指向该文件所在系统实现的函数
vnode只存在主存中&inode既存在主存中,又存在外存中
文件系统挂载/(安装/转载)
在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息
新挂载的文件系统,要向VFS提供一个函数地址列表
将新文件系统加到挂载点,也就是将新文件系统挂载在某个父目录下