基本概念
文件系统和文件
文件系统: 一种用于持久性存储的系统抽象
- 在存储上: 组织,控制,导航,访问和检索数据
- 在大多数计算机系统包含文件系统
- 个人电脑,服务器,笔记本电脑
- ipod,tivo,机顶盒,手机,电脑
- google可能也是由一个文件系统构成的
文件: 文件系统中的一个单元的相关数据在操作系统中的抽象
文件系统的功能:
- 1. 分配文件磁盘空间
管理文件块(哪一块属于哪一个文件)
管理空闲空间(哪一块是空闲的)
分配算法(策略)
- 2**. 管理文件集合**
定位文件及其内容
命名: 通过名字找到文件的接口
最常见: 分层文件系统
文件系统类型(组织文件的不同方式)
- 3. 提供的便利及特征
保护: 分层来保护数据安全
可靠性,持久性: 保持文件的持久即使发生崩溃,媒体错误,攻击等
文件和块:
文件属性:
名称,类型,位置,大小,保护,创建者,创建时间,最久修改时间…
文件头:
在存储元数据中保存了每个文件的信息,保存文件的属性,跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
文件描述符
1.文件使用模式:
使用程序必须在使用前先”打开”文件 open(name, flag)
1.内核跟踪每个进程打开的文件:
- 操作系统为每个进程维护一个打开文件表
- 一个打开文件描述符是这个表中的索引
1.需要元数据来管理打开文件:
- 文件指针: 指向最近的一次读写位置,每个打开了这个文件的进程都这个指针
- 文件打开计数: 记录文件打开的次数 - 当最后一个进程关闭了文件时,允许将其从打开文件表中移除
- 文件磁盘位置: 缓存数据访问信息
- 访问权限: 每个程序访问模式信息
3_1. 用户视图: 持久的数据结构
3_2. 系统访问接口
字节的集合(UNIX)
系统不会关心你想存储在磁盘上的任何的数据结构
3_3. 操作系统内部视角:
块的集合(块是逻辑转换单元,而扇区是物理转换单元)
块大小<> 扇区大小: 在UNIX中, 块的大小是 4KB
当用户说: 给我2-12字节空间时会发生什么?
- 获取字节所在的快
- 返回快内对应部分
如果要写2-12字节?
- 获取块
- 修改块内对应部分
- 写回块
在文件系统中的所有操作都是在整个块空间上进行的:
getc() putc() 即使每次只访问1字节的数据,也会缓存目标数据4096字节(一个磁盘块)
用户怎么访问文件:
1.在系统层面需要知道用户的访问模式
2.顺序访问: 按字节依次读取
(几乎所有的访问都是这种方式)
3.随机访问: 从中间读写
4.(不常用,但是仍然重要,如: 虚拟内存支持文件,内存页存储在文件中;
更加快速,不希望获取文件中间的内容的时候也必须先获取块内所有字节)
5.内容访问: 通过特征( 比较少用 )
文件内部结构
- 无结构: 单词,比特的队列
- 简单记录结构: 列;固定长度;可变长度
- 复杂结构: 格式化的文档(word, PDF); 可执行文件;…
文件访问的访问控制
多用户系统中的文件共享是很必要的
1.访问控制:
谁能够获得哪些文件的哪些访问权限
访问模式: 读,写,执行,删除,列举等
1.文件访问控制列表(ACL):
<文件实体, 权限>
1.UNIX模式:
- <用户|组|所有人,读|写|可执行>
- 用户ID识别用户,表明每个用户所允许的权限及保护模式
- 组ID允许用户组成组,并指定了组访问权限
1.指定多用户,客户如何同时访问共享文件:
- 和过程同步算法相似
- 因磁盘IO和网络延迟而设计简单
UNIX文件系统(UFS)语义:
多个系统/用户如何同时访问文件
对打开文件的写入内容立即对其他打开同一文件的其他用户可见
共享文件指针允许多用户同时读取和写入文件
会话语义:
写入内容只有当文件关闭时可见
锁:
一些操作系统和文件系统提供该功能
目录
文件以目录的方式组织起来
目录是一类特殊的文件:
每个目录都包含了一张表<name, pointer to file header>
目录和文件的树形结构:
早期的文件系统是扁平的(只有一层目录)
层次名称空间:
具体操作 :
- 搜索文件
- 创建文件
- 删除文件
- 枚举目录
- 重命名文件
操作系统应该只允许内核模式修改目录(root用户)
为 确保映射的完整性; 应用程序能够读目录(ls)
文件名的线性列表,包含了指向数据块的指针:
编程简单 ; 执行耗时
Hash表 - hash数据结构的线性表:
减少目录搜索时间;碰撞;固定大小
文件名的解析
逻辑名字转换成物理资源(如文件)的过程:
- 在文件系统中: 到实际文件的文件名(路径)
- 遍历文件目录直到找到目标文件
当前工作目录
- 每个进程都会指向一个文件目录用于解析文件名
- 允许用户指定相对路径来代替绝对路径
- 一个文件系统需要先挂载才能被访问
- 一个未挂载的文件系统被挂载在挂载点上
文件别名
两个或多个文件名关联同一个文件:
- 硬链接: 多个文件项指向一个文件
- 软链接: 以快捷方式指向其他文件
- 通过存储真实文件的逻辑名称来实现
如果删除一个有别名的文件会如何呢?
: 这个别名将成为一个悬空指针
Backpointers方案:
1.添加一个间接层: 目录项数据结构
- 链接: 已存在文件的另外一个名字(指针)
- 链接处理: 跟随指针来定位文件
相对于方案二 他会形成一个环。
如何保证没有循环呢 ?
- 只允许到文件的链接, 不允许在子目录的链接
- 每增加一个新的链接都用循环检测算法确定是否合理
- 限制路径可遍历文件目录的数量
文件系统种类
1.磁盘文件系统:
文件存储在数据存储设备上,如磁盘; 例如: FAT,NTFS,ext2,3,ISO9660等
1.数据库文件系统:
文件根据其特征是可被寻址的; 例如: WinFS
1.日志文件系统:
记录文件系统的修改,事件; 例如: journaling file system
1.网络,分布式文件系统:
例如: NFS,SMB,AFS,GFS
1.特殊,虚拟文件系统
网址等
1.文件可以通过网络被共享
1.分布式文件系统的问题