操作系统(thuOS)笔记(十四) 第二十一讲 文件系统
21.1 文件系统和文件
文件系统的功能
p.s.在空闲空间里不需要顺序
文件的属性
21.2 文件描述符
打开的文件,在内存当中所维护的相关信息
内核会跟踪进程打开的所有文件。不给每个文件搞一个表示是因为,打开的文件相比于所有文件,是有数量级的差距的。
文件描述符
文件指针,最后一次读写的位置
记录打开次数,最后一个进程关闭文件时,将其移除
文件的用户视图和系统视图
用户视图到系统视图的转换
读写是以块为单位,即使要读的只有很小的一部分数据,也需要把一整块读进来
访问模式
可以认为操作系统的文件系统是一个小型的数据库
索引文件示例
文件内部结构
文件的共享和访问控制
语义一致性
21.3 目录、文件别名和文件系统种类
文件分层系统
目录和文件呈树形结构
目录操作
用户想要修改目录,就要通过系统调用来实现
目录实现
利用哈希,可以减少搜索的时间。存在的问题是,两个文件名哈希的结果可能是一样的。
文件别名
快捷方式就存了个完整的路径。硬链接的问题是,删到最后一个文件才能把这个文件删除掉,而软连接删除文件后其他快捷方式就不存在了
文件中的目录循环
如何避免文件循环?
检测方法和死锁检测差不多,但是开销会比较大
太长不检索
名字解析
当前工作目录
每一个进程有一个缺省的根目录,它的文件解析就从这个目录开始解析。这样的好处就是,不用每次都从根目录往下找了。(好像MATLAB的读取方式啊)
文件系统挂载
文件系统的种类
不同的文件系统,由于存的数据不同,会做不同的优化,它使用场景的不同,也会做不同的优化。比如光盘,它是一次性写入多次读出,而正常的文件系统是多次读写
数据库文件系统,
日志文件系统
对文件系统的修改必须以原子的形式来进行,因为数据很关键,比如说银行里的记录的修改,对所有的操作都有记录,以避免文件系统损坏导致的数据丢失
通过网络储存到远端的计算机
NFS、CIFS
对于分布式文件系统,有个麻烦,在本地只需要标识这个用户是谁,而在网络上识别一个用户是复杂的。因此NFS是不安全的
前面说的管道就是一类特殊的文件系统
21.4 虚拟文件系统
虚拟文件系统(VFS)
文件系统的基本数据结构
文件系统的组织视图
由文件卷控制块vol,到每一个目录项,目录项组织成一个树状结构,再往下是每一个文件的文件控制块,文件控制块知道实际文件中的数据块
文件系统的存储结构
21.5 文件缓存和打开文件
多种磁盘缓存位置
数据块缓存
文件系统中打开文件的数据结构
打开文件锁
21.6 文件分配
文件大小
大多数文件都很小,块空间如果太大,存储效率会比较低。文件小时相对的,随时间和应用的变化而不同。
描述数据块数量,确定一个能存放的最大的文件大小
文件分配
如何表示分配给一个文件数据块的位置和顺序
连续分配,分配一个起点,然后用连续的数据块来存文件
链式分配,告诉你第一块一直到最后一块的位置
专门有个地方存索引,根据索引找到位置
连续算法有外部碎片问题,链式分配需要遍历列表读写性能较差
连续分配:
分配策略 最先匹配、最佳匹配
长度增加时,后面块被其他文件占用了,这时比较棘手
链式分配:
缺点也很明显,有一个链损坏了,后面的就都找不到了,并且要找到某一块只能按顺序一块一块地找过去
索引分配:
文件头里有索引块,索引块里有每一个块的位置
缺点是文件很小时,一块数据块就够了,但是还要创建一个索引块,存储开销比较大;如果不支持增加多个索引块,那么对于大个的数据块,就不好新分配空间了
UFS(Unix File System)多级索引分配
在一个文件数据块里,前面10个是直接索引,如果存的比较少,就索引直接到文件对应的数据块
如果不够,第十一个指针指向一级间接索引,这里有N个数据块
还不够,就采用二级间接索引
还不够,继续加
总计
21.7 空闲空间管理和冗余磁盘阵列RAID
空闲空间管理
位图:
链表:
冗余磁盘阵列RAID
在A、B两个分区上切换时,性能是很差的
一个典型的磁盘文件系统组织
多磁盘管理
RAID-0:磁盘条带化
读写速度变为之前的三倍,但是对于小数据来说,并不需要一次读三个
RAID-1:磁盘镜像
提高了可靠性
RAID-4:带校验的磁盘条带化
任何一个有错,都能从最后一个校验磁盘把正确的数据恢复出来
RAID-5:带分布式校验的磁盘条带化
和RAID-4相比,是把校验和的存放位置做了一个分布,不是把校验和固定地存放在某个磁盘上,这种做法可以把校验磁盘的访问瓶颈分摊开,提高性能
基于位和基于块的磁盘条带化
RAID0+1条带化+磁盘镜像