自学内容网 自学内容网

操作系统-4.2文件系统的层次结构&虚拟文件系统

文件系统的层次结构

在这里插入图片描述
用一个例子来辅助记忆文件系统的层次结构:
假设某用户请求删除文件“D:/工作目录/学生信息.xlsx”的最后100条记录。

  1. 用户需要通过操作系统提供的接口发出上述请求–用户接口
  2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项–文件目录系统
  3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限–存取控制模块(存取控制验证层)
  4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址–逻辑文件系统与文件信息缓冲区
  5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址–物理文件系统
  6. 要删除这条记录,必定要对磁盘设备发出请求–设备管理程序模块
  7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收–辅助分配模块

物理格式化

划分扇区,检测好的扇区,用好的扇区替换为坏的扇区。
用分区表,完成各区的文件系统初始化
超级块用来快速找到若干的空闲块。
i结点区:所有索引结点存放
根目录:从根目录出发建立子目录。

open系统调用打开文件的背后过程

在这里插入图片描述
从目录M读入缓存,将FCB复制到文件表,进程打开文件表新建一个条目,返回文件描述符,对打开文件进行操作。
这张图展示了文件打开的过程以及文件系统中与打开文件相关的数据结构

图中内容解释

  1. 内存结构

    • 目录M缓存:用于存储目录项和文件控制块(FCB),其中包含文件的元数据,如文件名、大小、存取权限等。
    • 系统打开文件表:位于内核区,用于管理当前系统中所有进程所打开的文件,存储文件在内存中的副本及相关信息。
    • 进程(用户)打开文件表:每个进程都有自己的打开文件表,用于维护该进程打开的文件信息。
  2. 磁盘结构

    • 磁盘上包含实际的文件,如图中展示的文件A文件B
    • 磁盘目录(如目录M)用于存储指向文件的索引信息。

文件打开的详细步骤

  1. 打开文件操作

    • 用户通过open函数指定文件路径进行文件打开操作。例如,调用open(.../M/A, 只读)来打开文件A
    • 系统会根据指定路径逐级遍历目录,找到对应的文件控制块(FCB)。
  2. 系统打开文件表

    • 在内存中,系统根据目录中找到的FCB,将其复制到系统打开文件表
    • 系统打开文件表存储文件的相关信息,包括文件指针和打开计数器(用于记录有多少个进程同时打开该文件)。
  3. 进程打开文件表

    • 系统在进程打开文件表中创建一项,存储打开文件的具体信息,如打开方式(只读、读写等)。
    • 该表中的每项指向系统打开文件表中的对应文件项。
  4. 返回文件描述符

    • 系统会为该打开文件分配一个文件描述符fd,返回给用户区,供程序后续对文件的操作使用。

操作总结

  • 文件打开计数:每次有进程打开文件时,系统打开文件表中的计数器会递增;文件关闭时计数器递减。当计数器为0时,系统释放该文件的内存资源。
  • 进程和系统关联:进程打开文件表中的每项通过索引与系统打开文件表项关联,这样可以共享文件信息,避免重复读取磁盘内容。

虚拟文件系统

虚拟文件系统(Virtual File System, VFS)是操作系统内核中一层抽象层,用于实现不同文件系统的兼容与统一接口。它使得操作系统可以通过统一的接口来访问不同类型的文件系统,例如 ext4、NTFS、FAT32 等。

1. 虚拟文件系统的作用

  • 统一接口:VFS 为用户程序提供一个统一的接口,使得应用程序无需关心底层实际使用的文件系统类型。程序员可以使用相同的系统调用(如 openreadwrite 等)来访问文件,而不需要考虑文件是存储在 ext4 文件系统还是 FAT32 文件系统中。
  • 文件系统兼容:VFS 通过抽象层将操作系统与具体文件系统实现分离,支持多个文件系统共存,使操作系统可以无缝地处理不同类型的文件系统。
  • 透明访问:用户或应用程序可以透明地访问网络文件系统、远程文件系统等,而不需要关注底层文件访问的细节。

2. 虚拟文件系统的结构

VFS 的实现通常包括以下几个核心部分:

  • VFS 接口:定义了文件系统的操作接口,如打开、关闭、读取和写入文件等操作。
  • 文件系统类型表:维护系统中已安装的文件系统类型列表,如 ext4、NTFS、NFS 等。每个文件系统类型都实现了 VFS 接口。
  • 超级块对象:表示文件系统的元数据,包括文件系统的类型、状态等。
  • 索引节点对象(inode):表示文件的具体元数据信息,如文件大小、权限、物理位置等。
  • vnode:函数功能指针,指向具体函数的指针。每个文件对应一个vnode
  • 目录项对象(dentry):用于表示目录项,维护文件和目录的层次结构。
  • 文件对象:用于表示打开的文件,维护文件描述符及文件状态等信息。

3. VFS 工作机制

VFS 的工作机制如下:

  1. 文件系统挂载:操作系统通过 VFS 接口将不同的文件系统挂载到统一的目录树上。每个文件系统在挂载时都会注册其超级块对象和其他数据结构。
  • 注册新挂载的文件系统(挂载表)。
  • 向VFS提供一个函数地址列表。
  • 将新文件系统加到挂载点上。
  1. 文件访问请求:当用户进程发出文件访问请求(如 open())时,VFS 接口接收该请求并在目录树中查找相应的目录项对象(dentry),确定所访问文件的索引节点(inode)。
  2. 文件操作:VFS 将操作请求发送到文件系统的实现中。每个具体的文件系统实现会根据自己的存储结构,完成读写等操作。
  3. 数据返回:文件系统返回操作结果,VFS 通过统一的接口将结果返回给用户程序。

4. VFS 的优点

  • 抽象和扩展性:增加一个新的文件系统时,只需要实现 VFS 接口即可,系统内核不需要更改。
  • 跨平台支持:VFS 提供了一个抽象层,便于操作系统兼容不同的存储介质和文件系统类型。
  • 简化开发:开发人员只需针对 VFS 编写代码,无需针对每种文件系统分别编写。

原文地址:https://blog.csdn.net/zxjiaya/article/details/143631309

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!