目录
1.文件系统基础
1.1.文件系统的概念
1.1.1.文件的属性
1.1.2.文件内部的组织形式(文件的逻辑结构)
1.1.3.文件之间的组织形式
1.1.4.操作系统提供的功能
1.1.5.文件在外存的存储方式(文件的物理结构)
1.2.文件的逻辑结构(面向用户,编程实现,与操作系统无关)
1.2.1.顺序文件
1.2.2.索引文件
1.2.3.索引顺序文件
1.2.4.多级索引顺序文件
1.3.文件的物理结构(面向操作系统,底层实现,与用户无关)
1.3.1.连续分配
1.3.2.链接分配
1.3.3.索引分配
1.4.文件的基本操作
1.5.文件保护
2.目录
2.1.文件目录
2.1.1.单级目录结构
2.1.2.两级目录结构
2.1.3.多级目录结构(树形目录结构)
2.1.4.无环图目录结构
2.1.5.索引结点
2.2.文件共享
2.2.1.基于索引结点的共享方式(硬链接)
2.2.2.基于符号链的共享方式(软链接)
3.文件系统
3.1.文件系统结构
3.2.文件系统的全局结构
3.3.虚拟文件系统
3.3.1.虚拟文件系统的基本概念
3.3.2.文件系统挂载
文件具有如下的属性:
①文件名(面向用户):由用户决定一个文件的名字。同一目录下不允许有重名文件(用户根据文件名区分不同文件)
②标识符(面向系统):一个系统内各文件的标识符唯一(操作系统根据标识符区别不同文件)
可能有一种情况:C判和D盘中的存在某两个文件名相同的且类型相同的文件,这时候如果仅凭文件名操作系统无法区分这两个文件,因此,操作系统需要通过标识符区分不同文件
③类型:指明文件类型,操作系统可以根据类型的不同选择不同的软件将其打开(例如:pdf、exe、word等等)
④位置:文件的存放路径(面向用户),文件在外存中的地址(面向系统)
⑤大小:文件的具体大小
⑥保护信息:对文件进行保护的访问控制信息(操作系统对不同的用户进行分组,不同用户对不同文件的权限不同,例如:读/写)
⑦还有其他属性
无结构文件:文件内部不再划分记录,没有明显的结构特性
1.创建文件(create系统调用):创建新文件时,操作系统调用了create系统调用
2.读文件(read系统调用):例如打开.txt文件,需要经历以下操作
①操作系统默认打开.txt文件对应的应用程序记事本
②记事本通过操作系统提供的read系统调用将.txt文件从外存调入内存
3.写文件(write系统调用):例如将保存经过编辑的.txt文件,记事本通过操作系统提供的write系统调用将数据从内存写回外存(在此之前只是修改.txt文件在内存中的副本的数据)
4.删除文件(delete系统调用):删除文件时,操作系统调用了delete系统调用
5.打开文件(open系统调用):读/写文件开始前,操作系统文件需要调用open系统调用
6.关闭文件(close系统调用):读/写文件结束后,操作系统文件需要调用close系统调用
1.外存由若干存储单元组成,一个存储单元对应一个物理地址(与内存相同)
2.外存被分为一个个相同大小的物理块,操作系统需要将逻辑地址转换为物理地址,即物理块号,块内地址(与内存相同)
3.即使文件很小,依然占用一整个物理块(如:文件为1B,物理块为1KB,该文件需要占用1KB)
4.外存调入内存时,以块为单位
有结构文件分为:
①定长记录:每条记录的长度相同(所占用的空间相同)
②可变长记录:每条记录的长度不确定
1.可变长文件都不能实现随机存储:长度没有规律性
2.定长文件的顺序存储可以实现随机存储,在此基础上若采用顺序结构(按关键字排序),则可以实现快速检索(根据关键字快速找到对应记录)
3.顺序结构增加/删除一个记录比较困难(参考顺序表,需要进行大量移动),而串结构相对容易
1.每个文件对应一个索引表,索引表项和记录一一对应
2.记录离散存放,索引表项连续存放
3.每个索引表项大小相等
1.通过一组记录对应一个索引表项的方式解决索引文件占用空间过大的问题(索引文件中,记录和索引表项一一对应,如果每条记录的大小远小于每条索引表项的大小,则空间利用率大大降低)
2.索引顺序文件是定长结构(每条索引项大小相同)的串记录(不按照关键字排序)的顺序文件(逻辑上相邻)
进一步提高检索效率
1.磁盘块的大小和内存块、页面大小相同:方便外存和内存进行数据交换(以块为单位进行)
2.文件的逻辑地址可以表示为(逻辑块号,块内地址)。类似于进程的逻辑地址可以表示为(页号,页内地址)
3.操作系统为文件分配存储空间是以块为单位
4.用户使用逻辑地址操作文件,操作系统负责将逻辑地址转换为物理地址
5.顺序访问:访问文件的某个块需要从该文件的起始块按顺序访问到该块
直接访问:与顺序访问相对,可以直接对文件的某个块进行访问,不需要从第一个块开始
1.逻辑上相邻的块物理上也相邻,并且保持这些块的相对顺序
2.操作系统通过目录项(FCB)中记录的起始块号和长度进行逻辑地址和物理地址的转换:物理块号 = 起始块号 + 逻辑块号(块内地址不需要转换)(需要检查是否逻辑块号是否合法,即逻辑块号是否大于等于长度)
3.优点:
①支持顺序访问和直接访问
②连续分配的文件在顺序读/写时速度最快:磁盘的访问是基于磁头移动的,连续 分配即它们所占用的磁盘块物理上是相邻的,即在读/写时磁头所需移动距离最短
4.缺点:
①不方便扩展:若某个文件需要进行扩展,而它所占用的磁盘块紧挨着的若干个磁盘块都被其他文件所占满,即无法添加物理上相邻的新物理块,则会因此需要整体迁移到某个能够容纳扩展后该文件大小的地方
②存储空间利用率低,会产生难以利用的磁盘碎片:若新文件的大小大于磁盘中所剩余的每个单独空闲区的大小(类似外部碎片),则无法为该新文件分配空间;可以通过紧凑解决磁盘碎片,但是要付出时间代价
1.采用离散分配方式,分为显式链接和隐式链接
2.隐式链接:
①FCB中记录起始块号和结束块号:从起始块号依次开始访问
②缺点:只支持顺序访问,不支持直接访问:只有读入该块,才能知道该块的下一个块是哪个块(读第i个块,需要进行i + 1次磁盘I/O)
③缺点:指针需要消耗存储空间
④优点:方便扩展(参考链式存储),不会有碎片问题,外存利用率高
3.显式链接:
1.文件中各块间的链接关系被记录在FAT中(每个文件的最后一个物理块在FAT中用特殊记号标识,例如-1等)
2.FCB中仅需记录起始块号(结束块号可由FAT得到)
3.一个磁盘仅需要一张FAT(FAT中可以记录该磁盘的所有物理块)
4.优点:
①方便文件扩展:直接修改表项就可以做到将新物理块分配给文件
②地址转换不需要访存,文件访问效率更高:开机时FAT读入内存,并常驻内存
③支持随机访问:根据起始块号查FAT表就可以得到该文件所占用的所有物理块的块号
④没有碎片问题,外存利用率高
5.缺点:FAT表需要占用一定存储空间。FAT的采用连续存储(指FAT这张表自身的存储方式)
1.采用离散分配的方式
2.一个文件对应一个索引表(区别于显式链接,一个磁盘对应一张FAT表),索引表中记录文件所占用的各个逻辑块所对应的物理块
3.索引块用于存放索引表(索引表自身也需要占用存储空间);数据块用于存放文件数据
4.索引表由若干索引项组成,索引项由逻辑块号和物理块号组成(物理块号即该逻辑块实际所占用的物理块,逻辑块号隐含,按顺序递增,类似数组)
5.FCB中记录索引块的块号
6.优点:
①支持随机访问:仅需找到该文件对应的索引块就可以指定该文件所占用的所有逻辑块和其所对应的物理块的映射关系
②易于实现文件拓展:仅需为该文件的索引表增加一个索引表项,该索引表项对应所扩展的物理块
7.缺点:索引表自身需要占用一定存储空间
8.当文件过大,一个索引块放不下其对应的索引表时:
①链接方案:
(1)实现方式:将索引表拆分,为这个文件分配多个索引块,在每个索引块中使用一定空间存储指向下一个索引块的指针,FCB中依然只需要记录第一个索引块的块号
(2)只能实现顺序访问,不支持直接访问:只有将该索引块读入内存,才能知道下一个索引块在外存的位置
②多级索引:建立多层索引表(类似多级页表)。解决链接方案中需要进行多次磁盘I/O
1.FCB中记录存放顶级索引表的索引块
2.各层索引表的大小不能超过一个物理块的大小(即每个物理块存放的索引项数量有限)
3.文件最大长度的计算(每个物理块所能存放的最大索引项数量m相同,设采用n层索引):
文件最大长度 = m个n相乘 * 单个物理块的大小
4.磁盘I/O的次数(设采用2层索引):第一次I/O读取顶层索引表(索引块),第二次I/O读取二级索引表(索引块),第三次I/O读取目标数据块
即采用n层索引需要进行n次读索引块 + 1次读数据块,即n + 1次磁盘I/O
③混合索引:解决当文件很小时,多级索引方式仍需要进行多次磁盘I/O
(1)文件最大长度的计算:分别计算每个索引方式所使用的物理块的大小,然后求和
(2)磁盘I/O次数:根据每种索引方式的特性,不同的索引方式所需要的磁盘I/O次数不同,但是在顶级索引表没有读入内存的情况下,都需要先进行一次磁盘I/O用于读取顶级索引表
1.创建文件:
2.删除文件:
3.打开文件:
打开文件表分为进程打开文件表和系统打开文件表:
①系统打开文件表:一个系统只有一张系统打开文件表,记录正在被所有进程使用所有文件的信息(打开计数器用于记录当前有几个进程正在使用该文件)
②进程打开文件表:一个进程对应一张进程打开文件表,记录该进程使用的所有文件的信息。该表中将记录进程打开文件表中的某个文件在系统打开文件表中该文件的位置(读/写指针标记该进程对该文件读/写操作到哪个位置,不同进程的读写指针不同;访问权限标记该进程对该文件的使用权限,不同进程的访问权限不同)
4.关闭文件:
5.读文件:
6.写文件:
1.口令保护
3.访问控制:
①每个文件对应一个访问控制表
②如果某个用户不允许访问某个目录,则它也不允许访问该目录下的所有文件
1.目录的本质是文件:即目录具有文件的各种属性
2.目录文件中的一条记录就是一个文件控制块(FCB),即FCB和记录一一对应;FCB的有序集合称为文件目录
3.FCB包含各类文件的基本信息(各种文件属性)
4.FCB使得用户可以实现按名存取:FCB实现了文件名和文件的映射
5.操作系统对目录的操作:
①搜索:操作系统根据文件名搜索目录,找到该文件对应的目录项
②创建文件:创建文件时,在其所属的目录中增加一个目录项
③删除文件:删除文件时,在其所属的目录中删除一个目录项
④显示目录:向用户展示该目录中的所有文件即其文件属性
⑤修改目录:文件的属性发生修改时,需要修改其在目录中的对应目录项(例如修改文件名)
1.整个系统只有一张目录表,每个文件对应该目录表中的一个目录项
2.实现按名存取,但是不支持文件重名(操作系统无法区分两个相同的文件名的文件到底哪个是想要的)
3.不适用多用户操作系统(多用户的情况下,将可能发生相同文件名)
1.不同用户文件存在不同用户目录项,因此支持不同用户的文件重名;实现文件保护和文件共享
2.缺点:无法进行文件分类
1.树形目录结构不便于实现文件的共享
2.相对路径可以减少I/O操作的原因:每查询下一级目录时,都需要启动磁盘I/O把下一级目录所对应的目录文件调入内存
当共享计数器的值 > 1时(两个及以上用户使用的文件),用户删除某个文件不能直接删除(还有其他用户使用),此时该用户的删除操作是删除在其目录中该文件对应的目录项(FCB),并使该文件对应的共享计数器 - 1(只有当共享计数器 = 0时,即没有用户使用的文件,才真正删除该文件)
通过指针的方式,减少FCB中的存放的信息以提升检索文件的效率(可以大大减少FCB所占用的空间,单个内存块存放的FCB数量增加,即单次I/O能够进行检索的FCB数量增加)。改进后,FCB中存放的是文件名和指向索引结点的指针,索引结点中存放了该文件的各种文件属性(除文件名)
共享和复制的区别:
①共享:系统中只有一份数据。用户对其修改,其他用户的也会被修改
②复制:系统中有多份相同数据。对用户对自己的一份进行修改,其他用户的并不会受到影响
只有当count = 0(没有用户使用该文件)时,才真正删除该文件;当count > 0时,删除操作只是删除该用户中该文件所对应的索引表项
①实现方式:该共享方式下,文件的目录项中的索引结点指针并不是直接指向索引结点,而是创建一个新的link类型的文件,该文件中存放了目标文件(即目标索引结点)的存放路径,之后操作系统根据这个路径逐层检索目录找到想要共享的目标文件(目标索引结点)
②如果link文件所指向的目标文件被删除,虽然link文件依然存在,但link文件无效
③软链接比硬链接文件速度更慢:软链接需要根据文件路径逐层检索目录
1.用户接口:用于处理各种文件的基本操作(各种系统调用请求)
2.文件目录系统:完成与目录有关的工作
3.存取控制模块:实现文件保护
4.逻辑文件系统与文件信息缓冲区:在索引文件的逻辑结构下,一个索引表对应一个文件;在查询对应的索引表前,需要将索引表调入文件信息缓冲区中
5.物理文件系统:逻辑地址转换为物理地址
①辅助分配模块:为文件添加记录,新增物理块;为文件删除记录,回收物理块
②设备管理模块:最接近硬件的层次
文件系统在外存是如何一步一步的建立的
1.物理格式化(低级格式化):将磁盘划分为一个个扇区(磁盘在原始状态下并被分为若干个扇区),并检测该磁盘是否有坏扇区,如果有,则用备用扇区替代这些坏扇区
坏扇区对操作系统是透明的(设n号扇区是坏扇区):操作系统想访问n号扇区,磁盘驱动器就会在操作系统不知道的情况下,用一个备用扇区替代该n号扇区被操作系统访问
2.逻辑格式化(高级格式化):将磁盘划分为一个个的分区(分卷,例如:C盘、D盘)
①分区表记录每个分区的大小、起始地址、地址范围等
②每个分区可以建立独立的文件系统
(1)引导块:负责开机时初始化操作系统
(2)超级块:找到该分区中所有空闲磁盘块
(3)与空闲分区管理有关的数据结构:例如位示图,判断某个特定的磁盘块是否空闲
(4)i结点区:i结点即索引结点,一个文件对应一个索引结点,所有索引结点连续存放在i结点区(可以理解为超大的数组,该数组元素就是索引结点)
(5)根目录:逻辑格式化后,根目录被建立;任何文件都必须从根目录出发,建立新的下一级目录
(6)灰色部分此时已经有数据,白色部分还没有数据,只有新建文件或者目录时才会有数据
3.文件系统在内存的结构:内存分为用户区和内核区
内核区:
(1)目录的缓存:最近访问过的目录的数据会被暂时缓存在内存中。例如:最近查找过目录M,即将目录M中的FCB都读入主存,如果接下来又访问到目录M,就无需再从外存中读入
(2)系统打开文件表:记录整个系统打开了哪些文件
①整个系统只有一张系统打开文件表
②保存每个文件对应的FCB
(3)进程(用)户打开文件表:记录该进程当前打开了哪些文件
①一个进程对应一张进程打开文件表
②进程打开文件表包含于PCB中
③进程打开文件表并不会保存FCB,但会有一个指向系统打开文件表中该文件的索引,这样就能通过该索引找到系统打开文件表中该文件对应的FCB
(4)示例:通过open系统调用打开目录M中的文件A
①根据路径读入目录:在外存中找到目录M→将目录M的数据读入主存(即将目录M缓存)
②找到目标文件FCB,复制到系统打开文件表:检查目录M的FCB,即逐一对比找到文件A的FCB→复制文件A的FCB到系统打开文件表中(表示文件A被打开),同时设置打开计数为1(表示当前有1个进程正在使用文件A)
③在进程打开文件表中新建一个条目,并返回文件描述符:发起OPEN系统调用的进程的进程打开文件表中新建一个条目,该条目记录对该文件的打开方式(读/写、只读等);返回文件描述符,即返回指向该文件在系统打开文件表的位置的指针
④OPEN系统调用打开文件后,将返回一个文件描述符,可以通过该文件描述符对打开的文件进行操作(例如:操作系统收到READ系统调用后,根据文件描述符在进程打开文件表中找到对应的条目,然后根据索引信息找到系统打开文件表中对应的条目,即找到该文件的FCB,最后根据FCB找到该文件在外存中的位置)
1.不同外部存储设备内部的文件系统格式可能不同(例如:磁盘→UFS文件系统、移动硬盘→NTFS文件系统、U盘→FAT文件系统),即计算机内部可能同时存在不同的文件系统
2.不同的文件系统在开发时定义的函数接口可能不同:例如,打开文件系统调用,可以是open、fopen、openf等,需要的参数也可能不同
3.1和2的特性使得操作系统需要提供向上层提供一个统一标准的函数调用接口,方便用户使用,即虚拟文件系统
①向上层用户提供进程提供同一标准的系统调用接口,屏蔽底层具体文件系统的实现差异:用户仅需按照虚拟文件系统的标准写代码,无需按照打开的文件实际存在的文件系统的标准写代码,通过虚拟文件系统调用相对应的底层文件系统
②要求下层的文件系统必须实现某些规定的函数功能(open、write、read等等),一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统的虚拟文件系统的要求:虚拟文件系统不需要根据不同的底层文件系统而频繁修改操作系统内核代码
③每打开一个文件,虚拟文件系统就在主存中新建一个VNODE,用统一的数据结构表示文件,无论该文件存储在哪个文件系统:不同文件系统所对应的数据结构不同(例如FAT文件系统的目录项包含其所有信息;UFS文件系统的目录项由指向索引结点的指针组成,具体的信息存放在该索引结点中),在虚拟文件系统中,通过open系统调用打开一个文件后就会给这个文件在主存中新建一个包含该文件的所有信息的VNODE(也称V结点),即将不用的文件系统的文件信息的数据结构通过复制到VONDE的方法形成统一的数据结构
(1)VNODE只会存在于主存中(由虚拟文件系统创建),而INODE(索引结点)存放在外存中,在使用时调入主存
(2)VNODE中的函数功能指针指向的是该文件所属文件系统的函数功能列表(write、read、open等):对该文件进行的任何操作时,先找到该文件的VNODE,根据VNODE中的函数功能指针找到对应的文件系统的函数功能列表,再去执行具体函数,从而实现从上至下逐层函数调用
1.文件系统挂载,即文件系统安装:将具体的文件系统安装到操作系统的虚拟文件系统中
2.文件挂载的过程:
①在虚拟文件系统中注册新挂载的文件系统:虚拟文件系统管理一个名为挂载表的数据结构,新增一个文件系统时候就要在挂载表中增加一个相应的表项,即让虚拟文件系统发现这个文件系统。例如图中的虚拟文件系统管理的挂载表中有三个表项,分别指向UFS、NTFS和FAT
②新挂载的文件系统需要向虚拟文件系统提供一个函数地址列表:每一个文件系统实现系统调用的方式可能不同,即告诉系统调用自己的每个系统调用存放在哪个地址(VNODE中的函数功能指针),使得虚拟文件系统能够实现这些系统调用
③将新文件系统加到挂载点:例如Windows操作系统中,插入一个U盘,在我的电脑中将会增加一个可移动硬盘H(跟C盘、D盘平级),这样才能够被我们所访问和使用