基本概念
文件系统和文件
文件系统:硬盘,持久性存储的系统抽象。
文件:系统内的一个单元。
- 文件系统功能
文件属性:名称、类型、创建者、时间。。
文件头:存储元数据信息、文件属性、跟踪哪一块存储块、属于逻辑上文件结构的哪个偏移。
文件描述符
操作系统内部视角
- 块的集合(块是逻辑转换单元,而扇区是物理转换单元)
- 块大小、扇区大小;unix中,块大小是4KB
用户看到和操作系统看到不同,操作系统看到的是一个个磁盘块,用户看到的是一维的线性空间。
用户对文件的访问
- 顺序访问
- 随机访问
- 基于内容的访问(基于索引访问)如下图
文件结构
访问控制
目录
目录也是文件,特殊的文件。
文件别名
一个文件多个名字,存在多个系统中便于分类查找。
文件系统类别
分布式文件系统
虚拟文件系统
存在意义:由于文件系统类型众多,便于管理。屏蔽具体文件系统差异性,给上层提供统一接口,可以提供查询、创建、读写打开关闭。
文件系统包括:
文件系统抽象图:
disk扇区,第一部分存储superblock,然后一层层找到vnode,最后找到具体的datablock。
数据块缓存
cpu缓存一些经常访问的数据,使得磁盘访问效率更高。
缓存方式:
基于分页的缓存机制
打开文件的数据结构
所谓打开,就是先查找,然后将硬盘里面存在的文件控制块的内容都到内存中,将相关信息放入打开文件表里面,设置为文件表里面一个item,再把这个项返回给应用程序。所以会有一个fd=open()。。。fd就是返回的index(记录在硬盘中的位置),接下来应用程序根据这个index进行读写。
如图:根据index找到文件。找到扇区中对应的文件后,读取到内存中来进行读写后,返回给应用程序。
文件分配
连续分配
扩展比较麻烦。类似数组的操作。
链式分配
数据块是链表的形式组织起来的
不能高效访问,从第一个开始找
索引分配
索引块指出了磁盘块的位置,放入文件头
索引块能表示的文件个数有限,大文件索引太多,索引块处理如下:
多级索引
1级索引 2级索引 3级索引
空闲列表
目的:快速找到空闲块位置。
紧凑空间代表磁盘块的空闲程度。
确保一致性问题:(已经分配了block,位没置1)
解决办法:先设置bit=1,在分配block。
链表可以快速找到空闲块的位置,而位图需要扫描。
多磁盘管理-RAID
如何管理:
RAID0
把数据分配在各个独立的磁盘中,访问数据可以实现并行
RAID1
提高可靠性,第一个和第二个硬盘完全一样。镜像作用。
RAID4
既能增加性能,又能提高可靠性。
disk1-disk4 类似raid0,把数据均匀分布到各个盘上。实现并行访问。
如果任何一块儿坏了,parity disk完成容错,通过奇偶校验反推出错误。恢复一个故障。
RAID5
奇偶校验均匀分布到每个disk,使得每个块开销是类似的。
校验开销均匀,且访问是并行的。综合了raid0和raid1的好处。保证了高可靠和效率。
奇偶校验单位
raid0 4 5 是block
raid 3 是bit 粒度太细
分层组织方式
磁盘调度
RAID:提高了磁盘访问的效率
磁盘调度:在os的层面,通过重新组织IO请求的顺序,来减少磁盘访问开销。
磁盘结构
旋转来寻道,磁头的前后移动来找到位置,读相应的扇区来完成读取工作。每个硬盘,有多个盘片,有正反面两个磁头来完成数据读取。
所有操作,旋转、前后移动都是机械操作。
磁盘访问效率图
磁盘IO开销:
- b/rN = 大致数据访问时间
- 寻道时间
- 旋转延迟时间
通过旋转来寻道,寻道时间是有很大差别的。
减少寻道时间方法:
-
先进先出
如图:来回折线,总的磁头移动距离很长。简单不高效。 -
最短服务优先
将来要访问的IO请求是离当前请求最短位置。
如果频繁出现在当前访问位置附近,远距离访问请求持续的饥饿。不均匀性很大。 -
电梯IO请求调度算法 C-SCAN
-
C-LOOP
最后一个后,直接从另一个磁道0开始访问了。
真实情况,目前都使用SSD了,不需要软件去控制,硬盘有自己的控制器,这些原理算法只需要理解即可。将来遇到类似问题可以有思路。
总结
虚拟文件系统:屏蔽底层多种文件系统的差异性,提供给上层一个更简洁的访问接口。
数据块缓存:提高访问效率,减少IO次数,提高系统整体效率。
打开文件数据结构:打开文件后,通过FD(标号)就可以对文件进行读写。
文件分配:文件里的内容怎么去分配。不同分配方式应对顺序读、随机读、扩展、删除。
空闲空间:它的表示基于位图、链式、管理空闲空间。