文件系统
文件系统和文件
- 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能
- 组织、检索、读写访问数据
- 大多数计算机系统都有文件系统
- 文件是具有符号名,由字节序列构成的数据项集合
- 文件系统的基本数据单位
- 文件名是文件的标识符号
File System components
- Naming: Interface to find files by name, not by blocks
- Disk Management: collecting disk blocks into files
- Protection: Layers to keep data secure
- Reliability/Durability: Keeping of files durable despite crashes, media failures, attacks, etc.
文件系统的功能
- 分配文件磁盘空间
- 管理文件块的位置和顺序
- 管理空间空间的位置
- 分配算法
- 管理文件集合
- 定位:通过名字找到文件
- 命名
- 文件系统结构:文件组织方式
- 数据可靠和安全
- 安全:多层次保护数据安全
- 可靠:
- 持久保存文件
- 避免系统崩溃,媒体错误,攻击等
文件属性
- 文件属性:名称、类型、位置、大小、保护、创建者、创建时间
- 文件头:文件系统元数据中的文件信息
- 文件属性
- 文件存储位置和顺序
打开文件和文件描述符
- 文件访问模式
- 进程访问数据前必须先打开文件
- 内核跟踪进程打开的所有文件
- 操作系统为每个进程维护一个打开文件表
- 文件描述符是打开文件的标识
文件描述符
- 已打开文件的状态和信息
- 文件指针
- 最近一次读写位置
- 每个进程分别维护自己的打开文件指针
- 文件打开计数
- 当前打开文件的次数
- 最后一个进程关闭文件时,将其从打开文件表中移除
- 文件的磁盘位置
- 缓存数据访问信息
- 把一部分磁盘上的文件内容缓存到内存当中
- 访问权限
- 每个进程的文件访问模式
文件的用户视图和系统视图
- 用户视图
- 用户进程看到的:持久的数据结构
- 系统视图
- 数据块的集合
- 数据块是逻辑存储单元,可能由多个扇区组成,
- 扇区是物理存储单元
- 块大小!=扇区大小
用户视图到系统视图的转换
- 进程读文件
- 获取字节所在的数据块
- 返回数据块内对应部分
- 进程写文件
- 获取数据块
- 修改数据块中对应部分
- 写回数据块
- 文件系统中的基本操作单位是数据块
- 例如,即使getc()和putc() 每次只访问1字节的内容,也需要缓存目标数据4096字节
访问模式
- 操作系统需要了解进程如何访问文件
- 顺序访问:按字节依次读取
- 大多数的文件访问都是顺序访问
- 随机访问:从中间读写
- 索引访问:依据数据特征索引
- 通常操作系统不提供完整索引访问
- 一种做法是:在操作系统上面通过数据库建立索引访问方式
文件内部结构
- 无结构
- 单词、字节序列
- 简单记录结构
- 分成若干列
- 固定长度
- 可变长度
- 复杂结构(操作系统提供一定程度的判断)
- 格式化的文档
- 可执行文件
- …
分层文件系统
- 文件以目录的方式组织起来
- 目录是一类特殊的文件
- 目录的内容是文件索引表<文件名,指向文件的指针>
目录操作
- 典型目录操作
- 搜索文件
- 创建文件
- 删除文件
- 列目录
- 重命名文件
- 遍历路径
- 操作系统应该只允许内容修改目录
- 确保映射的完整性
- 应用程序通过系统调用访问目录
目录实现
- 文件名的线性列表,包含了指向数据块的指针
- 编程简单
- 执行耗时
- 哈希表- 哈希数据结构的线性表
- 减少目录搜索时间
- 冲突 - 两个文件名的哈希值相同
- 目录表每一项长度是固定的??
文件别名
- 两个或多个文件名关联同一个文件
- 实现方法
- 硬链接:多个文件项指向同一个文件
- 软连接:以“快捷方式”指向其他文件
- 通过存储真实文件的完整路径
文件目录的循环
- 如何保证没有循环?
- 只允许到文件的链接,不允许到子目录的链接??
- 增加链接时,用循环检测算法确定是否合理,开销大
- 实际上,限制路径可遍历文件目录的数量
名字解析(路径遍历,找一个文件)
- 名字解析:把逻辑名字转换成物理资源
- 根据路径名,在文件系统中找到实际文件位置
- 遍历文件目录直到找到目标文件
文件系统种类
- 磁盘文件系统
- 文件存取在数据存储设备上,如磁盘
- 数据库文件系统
- 日志文件系统
- 网络/分布式文件系统
- 特殊/虚拟文件系统
常用文件系统
Disk Management Policies
Basic entities on a disk
- File: user-visible group of blocks arranged sequentially in logical space
- Directory: user-visible index mapping names to files
Access disk, two ways
- vector->[cylinder,surface,sector],not used anymore
- Logical Block Addressing(LBA): every sector has integer address from zero up to max number of sectors
- controller translates from address ->physical position
Need way to track free disk blocks
Need way to structure files :File Header
- Track which blocks belong at which offsets within the logical file structure
跟踪块位于逻辑文件结构的哪里
- Optimize placement of files‘ disk blocks to match access and usage patterns
优化块的分配, 为了匹配访问和使用模式
File System
- Layout
- contiguous allocation
- linked allocation
- inode allocation
Contiguous allocation - basics
- locating files is easy.
- deleting files is easy
- allocating files
- cause External Fragmentation
- Defragmentation process may help,but expensive
Linked allocation
- Keep the file size in the root directory
- Cause Internal Fragmentation
- a file is not always a multiple of the block size
- the last block of a file may not be fully filled
- poor random access performance
- if I want to access the 19th block
- have to access block 1st to 18th block
File allocation table(FAT)
重点:cluster id? 大端小端?最大的文件2的32次方-1byte?
- FAT32的目录遍历和目录表
- 目录和其他文件一样都是一个文件
FAT32删除文件的最后一步,为什么不直接在目录表中删除对应项?
只是对其文件名进行处理,对内容不做任何处理。对文件名的处理,就是把其相关的所有Directory entry的第一个byte都设置为OxE5,此时就认为该文件已经被删除了。
- FSINFO的作用
- offset :可用的下一段空间的长度
- next free cluster:下一个簇的id