1.总体介绍
文件系统是操作系统一个重要的子系统,方便读写磁盘上的数据。主要讲述三方面内容,第一方面是从用户角度介绍如何进行文件读写操作,第二方面是介绍文件读写操作系统如何实现,最后一部分是介绍多磁盘管理。
2.文件系统和文件
文件系统是一种用于持久性存储的系统抽象,也就是断电后数据不会丢失,比如说磁盘。
- 要让用户组织、控制、导航、访问和检索数据
- 大多数的计算机系统包含文件系统,以及个人电脑、服务器、笔记本电脑、ipod,机顶盒等都有文件系统
- Google也是由一个文件系统构成的(GFS)
文件是具有符号名,由字节序列构成的数据项集合。
- 文件是文件系统的基本数据单位
- 文件名是文件的表示符号
3.文件系统的功能
4.文件和块
文件的属性是用来表征文件的一些基本信息,储存在文件头里面。
5.文件描述符
从编程者的角度来看,通过字符串的名字打开文件,返回一个整形的文件描述符f,read(f)把f文件的内容读出来,最后close(f),大致就是这样一个模式。这里面最重要的就是这个整数形式的文件描述符,它代表文件给我们应用程序做各种各样的访问和控制,那整数如何代表呢?
其实文件描述符不仅仅是一个简单的数字,操作系统维护了一个打开文件表,文件描述符其实是一个index,指出了在打开文件表中的第几项代表这个文件,而每一项是包含了很多文件的描述信息,之后操作系统根据这些信息执行读和写操作。
管理文件数据需要以下东西:
从不同的视角看文件
访问模式
文件的结构
文件共享和访问控制
有文件访问控制列表来控制用户能否访问。Unix对三种不同的用户给予不同的权限。
语义一致性
语义其实简单来说就是,写的数据什么时候能够读到?能不能读?
6.目录
为什么要有目录?因为要组织文件,如果把所有文件堆在一个一维面上的话,用户很难找到想要的文件。所以通过分层的方式,通过目录,便于查找和组织文件。
目录的典型操作(结合日常使用计算机的经验)
目录的操作应该结合操作系统完成。
目录设计
那么怎么来存目录里的文件,其实比较容易实现,把目录想成一个集合,这个集合里有很多文件,只要有不同的文件名就可以存在这个文件当中。
文件的数据结构设计:
名字解析(路径遍历)
可以从根目录逐一解析,直到找到文件,当然也可以设计缓存加快寻找的效率,后面会提到。
文件系统挂载
在我们的操作系统中,有不同的文件系统,不同的文件系统要挂在不同的目录下,来形成一个分层次的跨文件系统的访问,把不同系统根目录的位置称为挂载点。
7.文件别名
有可能多个文件名关联一个文件,也就是一个文件有多个名字,在操作系统中有两种实现方式:硬链接和软连接。
如果删除一个有别名的文件,这个别名会成为一个“悬空指针”。
如果有别名机制,就有可能出现潜在的循环。
文件目录中的循环
8.文件系统种类
9.虚拟文件系统
操作系统就是解决复杂问题,提供接口给用户以便用户简单使用,不用顾忌底层实现。
目的
虚拟文件系统(VFS)的目的是对所有不同文件系统做抽象,给上层提供接口。
功能
虚拟文件系统数据结构
文件系统的组织视图
文件系统的存储结构
10.数据缓存
访问硬盘的速度比访问内存的速度慢很多,为了提高速度,需要在内存中放一个缓存,把经常用到的或者经常访问到的数据存储在内存中,提高下次访问的效率。
我们希望能将前面所讲的分页机制和缓存机制相结合:
11.打开文件的数据结构
文件是一个共享的资源,可能存在锁的保护机制,操作系统和文件系统会调节对文件的访问。
12.文件分配
如果打开文件后执行写操作,就要涉及到文件空间管理,如何对文件空间的增加或减少进行分配。
评价文件分配方式的指标是是否高效,存储效率是否高效,读写性能是否高效,空间利用率高不高。
连续分配
数据是用数组方式组织起来的,因为分配是连续的,缺点是要做扩展的话需要把后面的数据挪位置。也有适合的场景,比如说只读的光盘就很适合它应用。但要灵活地添加、删除、扩展,就会造成很大的开销。
链式分配
数据是用链表方式组织起来的,缺点是访问是一种串式访问的方式,不能实现高效的随机访问,除此之外链被破坏数据容易丢失。
索引分配
缺点在于文件比较小时(甚至小于索引大小),存储索引信息的冗余会比较大;文件比较大时,一个索引块能够描述的数据块的个数是有限的,如果文件很大,那么可能一个索引块就不够了,如果要扩增索引块,就退化到了数组的方式。
大文件利用分级索引实现:
修改后的多级索引机制可以应对大文件、小文件,是一种比数组和链表更有效的组织方式。
13.空闲空间链表
操作系统需要跟踪在存储中的所有未分配的数据块,会遇到以下问题:
- 空闲空间列表存储在哪里?
- 空闲空间列表的最佳数据结构是什么样子?
14.多磁盘管理-RAID
分区:硬件磁盘的一种适合操作系统指定格式的划分
卷:一个拥有一个文件系统实例的可访问的存储空间,通常常驻在磁盘的单个分区上
利用多个并行磁盘可增加吞吐量、可靠性和可用性。
多磁盘目的
吞吐量:把数据放在独立的磁盘上,通过并行的工作,实现并行的数据访问,可以增大吞吐量。
可靠性:在执行写操作的时候,对两个硬盘执行同样的写操作,如果一个硬盘崩了,第二个硬盘可以替换第一个,容错,写入代价增高。
各种RAID
下图是各个RAID比较,图来自https://www.cnblogs.com/cishi/p/692097e3540da2c23fe8a250afc97cc1.html