文件系统和文件:
- 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能,组织、检索、读写访问数据。
- 文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件的标识符号。
文件系统功能:
- 分配文件磁盘空间:管理文件块(位置和顺序)、管理空闲空间(位置)、分配算法(策略)
- 管理文件集合:Ⅰ、定位(文件及其内容);Ⅱ、命名(通过名字找到文件);Ⅲ、文件系统结构(文件组织方式)
- 数据可靠和安全:安全(多层次保护数据);可靠(持久保存文件,避免系统崩溃、媒体错误、网络攻击等)
文件属性:
- 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间等
- 文件头:文件系统元数据中的文件信息
文件描述符:
文件访问方式:进程访问文件数据前必须先打开文件
内核跟踪进程打开的所有文件:操作系统为每个进程维护一个打开文件表,文件描述符是打开文件的标识,即 文件描述符是操作系统在打开文件表中维护的打开文件状态和信息,其中包括:
- 文件指针:a. 最近一次读写位置;b.每个进程分别维护自己的打开文件指针
- 文件打开计数:a. 被打开文件当前被打开的次数,b. 最后一个进程关闭文件时,将其从打开文件表中移除
- 文件磁盘位置:缓存数据访问信息
- 访问权限:a. 每个进程的文件访问模式(只读、可写等)
文件的用户视图和系统视图
- 文件的用户视图:持久的数据结构
- 系统访问接口:a.字节序列的集合(UNIX);b. 系统不关心存储在磁盘上的数据结构,应用程序应该关心。
- 操作系统内部视角 :a.数据块的集合,b.块是逻辑存储单元,而扇区是物理存储单元,c. 块大小与扇区大小可以不相等,通常是几个扇区构成一个数据块
用户视图到系统视图的转换:
- 进程读文件:a. 获取字节所在的数据块,b. 返回数据块内对应内容
- 进程写文件:a. 获取数据块,b. 修改数据块中对应内容,c. 写回数据块
- 文件系统中的基本操作单位是数据块
访问模式:
- 顺序访问:按字节顺序一次读取(大多数)
- 随机访问:从中间读写(不常用,但很重要,比如虚拟内存中把内存页存储在文件)
- 索引访问:依据数据特征索引,操作系统通常不提供文正索引访问,可以在上面建数据库,数据块建立索引内容
文件内部的结构(操作系统不关心):应用系统打开复杂文件,但对操作系统该文件可能很简单
- 无结构:单词、字节的队列
- 简单记录结构:列,固定/可变长度
- 复杂结构:格式化文档(MS Word, PDF),可执行文件
文件共享和访问控制:
- 多用户系统中文件共享是很必要的,需要对访问进行控制:a. 每个用户能够获得哪些文件的哪些访问权限,b. 访问模式:读、些、执行、删除、列表等
- 操作系统维护文件访问控制列表(ACL):a. 每个文件每个用户有哪些权限 <用户|组|所有人, 读|写|可执行>,b. 用户识别ID,识别用户,表明每个用户所允许的权限及保护模式,c. 组识别ID,允许用户组成组,指定组访问权限
语义一致性:
- 规定多进程如何同时访问共享文件:a. 与同步算法相似:b. 因磁盘I/O和网络延迟而设计简单
- 1.Unix文件系统(UFS)语义(将一致性问题甩给应用程序去处理):a. 对打开文件的写入内容立即对其他打开同一文件的其他用户可见,b. 共享文件指针允许多用户同时读取和写入文件
- 2.会话语义:a. 写入内容只有当文件关闭时可见
- 3.读写锁
目录:
文件以目录的形式组织起来,目录是一类特殊的文件,目录的内容是文件索引表<文件名,指向文件的指针>,目录和文件是树状结构。
目录的操作:搜索,创建,删除,枚举,重命名,在文件系统中遍历一个路径
目录实现:
- 文件名的线性列表,包含指向数据块的指针,编程简单,执行耗时
- 哈希表,搜索快速,引起冲突,长度固定
文件别名:
硬链接与软链接:
- 硬链接:多个文件项指向一个文件,删除到最后一个指向他的文件名时删除实体
- 软链接:以快捷方式指向其他文件,删除快捷方式不影响实体,删除实体则快捷方式无效了
文件目录中的循环:
避免方式:
- 只允许到文件的链接,不允许到目录的链接
- 增加链接时,用循环检测算法确定是否合理
- 实际操作系统中通常限制路径可遍历文件目录的数量,超过指定长度停止检索
名字解析(路径遍历):
名字解析即把逻辑名字转换成物理资源,有两种方式:
- 依据路径名,在文件系统中找到实际文件位置,
- 进程设置当前工作目录,从工作目录开始往下解析,用相对路径代替绝对路径
- 例子:解析“/bin/ls”:读取根目录的文件头;读取根目录的数据块,搜索"bin“项;读取bin的文件头;读取bin的数据块,搜索"ls"项;读取ls的文件头。
文件系统挂载:
文件系统需要先挂载才能被访问,未挂载的文件系统被挂载到挂载点上才能被找到。
文件系统种类:
- 磁盘文件系统:a. 文件存储在数据存储设备上,如磁盘,b. 例如:FAT、NTFS、ext2/3,ISO9660等
- 数据块文件系统:a. 文件特征可悲寻址,b. 例如WinFS
- 日志文件系统:a. 记录文件系统的修改/事件
- 网络/分布式文件系统:a. 例如:NFS,SMB,AFS,GFS。 b. 文件可以通过网络被共享,文件位于远程服务器,客户端远程挂载服务器文件系统,标准系统文件访问被转换成远程访问,要有标准文件共享协议。c. 面临更多挑战,例如客户端用户辨别、一致性问题、错误处理模式。
文件系统的实现
分层结构:虚拟文件系统(VFS,Virtual File System)、特定文件系统模块
虚拟文件系统:
虚拟文件系统的提出是为了面对多种不同的文件系统对上提供一种统一的接口。
目的:
1.对所有不同文件系统的抽象
功能:
1.提供相同的文件和文件系统接口(对上)
2.管理所有文件和文件系统关联的数据结构
3.高效查询历程,遍历文件系统
4.与特定文件系统模块的交互(对下)
文件系统基本数据结构:
1.文件卷控制块(Unix:superblock)
a. 每个文件系统一个
b. 文件系统详细信息
c. 块、块大小、空余块、计数/指针等
2.文件控制块(Unix:vnode || inode)
a. 每个文件一个
b. 文件详细信息
c. 访问权限、拥有者、大小、数据块位置等
3.目录项(Linux:dentry)
a. 每个目录项一个(目录和文件)
b. 将目录项数据结构及树形布局编码成树形数据结构
c. 指向文件控制块、父目录、子目录等
上述数据结构需要持久存储在外存中,当需要时加载进内存:
1.卷控制块:当文件系统挂载时进入内存;
2.文件控制块:当文件被访问时加载进内存
3.目录项:便利一个文件路径时进入内存
文件缓存与打开文件:
多个位置都存在磁盘缓存,操作系统主要讨论内存中的数据块缓存。
数据块缓存:
1.数据块按需存入内存
a. 提供read()操作
b. 预读:预先读取后面的数据块
2.数据块使用后被缓存
a. 假设数据将会再次用到
b. 写操作可能被缓存和延迟写入
3.两种数据块缓存方式
a. 数据块缓存
b. 页缓存:同一缓存数据块和内存页
打开文件的数据结构:
每个被打开的文件都有一个文件描述符,包含了文件状态信息:目录项、当前文件指针、文件操作设置等
每个进程管理一个进程打开文件表,系统还维护一个系统级的打开文件表,有文件打开时,文件卷就不能被卸载。
打开文件锁
有了打开文件表,文件系统可以提供打开文件锁,用于协调多进程的文件访问:
1.强制:根据锁保持情况和访问需求确定是否拒绝访问
2.劝告:进程可以查找锁的状态来决定怎么做
文件大小:
大多数文件都很小:
a. 需要对小文件提供很好的支持
b. 块空间不能太大
一些非常大的文件
a. 必须支持大文件(64位文件偏移)
b. 大文件访问必须高效
文件分配:
本质是如何表示分配给一个文件数据块的位置和顺序
分配方式:
a. 连续分配:
文件头指定起始块和长度
分配策略:最佳匹配、最先匹配
优点是文件读取表现好,高效的顺序和随机访问,缺点是碎片,文件增长问题,文件增大时的策略比较棘手
b. 链式分配:
文件以数据库链表方式存储
文件头包含了到第一块和最后一块的指针
优点是创建、增大、缩小都很容易,没有碎片,但是随机访问无法实现,效率低。可靠性较差,一个链被破坏,后面的数据块就丢失了。
c. 索引分配:
为每个文件创建一个索引数据块,指向文件数据块的指针列表
文件头包含了索引数据块指针
优点是创建、增大、缩小容易,没有碎片,支持直接访问,缺点是文件很小时,存储索引开销大,大文件索引块可能大小不够。
指标:
a. 存储效率:外部碎片等
b. 读写性能:访问速度
实际文件系统中通常几种方式组合应用,例如对大文件索引块使用链表组织,多级索引。
空闲空间管理:
空闲空间管理是指跟踪记录文件卷中未分配的数据块。
空闲空间组织方式:
1.位图法:使用简单,但大磁盘需要一个很大的向量表记录空闲空间。
2.链表法
3.链式索引
典型的磁盘文件系统组织
分区:硬盘磁盘的一种适合操作系统指定格式的划分
文件卷:一个拥有一个文件系统实例的可访问的外存空间
冗余磁盘阵列RAID:
希望使用多磁盘改善吞吐量、可靠性和可用性,以提高性能。如RAID0,RAID1,RAID4。
冗余磁盘阵列的实现:
1.软件:操作系统内核的文件卷管理
2.硬件:RAID硬件控制器(I/O)
RAID0(磁盘条带化):
把数据块分成多个子块,存储在独立的磁盘中,通过独立磁盘上并行访问数据块提供更大的磁盘带宽
RAID1(磁盘镜像):
同时向两个磁盘写入相同的数据,可靠性成倍增长,读取性能线性提升
RAID4(带校验的磁盘条带化):
数据块级的磁盘条带化加专用奇偶校验磁盘,一个磁盘专用于奇偶校验,允许只有一个磁盘发生故障时进行数据恢复
RAID5(带分布式校验的磁盘条带化):
数据块的校验和不单独存放在固定的一个磁盘中,而是分布在多个磁盘中,减少对RAID4中奇偶校验磁盘的读写压力
RAID6(每组条带有两个冗余块),允许两个磁盘出错