一. 文件系统基本概念
- 文件系统和文件
文件系统:是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件系统,文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法,也指用于存储文件的磁盘或分区,或文件系统种类。
文件:文件系统中一个单元的相关数据在操作系统中的抽象
- 文件系统功能
文件系统为文件分配磁盘空间,管理一个文件存在磁盘的什么位置;管理空闲空间,知道没存数据的数据块在什么位置;分配算法,磁盘上有很多空闲的磁盘块,要分配一部分磁盘块来存文件数据时,要知道选哪块。
文件系统管理文件集合。提供定位功能,给文件名要知道这个文件名对应的文件在哪里;命名,通过名字找到文件;文件系统结构,如何把这些文件组织成整体。
文件系统保护数据可靠安全。
- 文件属性
文件里的信息分为文件头和文件体。 - 文件描述符
操作系统内核维护了打开文件的相关信息,操作系统为每个进程维护一个打开文件表,文件表里的每一项对应一个打开的文件,文件描述符是打开文件的标识。
文件描述符是操作系统在打开文件表中维护的打开文件的状态和信息。
包括:(1)文件指针:最近一次读写位置。每个进程分别维护自己的打开文件指针。
(2)文件打开计数:当前文件打开的次数
(3)文件的磁盘位置:会把一部分磁盘上的数据缓存到内存
(4)访问权限:每个进程的文件访问模式信息
- 文件的用户视图和系统视图
数据块是逻辑存储单元,而扇区是物理存储单元。
**将存满存储器一页的数据记在磁带上,称一个数据块。**磁盘的最小访问单位是数据块,不能对块中单独的字节进行读写。操作系统把文件视为数据块的集合。
- 进程对文件的访问模式
索引访问文件示例: 我想找文件里的某一个记录,根据索引文件找到记录对应的位置在哪,
- 文件内部结构:分3类
操作系统不关心文件结构。 - 文件共享和访问控制
- 目录
目录操作:创建文件要添加相应目录项,删除文件要删除对应目录项,重命名文件就需要改目录项中相应的文件名。
目录的实现:如何组织目录里文件的列表
- 文件别名
一个文件我想给他起多个名字时
- 名字解析:如何找一个文件
目录这个文件有文件头,目录的数据块里有这个目录的所有文件和子目录的列表。
- 文件系统种类
二. 虚拟文件系统
文件系统的实现:分层结构
为了面对我们有多种文件系统,在操作系统中希望对上提供统一的接口。
虚拟文件系统对上层应用提供统一的文件访问和文件系统控制的系统调用接口;在虚拟文件系统内部维护所有文件和文件系统相关联的数据结构;对下面实际的文件系统提供相应的访问接口。
虚拟文件系统的目的:对所有不同文件系统的抽象
虚拟文件系统的数据结构:
虚拟文件系统的组织视图:
文件卷控制块到每一个目录项,这些目录项组织成树状结构,树状结构再往下一层是每一个文件的文件控制块,文件控制块知道实际的文件里头的数据块。
虚拟文件系统的存储:
虚拟文件系统的数据结构(包含文件卷控制块、文件控制块、目录项)都要存储在磁盘的数据块中,当需要加载时,把相应数据块加载到内存里。
知道虚拟文件系统的视图,就知道在虚拟文件系统中需要保存的各个文件系统的公共信息,就通过虚拟文件系统把实际的文件系统和应用之间的间距弥补上了,就可以通过统一的接口访问各种实际文件系统。
三. 文件缓存和打开文件
文件缓存:从磁盘上读数据到内存到CPU,中间会有多级缓存。内存和磁盘控制器中都有缓存,在操作系统中讨论的缓存是指内存中的数据块缓存。
数据块使用后会被缓存,日后这块数据块可能还会被用的,这时就不用再去磁盘上读了;写操作可能被延迟,先写到内存里的缓存里,后续再有修改,可以把两个写合并在一起再写,但这种操作可能有问题。
两种数据块缓存机制
13. 数据块缓存——以块为操作单位
是指读磁盘里内容放到内存里,标记这块内存是磁盘的缓存,以后读磁盘时先查这块缓存。
14. 页缓存——以页为单位的所有操作
背景:虚拟存储会把物理内存不够用的地方放到外存里。逻辑地址空间里的页面经过内核的虚拟存储管理机构,可以把页面映射到物理内存或外存,利用这种方式可以扩展进程可用的逻辑地址空间。
页缓存:把文件缓存到内存中,把文件读写转换成对内存的访问。
页缓存是Linux内核一种重要的磁盘高速缓存,以页为大小进行数据缓存,它将磁盘中最常用和最重要的数据存放到部分物理内存中,使得系统访问块设备时可以直接从主存中获取块设备数据,而不需从磁盘中获取数据。在大多数情况下,内核在读写磁盘时都会使用页缓存。内核在读文件时,首先在已有的页缓存中查找所读取的数据是否已经存在。如果该页缓存不存在,则一个新的页将被添加到缓存中,然后用从磁盘读取的数据填充它。
打开某一个文件,对应的目录项、文件控制块、文件中内容在内存中缓存的记录构成系统打开文件表中的一项,系统打开文件表有些内容不同进程是不一样的,不同部分构成进程打开文件表,共同部分在系统打开文件表中。
有多个进程共享同一个文件时,需要协调对它的访问。操作系统提供文件锁机制
四. 文件分配
文件分配是指我们把哪些数据块分配给一个文件来存它的数据。重点在于如何表示分配给一个文件的数据块位置和顺序。
分配方式:
(1)连续分配:连续的若干个数据块用来存这个文件。在文件头(文件控制块)里记录起始第一块的位置和长度。下图中蓝色的就是这个文件占用的数据块。
(2)链式分配:文件头有指向第一个数据块的指针,第一块有指向第二块的指针…文件头中还有指向最后一个数据块的指针。
(3)索引分配:为每个文件创建一个索引数据块,标识都有哪些块存了数据,这些块的顺序如何。
**文件头里存有指向索引数据块的指针。索引数据块的内容是指向所有数据块的指针列表。**通过文件头可以知道索引数据块在哪,通过索引数据块可以知道每一个数据块的位置。
下图中I是文件头,IB是索引块。
(4)链式索引块:总体上是索引方法,索引块指向数据块,索引块之间是链式,
实际unix系统里的文件分配方式:
文件控制块中,前10个数据块的位置都标在文件控制块中;另外文件控制块中有指向索引块,索引块指向实际数据块。若一级索引不够用,还可以二级索引。
五. 空闲空间管理
- 位图法
每一块占一位,所有块对应的所有位放在一起,构成空闲数据块的列表。
160GB的硬盘,共有40M个的4kB数据块,1块一bit,所以位图需要5MB的存储空间。 - 其他空闲空间管理方法
如链表法等
六. 冗余磁盘阵列RAID——是一种提高文件系统可靠性和读写性能的一种技术。
1.磁盘分区
通过限制寻道时间来提高性能。
但操作系统在两个分区上进行切换时,性能很差,没法提高读写性能和可靠性
典型文件系统分区的做法:
2.多磁盘管理:利用多个独立的磁盘同时使用来提高性能,通过并行提高吞吐量,通过冗余(如一个数据存多份)提高可靠性。
具体来说,冗余磁盘阵列是一组磁盘管理的技术,通过条带化、映像
(1)磁盘条带化——提高读写的磁盘带宽(吞吐量)
一定要是独立的磁盘,把一个硬盘分成多个逻辑分区是不起作用的。
3个独立磁盘,读写数据可以3个磁盘一起读写,速度可提高。
(2)磁盘镜像——提高可靠性
向两个磁盘写入相同的数据,读取时可以从任何一个来读。
(3)带校验的磁盘条带化
一个数据块分4个磁盘存储,依据前面4个子数据块存校验和,读的时候把4个全读出来,任何一个子数据块有错,可以把它恢复出来。
(4)带分布式校验的磁盘条带化
把每一块数据块分散到5个磁盘上,校验和放在5号磁盘;;下一次校验和不存到5上了。
不把校验和存放于固定磁盘上,减小对校验和所在磁盘的读写压力。