第四章、文件管理
@
目录- 第四章、文件管理
- 一、初识文件管理
- 二、文件的逻辑结构
- 三、文件目录
- 三、文件的物理结构(文件分配方式)
- 四、文件的存储空间管理
- 五、文件的基本操作
- 六、文件共享
- 七、文件保护
- 八、文件系统的层次结构
- 九、文件系统的层次结构
- 十、磁盘调度算法(重点)
- 十一、磁盘初始化
一、初识文件管理
1.文件的属性
2.文件的逻辑结构
3.文件处理中操作系统向上层提供的功能
4.文件分类
按用途可以分为:系统文件、库文件、用户文件
按信息流向:输入文件、输出文件、输入输出文件
按保护级别:只读、读写、不保护文件
按存放时间:临时文件、永久文件、存档文件
按设备类型:磁盘文件、磁带文件
总结:
二、文件的逻辑结构
1.文件的逻辑结构与物理结构
逻辑结构:在用户看来,文件内部的数据应该是如何组织起来的;
物理结构:在操作系统看来,文件的数据是如何存放到外存中的。
(1) 无结构文件与有结构文件:
(2) 有结构文件的逻辑结构:
顺序文件:文件中的记录一个接一个地顺序排列,记录可以是定长地或可变长地。各个记录在物理上可以顺序存储或链式存储。
定长记录的文件记录方式包括: 串结构-----记录之间的顺序与关键字无关;顺序结构-----记录之间地顺序按关键字顺序排列;
注意顺序存储中定长记录可以实现随机存取,而可变长记录不能实现随机存取。定长文件如果按照串结构的方式是无法快速找到某关键字对应的记录;如果按照顺序结构的方式是可以快速找到某关键字对应的记录的。
索引文件:通过建立索引表来快速查找可变长文件的位置。
索引表可能会占用很大的内存空间
索引顺序文件:结合了索引表和顺序文件的思想,同样会为文件建立一张索引表,但不同的是并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
可以建立多级索引来提高查找速度
总结:
三、文件目录
1.文件控制块
文件控制块是指FCB,一个FCB就是一个文件目录项。FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写,禁止访问的用户名单等),使用信息(文件的创建时间、修改时间等)。
最终要最基本的还是文件名、文件存放的物理地址
2.目录结构(单级与多级)
-
单级目录实现了“按名存取”,但是不允许文件重名。
-
两级目录结构分为主文件目录(MFD)和用户文件目录(UFD)。它允许不同用户的文件重名,但是不能对文件进行分类。
-
多级目录结构(又名树形目录结构),系统根据绝对路径一层一层地找到下一级目录,直到找到最终的文件。每一步都需要从外存中调入下一次将要查询的文件目录。
为了简化那些重复访问的文件,可以设置当前目录和相对路径。
树形目录可以很方便地进行文件管理、查找和分类,但是不便于实现文件共享。
-
无环图目录结构,可以用不同的文件名指向同一个文件,甚至可以指向同一个目录。但是需要给每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除该节点只会删除它的FCB,使得共享计数器减一,并不会直接删除该结点,只有当共享计数器减为0时,才会删除结点。
注意由于共享文件中各个用户指向的是同一个文件,因此只需要其中一个用户修改了文件数据,那么所有的用户都可以看到文件数据的变化
- 索引结点(FCB 的改进),由于查询时只需要根据文件名进行匹配,因此可以考虑将其它信息放在一个索引结点中,需要时再进行查询。
总结:
三、文件的物理结构(文件分配方式)
在内存中,进程的逻辑地址空间被划分为了一个个页面,同样的在外存管理中,为了方便对文件数据管理,文件的逻辑地址空间被划分为了一个个的文件"块"。于是文件的逻辑地址可以表示为(逻辑块号、块内地址)的形式。 在外存中同样是以块为单位进行分配地址空间的,因此用户可以通过逻辑地址来操作自己的文件,操作系统负责实现从逻辑地址到物理地址的映射。
注意区分开页表与索引表的作用:
页表用于反应进程页到内存页帧的映射;
索引表用于反应文件块到外存快的映射;
1.文件连续分配方式--连续分配
文件控制块中记录的包括文件名、起始块号、长度等信息。用户给出需要访问的逻辑块号,操作系统会对比逻辑块号和文件目录中的长度来判断该逻辑块号是否合法。然后加上起始块号来生成物理块号。
1.1 连续分配方式的优缺点:
(1) 优点
连续分配支持顺序访问和直接访问
连续分配方式在顺序读写时的速度最快
(2) 缺点
物理上采用连续分配不方便拓展
物理上采用连续分配,存储空间利用率会降低,会产生难以利用的磁盘碎片。可以使用紧凑的方式来处理碎片,但是需要花费很大的时间代价
总结:
2.文件连续分配方式--隐式链接
用户根据逻辑块号查找到文件对应的目录项(FCB),就可以查看到起始块号和结束块号。查找时除了文件的最后一个磁盘块之外,其余的每个磁盘块中都会保存指向下一个盘的指针,这些指针对于用户而言是透明的。
2.1 隐式链接方式的优缺点:
(1) 优点
采用隐式链接的链接分配方式,很方便地实现文件拓展。
所有的空闲磁盘块都可以被使用,不会有碎片问题,外存利用率高。
(2) 缺点
只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。
注意链接分配方式最终会指向一个-1的块
3.文件连续分配方式--显式链接
把用于链接各物理块的指针显式地存放在一张表中,即文件分配表(FAT),一个磁盘仅需要一张FAT,开机时将FAT读入内存,并且常驻内存。FAT的各个表项在物理上连续存储,且每一表项的长度相同。
3.1 显式链接方式的优缺点:
(1) 优点
采用显式链接方式的文件,支持顺序访问,也支持随机访问(当想要访问i号逻辑块时,并不需要依次访问之前的0~ i-1号逻辑块),而且FAT由于是常驻内存的,那么块号的转换过程不需要访问磁盘。
显式链接不会产生外部碎片,也可以很方便地进行文件拓展
(2) 缺点
文件分配表FAT需要占用一定的存储空间
4.文件连续分配方式--索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应地物理块。索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。
注意在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张表。而在索引分配方式中,索引表是一个文件对应一张表
索引分配方式寻址:首先根据给出的文件名获取到对应的索引块(索引表的存放位置),然后将索引表从外存读入内存中,并查找索引表即可以知道i号逻辑块在外存中的存放位置。
索引分配方式的优点:索引分配方式支持随机访问;文件拓展容易实现。
索引分配方式的缺点:索引表需要占用一定的存储空间。
如果一个文件的大小太大,那么一个磁盘块是无法装下整个索引块的,此时有三种解决方案:①链接方案;②多层索引;③混合索引
①链接方案:
一个索引块装不下,那么就用多个索引块来存储,然后将这些索引块链接起来进行存放。
但是这种情况下如果需要访问最后一个索引块,那么就需要将之前的所有索引块都进行一次访问,十分耗时。
②多层索引:
建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块,根据文件大小再建立第三层、第四层的索引块。
注意文件最大长度的求法:假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。那么如果有多层索引,就有多个索引表的长度相乘获得。
访问目标数据块时的磁盘I/O操作次数:采用K 层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次的读磁盘操作。
访问具体目标数据的过程:比如有一个二级索引表,现在要访问1026号逻辑块。根据 1026/256=4,1026%256=2,则先将一级索引表调入内存,说明需要查询对应的4号二级索引表,将其对应的4号二级索引表调入内存,最后查询二级索引表的2号表项就能够知道1026号逻辑块存放的磁盘块号了。
③混合索引:多种索引分配方式,包括直接地址索引、间接索引。
注意读取磁盘I/O操作的次数:当顶级索引表还未调入磁盘时,直接地址索引需要两次读磁盘操作;一级间接索引需要三次读磁盘操作;二级间接索引需要四次读磁盘操作。与多层索引的读磁盘操作次数不同。
总结:
四、文件的存储空间管理
4.1 存储空间的划分与初始化
4.2 存储空间管理--空闲表法
空闲表法适用于“连续分配方式”,它能够记录各个空闲块的第一个空闲盘块号和空闲盘块数从而进行空闲盘的分配。
空闲块的回收:
4.3 存储空间管理--空闲链表法
①空闲盘块链:
如何分配:若某文件申请k个盘块,则从链头开始一次摘下K个盘块进行分配,并且修改空闲链的链头指针。
如何回收:回收的盘块依次挂到链尾,并且修改空闲链的链尾指针。
②空闲盘区链:
在分配多个磁盘块时效率高于空闲盘块链的方式,因为它每次摘取的是一串空闲盘块。
③位示图法:
每个二进制位表示一个盘块。用连续的字来表示连续的多个盘块的状态情况。
重点是 掌握字号、位号与盘块号的转换
如何分配与回收:
④成组链接法:
超级块中第一项存放下一组空闲盘块的块数;剩下的存放空闲盘块块号;
其余分组的第一项存放的都是该分组中的空闲盘块的数量。
分配方式:
如果需要1个空闲盘块,就检查第一个分组是否有足够的块数,如果满足就分配第一个分组的最后一个空闲盘块并且修改对应的数据。
如果需要刚好100个空闲盘块:第一个分组刚好全部满足,就需要先将它记录的数据信息复制到超级块中,然后分配自己,接着继续处理超级块中的接下来的空闲盘块。
回收方式:
如果当前分组的空闲块还没有占满,那么直接将回收的空闲块插入到该分组;
如果当前分组的空闲块已经占满,那么就需要将超级块中的数据复制到新回收的块中,并且修改超级块的内容,让新回收的块成为第一个分组。
总结:
五、文件的基本操作
-
创建文件:
(1)在外存中找到文件所需的空间(结合上节学习的空闲链表法、位视图、成组链接法等管理策略,找到空闲空间);
(2)根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。 -
删除文件:
(1)进行Delete系统调用,需要提供文件存放路径、文件名两个主要参数;
(2)根据文件存放路径找到对应的目录文件,从目录中找到文件名对应的目录项;
(3)根据该目录项记录的文件在外存中的存放位置、文件大小等信息,回收文件占用的磁盘块。
(4)从目录表中删除文件对应的目录项。 -
打开文件:
(1)根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项,并检查该用户是否有指定的操作权限。
(2)将目录项复制到内存中的“打开文件表”中。并将对应表的目的编号返回给用户。不会复制文件的数据。
-
关闭文件:
(1)将进程打开文件表相关的表项删除;
(2)回收分配给该文件的内存空间等资源;
(3)系统打开文件表的打开计数器count减1,若count=0,则删除对应表项。 -
读文件:
(1)进程使用read系统调用完成读写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据、指明读入的数据要存放在内存中的什么位置。
(2)操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。 -
写文件:
(1)进程使用write系统调用完成读写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写入多少数据、写回外存的数放在内存中的什么位置。
(2)操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。
总结:
六、文件共享
文件共享意味着系统中只有一份文件数据,需要与文件复制区别开。文件共享的方式有两种,包括 基于索引结点的共享方式(硬链接)、基于符号链的共享方式(软链接)。
6.1 基于索引结点的共享方式(硬链接)
(1)构造方式:由于检索时只需要用到文件名,因此可以将除了文件名外的其它信息放入到索引结点种,这样目录项就只需要包含文件名、索引结点指针。
当有用户退出时只是删除了该用户的文件目录中的目录项删除,并且使索引结点count值减一。
6.2 基于符号链的共享方式(软链接)
区别于硬链接方式,不再将文件目录项直接指向对应的索引结点, 而是创建了一个link型文件,根据其中记录的路径层层查找目录。
总结:
七、文件保护
-
口令保护:
口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入口令,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,就允许该用户访问。
优点:保存口令的空间开销不多,验证口令的时间开销也很小;
缺点:正确的口令存放在系统内部,不够安全。 -
加密保护:
使用某个密码对文件进行加密,在访问文件时需要提供正确的密码才能对文件进行正确的解密。(最简单的加密算法----异或加密)
优点:保密性强,不需要在系统中存储“密码”;
缺点:编码/译码,或者说加密/解密要花费一定时间。
总结:
八、文件系统的层次结构
总结:
九、文件系统的层次结构
- 磁盘、磁道、扇区
- 如何在磁盘中读/写 数据
需要先把 “磁头” 移动到想要读/写的扇区所在的磁道。磁盘会转起来,让目标扇区从磁头下面划过,才能完成对扇区的读/写 操作。 - 盘面、柱面(磁盘的物理地址)
可以用(柱面号,盘面号,扇区号)来定位任意一个“磁盘块”。 文件数据存放在外存的几号块,这个块号就可以转换成(柱面号,盘面号,扇区号)的地址形式。 - 磁盘的分类
磁头是否可以移动:
磁盘是否可以更换:
总结:
十、磁盘调度算法(重点)
-
总览:
-
一次磁盘读/写 操作需要的时间:
总共分为三个部分:寻道时间+延迟时间+传输时间
寻找时间(寻道时间):
延迟时间(转动磁盘的时间):
传输时间(从磁盘读出或向磁盘写入数据的时间):
可以看出:延迟时间和传输时间都与磁盘转速有关,且都为线性相关。而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间。操作系统可以优化的就是寻道时间了。 -
磁盘调度算法:
(1) 先来先服务算法 [FCFS]:
(2) 最短寻找时间优先 [SSTF]:
(3) 扫描算法 [SCAN]:
(4) LOOK调度算法 [LOOK]:
(5)循环扫描算法 [C-SCAN]:
(6)C-LOOK算法 [C-LOOK]:
总结:
-
减少磁盘延迟时间的方法:
延迟时间是指将磁头移动到对应扇区的时间,但是由于磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区时不一定能够连续转动磁头进行读取。磁头可能会由于延迟错过当前的扇区数据读入,那么它就需要再进行一次转动后才能再次读入数据。
解决方法:
①方法一、交替编号
思考一个问题: 磁盘地址结构为什么要设计为 (柱面号,盘面号,扇区号)?
如图:如果是(盘面号,柱面号,扇区号),当磁头读完某一个磁道的数据后,如果需要继续读取,根据地址的排列情况,接下来就需要改变柱面号来进行读取,那么就必须调用磁头臂将所有磁头往外移动从而改变柱面号,而调用磁头臂需要消耗很大的时间和资源。
![在这里插入图片描述](/i/ll/?i=20201029200144605.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjg0OTg1,size_16,color_FFFFFF,t_70#pic_center) 如图:如果是(柱面号,盘面号,扇区号),当读取完某一磁道的数据后,下一步需要改变盘面号,由于只是改变盘面不需要改变磁头臂,因此此时只需要激活对应盘面的磁头就可以了。这样就减少了磁头的移动次数。
总结:为什么磁盘的物理地址是(柱面号,盘面号,扇区号)而不是(盘面号,柱面号,扇区号)?
读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动所消耗的时间。
②方法一、错位命名
若相邻的盘面相对位置相同处扇区的编号相同:
初始状态:
转动两圈将内侧磁道的数据读完后的状态:
状态如下图:但是需要短暂时间处理,盘面又在不停的转动,因此接下来要读取的1号盘面的磁头就会错过一段磁道的数据读取,只能等到盘面再转动一圈后再次读取。
改进方法(将上下两个盘面的扇区错开):
当0号磁盘的磁道读取完毕后,在短暂的时间间隔内,盘面继续转动而磁头不读取数据,这段时间过后刚好磁头对应1号盘面的磁道的初始位置,减少了调整转动的延迟时间。
重点:
十一、磁盘初始化
-
磁盘初始化:
需要完成三件事情 物理格式化+磁盘分区+逻辑格式化:
-
引导块:
计算机开机时需要进行一系列的初始化工作,这些工作是通过执行初始化程序(自举程序)来完成的。原始的自举程序是放置在ROM只读存储器中的,而ROM中的数据在出厂时就写入了,并且以后不能修改。
万一需要更新自举程序,将会很不方便,因为ROM中的数据无法更改。因此就引入了引导块的概念,在ROM中只存放很小的“自举装入程序”,开机时计算机先运行“自举装入程序”,通过执行该程序可以找到引导块,并将完整的“自举程序”读入内存。
完整的自举程序是放置在磁盘的启动块(即引导块/启动分区)上的,启动块位于磁盘的固定位置。
拥有启动分区的磁盘就称为启动磁盘(比如C盘)。 -
坏块:
坏了,无法正常使用的扇区就是“坏块”。
总结:
感谢:
以上图片均出自b站王道考研视频:
https://www.bilibili.com/video/BV1YE411D7nH