文件系统(上)

简介: 文件系统(上)

基本概念



文件系统和文件


文件系统: 一种用于持久性存储的系统抽象


  • 在存储上: 组织,控制,导航,访问和检索数据
  • 在大多数计算机系统包含文件系统
  • 个人电脑,服务器,笔记本电脑
  • ipod,tivo,机顶盒,手机,电脑
  • google可能也是由一个文件系统构成的


文件: 文件系统中的一个单元的相关数据在操作系统中的抽象


文件系统的功能:


  • 1. 分配文件磁盘空间


管理文件块(哪一块属于哪一个文件)

管理空闲空间(哪一块是空闲的)

分配算法(策略)


  • 2**. 管理文件集合**


定位文件及其内容

命名: 通过名字找到文件的接口

最常见: 分层文件系统

文件系统类型(组织文件的不同方式)


  • 3. 提供的便利及特征


保护: 分层来保护数据安全

可靠性,持久性: 保持文件的持久即使发生崩溃,媒体错误,攻击等

文件和块:


文件属性:


名称,类型,位置,大小,保护,创建者,创建时间,最久修改时间…


文件头:


在存储元数据中保存了每个文件的信息,保存文件的属性,跟踪哪一块存储块属于逻辑上文件结构的哪个偏移


文件描述符


1.文件使用模式:


使用程序必须在使用前先”打开”文件 open(name, flag)


1.内核跟踪每个进程打开的文件:

  • 操作系统为每个进程维护一个打开文件表
  • 一个打开文件描述符是这个表中的索引

1688892126665-9f351ce8-0cb0-4291-a507-49c36f5fbc7a.png


1.需要元数据来管理打开文件:


  • 文件指针: 指向最近的一次读写位置,每个打开了这个文件的进程都这个指针
  • 文件打开计数: 记录文件打开的次数 - 当最后一个进程关闭了文件时,允许将其从打开文件表中移除
  • 文件磁盘位置: 缓存数据访问信息
  • 访问权限: 每个程序访问模式信息


3_1. 用户视图: 持久的数据结构


3_2. 系统访问接口


字节的集合(UNIX)


系统不会关心你想存储在磁盘上的任何的数据结构


3_3. 操作系统内部视角:


块的集合(块是逻辑转换单元,而扇区是物理转换单元)


块大小<> 扇区大小: 在UNIX中, 块的大小是 4KB


当用户说: 给我2-12字节空间时会发生什么?


  1. 获取字节所在的快
  2. 返回快内对应部分


如果要写2-12字节?


  1. 获取块
  2. 修改块内对应部分
  3. 写回块


在文件系统中的所有操作都是在整个块空间上进行的:


getc() putc() 即使每次只访问1字节的数据,也会缓存目标数据4096字节(一个磁盘块)


用户怎么访问文件:


1.在系统层面需要知道用户的访问模式


2.顺序访问: 按字节依次读取


(几乎所有的访问都是这种方式)

3.随机访问: 从中间读写


4.(不常用,但是仍然重要,如: 虚拟内存支持文件,内存页存储在文件中;

更加快速,不希望获取文件中间的内容的时候也必须先获取块内所有字节)


5.内容访问: 通过特征( 比较少用 )


文件内部结构


  1. 无结构: 单词,比特的队列
  2. 简单记录结构: 列;固定长度;可变长度
  3. 复杂结构: 格式化的文档(word, PDF); 可执行文件;…


文件访问的访问控制


多用户系统中的文件共享是很必要的


1.访问控制:


谁能够获得哪些文件的哪些访问权限


访问模式: 读,写,执行,删除,列举等


1.文件访问控制列表(ACL):


<文件实体, 权限>


1.UNIX模式:


  • <用户|组|所有人,读|写|可执行>
  • 用户ID识别用户,表明每个用户所允许的权限及保护模式
  • 组ID允许用户组成组,并指定了组访问权限


1.指定多用户,客户如何同时访问共享文件:


  • 和过程同步算法相似
  • 因磁盘IO和网络延迟而设计简单


UNIX文件系统(UFS)语义:


多个系统/用户如何同时访问文件


对打开文件的写入内容立即对其他打开同一文件的其他用户可见


共享文件指针允许多用户同时读取和写入文件


会话语义:


写入内容只有当文件关闭时可见


锁:


一些操作系统和文件系统提供该功能


目录


文件以目录的方式组织起来


目录是一类特殊的文件:


每个目录都包含了一张表<name, pointer to file header>


目录和文件的树形结构:


早期的文件系统是扁平的(只有一层目录)


层次名称空间:

1688893070408-667233db-7404-448d-a751-4e20356b1cf5.png



具体操作 :


  • 搜索文件
  • 创建文件
  • 删除文件
  • 枚举目录
  • 重命名文件


操作系统应该只允许内核模式修改目录(root用户)


为 确保映射的完整性; 应用程序能够读目录(ls)


文件名的线性列表,包含了指向数据块的指针:


编程简单 ; 执行耗时


Hash表 - hash数据结构的线性表:


减少目录搜索时间;碰撞;固定大小


文件名的解析


逻辑名字转换成物理资源(如文件)的过程:


  • 在文件系统中: 到实际文件的文件名(路径)
  • 遍历文件目录直到找到目标文件

1688893379365-299d3a96-aaba-4275-850c-9251b3e370a5.png


当前工作目录


  1. 每个进程都会指向一个文件目录用于解析文件名
  2. 允许用户指定相对路径来代替绝对路径
  3. 一个文件系统需要先挂载才能被访问
  4. 一个未挂载的文件系统被挂载在挂载点上


1688893523398-77635847-db79-47d7-9583-e51c92fdd1f5.png


文件别名


两个或多个文件名关联同一个文件:

1688893602806-f6534e50-4f75-4eff-8f6f-9327996936a7.png


  1. 硬链接: 多个文件项指向一个文件
  2. 软链接: 以快捷方式指向其他文件
  3. 通过存储真实文件的逻辑名称来实现


如果删除一个有别名的文件会如何呢?


: 这个别名将成为一个悬空指针


Backpointers方案:


1688893703740-7bf3861c-5f09-4e59-b5d6-83cc52360b38.png

1.添加一个间接层: 目录项数据结构

  • 链接: 已存在文件的另外一个名字(指针)
  • 链接处理: 跟随指针来定位文件


1688893786855-457ca7f5-b40b-4d6e-8ec5-29ae068c56f6.png

相对于方案二 他会形成一个环。


如何保证没有循环呢 ?


  • 只允许到文件的链接, 不允许在子目录的链接
  • 每增加一个新的链接都用循环检测算法确定是否合理
  • 限制路径可遍历文件目录的数量


文件系统种类


1.磁盘文件系统:

文件存储在数据存储设备上,如磁盘; 例如: FAT,NTFS,ext2,3,ISO9660等


1.数据库文件系统:

文件根据其特征是可被寻址的; 例如: WinFS


1.日志文件系统:

记录文件系统的修改,事件; 例如: journaling file system


1.网络,分布式文件系统:

例如: NFS,SMB,AFS,GFS


1.特殊,虚拟文件系统

网址等


1.文件可以通过网络被共享


1688894321755-b37f5b65-1b68-4a75-95cd-2f65cf839afe.png

1.分布式文件系统的问题

1688894335496-ce54dae6-db16-4afd-a068-a79c87c3ec71.png



目录
相关文章
|
6月前
|
存储 负载均衡 算法
p2p的文件系统
p2p的文件系统
64 4
|
5月前
|
存储 数据可视化 Linux
文件系统-
文件系统-
43 0
|
8月前
|
存储 缓存 算法
文件系统(下)
文件系统(下)
140 0
|
8月前
|
存储 Linux Windows
【文件系统】
【文件系统】
72 0
|
10月前
|
存储 块存储 内存技术
(10)ArduPilot文件系统
(10)ArduPilot文件系统
104 0
|
存储 Unix Linux
|
存储 Linux 内存技术
文件系统
文件系统
94 0
|
存储 IDE Linux
|
存储 Linux 索引
磁盘文件系统二
磁盘文件系统二
磁盘文件系统二
|
存储 安全 Linux
磁盘文件系统三
磁盘文件系统三
磁盘文件系统三