1. 文件系统基础
1.1 文件的概念
1. 文件的定义
- 文件是一段程序或者数据的集合。
1.2 文件的逻辑结构
- 文件的逻辑结构是从用户观点出发看到的文件的组织形式。
1. 无结构文件(流式文件)
- 无结构文件是最简单的文件组织形式。无结构文件是将数据按照顺序组织成记录并积累保存起来的。
- 他是有序相关信息项的集合,以字节(byte)为单位。
- 由于无结构文件没有结构,因而对记录的访问只能通过穷举搜索的方式,所以这种文件对大多是应用不适合。
2. 有结构文件(记录式文件)
a) 顺序文件 (所有顺序查找的功能和array是一样的:方便读写,但是对查找,修改增加删除都very苦手)
- 文件中的记录是顺序排列的,定长的而且要恶意顺序存储或者链式存储的。
i) 串结构:记录之间的顺序与关键字无关。由时间决定放入
ii) 顺序结构:指文件中的所有记录按关键字顺序排列
b) 索引文件 (其实自己也是一个定长的顺序文件啦)
- 对定长记录的文件,如果要查找第i个记录,可以直接根据公式来计算(离散型)
A = (i=0; i<n; i-1)Li + i
c) 索引顺序文件
- 顺序和索引的两种形式的结合。索引顺序文件将顺序文件中的所以记录分成若干组,为顺序文件建立一个索引表,在索引表中为每组中的第一个记录建立一个索引项,其中也包括该记录的关键字值和指向该记录的指针。
- 索引文件和索引顺序文件都提高了存取的速度, 但也会占用存储空间
d) 直接文件或散列文件
- 给定记录的key 值或者通过Hash function 转换的值直接决定了物理地址。这个映射结构不同于顺序或者索引,这个是没有特定的顺序性的。 Hash file有很高的存取速度,但是可能引起冲突。
1.3 目录结构
1. 文件控制块和索引结点
a) 文件控制块:和PCB一样的功能(基本信息,使用信息,存取控制信息)
b) 索引结点:在检查目录文件的过程中,只用到了文件名,而当找到了一个目录项时,才需要从该目录项中读出该文件的物理地址。
2. 目录结构
a) 单级目录结构:在整个文件系统中之建立一个目录表,每个文件占有一个目录项。(缺点:不能重名,不能共享,慢)
b) 两级目录结构:每一个用户目录文件在主文件中可以占用一个目录项!一人一个坑!!主文件目录项记录用户名及相应用户文件目录所在的存储位置。用户文件目录项记录了该用户的FCB,所以这样也避免了重名的问题。但缺乏灵活性
c) 多级目录结构:(树形目录结构)用户要访问某个文件时用文件的路径名标识文件,文件路径名是字符串,由从根目录出发到找到文件的通路上的所有目录名与数据都要用'/'隔开。 *从根目录出发的叫绝对路径;而从当前目录出发的叫相对路径。
d) 无环圈目录结构:树形目录结构可以实现文件分类,但是不能实现文件共享。所有就有人very叼, 在这个树形目录基础上高了一些有向边,使得整个目录变成了一个有向无环图。 但是这个太复杂了。
1.4 文件共享
1. 基于索引结点的共享方式(硬链接)
- 在树形结构中,当有两个或者多个用户要共享一个子目录或者文件时,必须将共享文件或者子目录连接到两个或者多个用户目录中,才可以方便的找到该文件(有种链表的感觉??)(count的数目代表有多少人在用)
2. 利用符号链实现文件共享(软连接)
- 为使用户B可以共享用户A的文件F,需要建立一个LINK类型的新文件,就取名叫F,并且将F写入用户B的目录中,以实现用户B的目录和F的连接。在新文件中包含表连接文件F的路径名。这样的连接方法被称为符号连接。
- 在利用符号链方法实现文件共享时,只有文件的拥有者才可以拥有指向其索引结点的指针。而共享该文件的其他用户只能得到皮毛!比如路径名。(这就是王的力量!POWER!)
- 优点是访问方便,缺点是开销太大,消耗磁盘空间
2. 文件系统实现
2.1 文件系统层次结构
用户调用接口 | 文件系统为用户提供的相关调度什么的~ |
文件目录系统 | 管理文件目录 |
存取控制验证 | 保护该软件的完成 |
逻辑文件系统与文件信息缓冲区 | 根据文件的逻辑结构将用户要读写的逻辑记录转换成文件逻辑结构的相应块号 |
物理文件系统 | 把逻辑记录所在的相对块号转换成实际物理地址 |
分配模块 | 管理辅存空间 |
设备管理程序模块 | 分配设备的调度等 |
2.2 目录实现
- 目录查询是需要反复的进行I/O操作的,开销大。所以为了减少I/O操作,所以需要把使用的文件目录复制到内存里,以后要使用的话再从内存里调用出来
1. 线性列表
- very简单;就使用存储文件名和数据块指针的array~创建新文件时,首先要搜索目录表以确定没有同名的文件存在,然后在目录表后增加一个目录项。实现简单,但是比较耗时。
2. Hash Table
- 根据文件名得到一个值,并返回一个指针里面的元素的指针。优点是比较快,但是要避免意外冲突。
2.3 文件实现
1. 文件分配方式(对应文件的物理结构,是指如何为文件分配磁盘块)
a)连续分配
- 连续分配方法要求灭个文件在磁盘上占有一组连续的块。实现简单,但是不能动态增加或减少,而且还会产生碎片
b) 链接分配
i) 隐式链接: 每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何一个地方除最后一块盘块,每一个盘块都指向下一个盘块的指针,(指针对用户是透明的)。(反正就是踢皮球…你就在里面疯狂找吧)
ii) 显式链接:是把用于链接文件各物理块的指针,从每个物理块的块末尾提取出,显示的放在内存的第一张链接表里。
iii) FAT: (File Allocation Table)文件分配表,就是分配给文件的所以盘块号都放在这里的一个表。
c) 索引分配:链式分配可以解决碎片的问题,但是无法有效的支持直接访问(除了FAT)。索引分配把每个文件的所以的块号都集中在了一起,变成了一个索引表。
访问第n个记录 | 优点 | 缺点 | |
顺序分配 | 需要访问磁盘1次 | 顺序存取时速度快,当文件是定长时可以根据文件起始地址及记录长度进行随机访问 | 文件存储要求连续的存储空间,长产生碎片,也不利与动态扩充 |
链接分配 | 需要访问磁盘n次 | 可以解决外存的碎片问题,提高了外存空间的利用率,动态增长方便 | 只能按照文件的指针链顺序访问,查找效率低,指针信息存放会消耗外存空间 |
索引分配 | m级需要访问磁盘m+1次 | 可以随机访问,易于文件的增删 | 索引表增加存储空间的开销,索引表的查找策略对文件系统效率影响大 |
2. 文件存储空间管理
- 文件储存设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理其实是对空闲块的组织和管理
a) 空闲表法:空闲表法余数连续分配法,他与内存的动态分配类似,为每个文件都分配一块连续的存储空间。而且空闲去起始盘号都是递增的次序排列的。
b) 空闲链表法: 分空闲盘块链(以盘块为单位拉成一条链)和空闲盘区链(以盘区,即若干个盘块,组成的链)
c) 位示图法:用 0 或者 1 表示空闲或分配
d) 成组链接法:把顺序的n个空间区地址保存在第一个空闲扇区,后面第一个空闲扇区册要保存另一个空区的地址,以此类推,直到所有的空闲区都连接上。
*举个栗子: 你现在后面有1000个学生,但是你上里只有100个可以让学生登记的表。所以你让学生分成了10组,每组100人。你让他们报完100个人后,最后一个要说出下面100个人的信息。每一组的名单在上一组的最后一个人的手里,而最后一组的名单就在第一组的第一个人的手里~形成了一个环链表~
3. 磁盘调度算法(就写几个重要的)
1. 扫描算法:自里向外,自外向里;scan算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次的服务对象。就是在最短寻找时机优先上做了一个磁头的限定。但是缺点是刚访问的要等好久才可以进行下一次的访问
2. 循环扫描算法(aka 电梯算法):在scan算法上的一个对磁头限定的提升,让磁头可以单向移动来提供服务。回返时,直接快速移动至起始点而不服务任何请求。
优点 | 缺点 | |
FCFS算法 | 公平,easy | 平均寻道距离大,仅应用在磁盘I/O较少的场合 |
SSTF算法 | 性能比FCFS算法好 | 不能保证平均寻道时间最短, 可能出现饥饿 |
SCAN算法 | 寻道性好,可以避免饥饿现象 | 不利于远距离磁头一端的访问 |
C-SCAN算法 | 消除了对两端磁道请求的不公平 | / |