初识文件管理
目录是一种特殊的有结构文件
外存也是分为一个个物理块
文件的逻辑结构
1.无结构文件
文件内部就是字符流
2.有结构文件(还有个哈希)
按照有结构文件中的各条记录在逻辑上如何组织,又分为三类
①顺序文件
串结构:顺序与关键字无关
顺序结构:记录按关键字顺序排列(如学生的学号)
顺序存储的定长记录:可以实现随机存取,因为只要计算一下记录的位置就行了。而很明显变长是没法这样计算的
如果顺序存储还按照顺序结构(关键字排列),那么可以很轻松的找到某个关键字的记录。
顺序文件增删一个记录很困难,涉及很多记录的移动。
一般来说提及顺序文件指的是顺序存储的情况
②索引文件
索引表是一个顺序文件,找到索引表里对应的指针就可以找到相应的文件。
缺点:索引表由于是连续存放的,有可能会占很大空间
一个组对应一个索引项,记住都是乱排的,要找某个项得从开头找(这样方便修改)
想再减少查找次数就建立多级索引,为了方便修改,也是随便排的(没有像图里那样按顺序排列,都是打乱了排的)
小结
索引文件支持随机存取:可以直接取出第n个索引项的数据
但是索引表里的那些记录是没有按顺序排列的,还是要一个一个去找(只有索引表是按关键字顺序排列才能实现快速检索,但是这样就会使增删记录耗费更多的代价)
文件目录
1.文件控制块(FCB)
所以说一个目录下不能有重名的文件,因为操作系统是根据名字在目录表中找到相应的FCB(目录表里的一条记录)
2.目录结构
①单级目录结构
②两级目录结构
③多级目录结构
绝对路径:从根目录出发
相对路径:从当前目录出发
④无环图目录结构
有计数器count,用户删除只是删除自己的FCB并使count-1,只有count=0的时候才会真正把文件删除
3.索引结点
使目录表瘦身,这样让每个块装更多的目录项,减少磁盘I/O次数,提升文件检索速度(每次磁盘I/O读入一块)
只在目录项里放文件名和索引结点指针,找到文件名才根据指针找到对应的索引结点,各种信息都放在索引结点里(除了文件名)
小结
文件的物理结构
1.连续分配
通过文件名在文件目录中找到起始块号,再通过逻辑块号算出物理地址(用长度检查是否越界)
优点:连续分配的文件在顺序读写时速度最快
缺点:不方便拓展(需要连续的空间),存储空间利用率低,会产生外部碎片
2.链接分配
为文件分配离散的磁盘块
① 隐式链接
文件目录中存放起始块号和结束块号,只能一个一个挨着访问(只支持顺序访问)。在每个磁盘块中保存指向下一个磁盘块的指针。
优点:方便拓展回收(修改FCB和磁盘块的指针就行),不会产生碎片,外存利用率高(所有块都可以用到)
缺点:只支持顺序访问,不支持随机访问,查找效率低,要耗费块中一定空间存放指针
②显式链接
块是最后一个的时候,下一块设为-1(标志)
每个磁盘一个 FAT(文件分配表),常驻系统内存
显式链接是支持随机访问的
3.索引分配
目录中存放文件的索引块在哪,每个文件对应一个索引,每个索引也存在磁盘上,再在索引块里用逻辑块号找到对应的物理块号,访问想要的数据。
索引分配支持随机访问,拓展很容易,但是索引表需要占用一定空间。
如果索引项太多了,一个磁盘块装不下,就需要几个解决方法
①链接方案
一个不够就用几个链接,每个索引块存储一个指针指向下一个索引块,所以这种要一个一个顺序访问才能找到后面的。
②多层索引
缺点:就算是小文件也要慢慢查
③混合索引
小结
小结
文件存储空间管理
1.空闲表法
2.空闲链表法
①空闲盘块链
②空闲盘区链
先找有没有连续的满足要求的盘区,没有的话跨盘区分配出来也可以,这就既能满足连续分配也能满足离散分配。
修改之后要记得改指针和盘区大小等数据
3.位示图法
注意字号、位号是从0还是1开始
连续分配、离散分配都适用(找连续的0就是连续分配)
4.成组链接法
这个理解就行了,比较复杂
超级块看成一个起始的块就行了,只有一个
①记录的方法
第一个记录空闲盘块数(不占位置,严格说是和记录300的放在一起的),下一个300 表示下一组物理空闲块的物理盘块号为300(它不是空闲块,里面放着下一组的块号数据,分配的时候想用它就要把这些数据先复制到超级块中才能把300这个块分出去),然后接下来的99个块才保存真正的可用的空闲块,也就是说每个组只有99块可用(就是啥都没有的空闲块,可以直接使用),但是,每组还是有100块!!!(就是上面记录的是100,记录的是别的话也要会推)
然后最后一个组,数量记的是99,很简单,因为再后面没有组了,就把第一个号记为-1(标记),而这个是没啥意义的,所以最后记成99个可用的。
②分配
以分配100个为例:第一个分组里有100个,是足够的,不过要注意一个点:100个里有1个是放了下一组的数据的,所以我们要把下一组的数据复制到超级块中,然后就可以把这个块分配出去啦。
③回收
回收的时候如果超出了一个块能装的大小(假如100个),那就把超级块里的内容复制到其中某块中,然后超级块再把多出来的块号写下来就行了,第一个块号记录的就是超级块之前内容复制到的块号。
小结
文件共享
1.基于索引结点(硬链接)
2.基于符号链(软链接)
软链接像快捷方式
如果文件1被删了,文件2依旧会存在,只不过它无法访问文件1了
小结
文件保护
1.口令保护
系统里保存了一个口令,输口令,对了就可以访问
容易被破解
2.加密保护
和输密码完全不同,加密是直接通过某种方式把文件搞成很奇怪的样子,这样如果没有解密的方法读出来的东西是非常怪的(一堆乱码),只有正确的解密才能得到真正的文件
3.访问控制
操作系统可以通过访问控制实现比较复杂的保护
小结
文件系统的层次结构
磁盘的结构
需要把“磁头”移动到想要读/写的扇区所在的磁道。磁盘会转起来,让目标扇区从磁头下面划过,才能完成对扇区的读/写操作。
活动头磁盘:每个盘面一个磁头,磁头在磁道间移动
固定头磁盘:磁头不可移动,每个磁道一个磁头,每个盘面很多很多磁头
可换盘磁盘:盘片可以换
固定盘磁盘:盘片不能换
磁盘调度算法
1/r是转一圈所需时间
b/N是需要转的圈数,所以时间是(1/r)*(b/N)=b/(rN)
操作系统没法优化转速,只能从寻找时间上优化(这就是磁盘调度算法)
1.先来先服务算法(FCFS)
2.最短寻找时间优先(SSTF)
有可能导致饥饿
3.扫描算法(SCAN)、LOOK算法
一般来说做题时说到扫描算法默认是LOOK算法,SCAN说的就是要到尽头才调头。
优点:不会产生饥饿
缺点:各个磁道响应频率不平均,最边上的响应完回来又响应,而中间的等的时间就要久一些
4.循环扫描(C-SCAN)、C-LOOK
循环顾名思义,过去了之后直接回来,不处理中间的,从最左边再过去一次
优点:使各个磁道的响应频率均匀
缺点:移动长度肯定变长了,慢一些
本质上来说SCAN和LOOK差不多,只是SCAN要到头才能掉头,而LOOK只需要到有请求的最后一个磁道或者第一个磁道(回去的时候)就可以了。一般来说在题里面没有特殊说明的话都是默认为LOOK和C-LOOK
小结
减少延迟时间的方法
磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区,可能需要很长的“延迟时间”(处理的时候没法读入,所以如果相邻的话得再等一圈才开始读入)
1.交替编号
差不多处理完了就到下一个扇区了,刚好接着开始
2.错位命名
所有盘面是一起连轴转动的,所以如果0号盘面最后一块读完了该读1号盘面第一块的时候,由于命名相同,直接轮到它,就无法读入(还要一点时间处理),所以采取错位命名,上下对应的不一样,这样处理完了就差不多刚好开始读入
3.磁盘地址结构的设计
如果是(柱面号,盘面号,扇区号)就只需激活下一个盘面的磁头就行,减少了移动磁头的次数(另一种物理地址结构要移动太多次磁头,每个盘面都要移动几次磁头)
小结
磁盘的管理
1.磁盘的初始化
2.引导块
3.坏块的管理
备用扇区的处理方法对操作系统透明,操作系统还是当各个扇区是好的,管理备用扇区和替换坏块的操作由磁盘控制器处理。