网站建设开发软件有哪些,网站开发价格,想做网站怎么做,wordpress一键发布Linux支持多种文件系统类型的方式和其他类Unix系统类似#xff0c;通过虚拟文件系统来实现。 对每个读#xff0c;写或其他操作文件系统的调用函数#xff0c;内核都用实际支持各种文件系统的函数来代替。 12.1 虚拟文件系统(VFS)的角色 VFS是一个内核软件层#xff0c;用来… Linux支持多种文件系统类型的方式和其他类Unix系统类似通过虚拟文件系统来实现。 对每个读写或其他操作文件系统的调用函数内核都用实际支持各种文件系统的函数来代替。 12.1 虚拟文件系统(VFS)的角色 VFS是一个内核软件层用来处理与标准Unix文件系统相关的全部系统调用。它主要作用是为多种文件系统提供通用接口。 VFS是一个在应用程序和(实际的)文件系统实现之间的抽象层。 VFS支持的文件系统可以分成三类 a.基于磁盘的文件系统Disk-based filesystems 管理在本地磁盘或其他模拟磁盘的设备上的可用内存空间。 b.网络文件系统Network filesystems c.特殊文件系统Special filesystems 该文件系统不管理本地或者远端的磁盘空间。/proc文件系统就是一个典型的特殊文件系统。 12.1.1 通用文件模型 VFS背后的关键思想在于提出了能够代表全部所支持文件系统的通用文件模型(common file model)。 然而每个特定的文件系统实现必须把它的物理组织转变成VFS的通用文件模型。 例如在通用文件模型中每个目录被当成是一个文件包含了一列文件和其他目录。 文件在内核内存中由file数据结构表征该数据结构包含一个叫做f_op的成员包含有指向特定文件系统函数实现的指针。 通用文件模型包含以下几个对象类型 a.超级块Superblock 存储一个已挂载文件系统的信息。对于基于磁盘的文件系统来说该对象通常对应存储在磁盘上的文件系统控制块。 b.索引节点inode 存储一个指定文件的一般信息。对基于磁盘的文件系统该对象通常对应存储在磁盘上的文件控制块。 c.文件file 存储进程和打开文件之间交互的信息。该信息只有进程打开文件期间存在于内核内存中。 d.目录项dentry 存储对应文件的目录入口的连接信息。 图12-2阐述了一个简单例子关于进程如何跟文件交互。三个不同的进程打开了同一个文件其中两个使用同一个硬链接。在次情况下每个进程使用各自的file对象同时为每个硬链接对应一个dentry对象。但是两个dentry对象都指的是同一个inode对象inode对象标识了superblock对象和该通用磁盘文件。 除了为所有的文件系统实现提供通用的接口VFS在系统性能上也扮演了重要的角色。最近使用的dentry对象包含在称作dentry cache的磁盘缓存中加快了从文件路径到文件索引节点的转换。 通俗地讲磁盘缓存是一种软件机制使得内核可以把通常存储在磁盘中的信息保存在RAM中那么对该数据进一步地访问可以被迅速地满足而不用访问缓慢的磁盘。 应当注意磁盘缓存如果区别于硬件缓存或者内存缓存它们当中没有一个跟磁盘或者其它设备有关。硬件缓存是一个快速静态RAM加速了向慢速动态RAM发出的请求。内存缓存是一个软件机制用来绕过内核内存分配器(Kernel Memory Alloctor)。 12.1.2 由VFS处理的系统调用 我们在前面说过VFS是应用程序和特定文件系统之间的一层。然而在某些情况下一个文件操作可以直接由VFS完成而不需要调用到底层的代码。比如当一个进程关闭了一个打开的文件并不需要操作在磁盘上的该文件因此VFS仅仅是释放对应的file对象。类似的当lseek()系统调用修改了文件指针作为一个打开文件和进程之间的交互属性VFS也只需修改对应的file对象而不用访问磁盘上的文件因此它不需要调用特定的底层代码。 12.2 VFS数据结构 所有的超级块对象都链在一个环形双向链表中该链表的第一个元素是super_blocks变量。 一般而言由s_fs_info成员指向的数据是磁盘的信息出于效率的考虑存放在内存中。每个基于磁盘的文件系统为了分配或者释放磁盘块需要访问并更新它的分配位图。VFS允许文件系统在不访问磁盘的情况下直接操作s_fs_info成员。 这种方式会导致一个问题VFS的超级块可能跟磁盘上对应的超级块没有同步。因此有必要引出s_dirt标志表明该超级块是否是dirty也就是磁盘上的数据是否需要更新。 12.2.2 inode对象 文件系统操作一个文件所需要的全部信息都包含在inode数据结构中。文件名字只是可以改变的一个标号但是inode对文件来说是唯一的只要文件存在它就存在。 当i_state成员的值等于I_DIRTY_SYNCI_DIRTY_DATASYNC或I_DIRTY_PAGES时inode是dirty也就意味着对应的磁盘inode必须更新。I_DIRTY宏可以用来检查这三个标志的值。i_state成员其它的值有I_LOCK(inode对象正被卷入I/O传输中)I_FREEING(inode对象已被释放)I_CLEAR(inode对象的内容已无意义)和I_NEW(inode对象已被分配但是还没有从磁盘inode读取内容填充它)。 每个inode对象包含在超级块中以s_inodes成员为头结点的链表中inode对象的i_sb_list成员存储了指向临近成员的指针。 12.2.3 file对象 存储在file对象中的最主要的信息是文件偏移指针表明了下一次进程操作的位置。因为多个进程可能同时访问同一个文件文件偏移指针必须保存在file对象中而不是inode对象中。 转载于:https://www.cnblogs.com/IrisZhou/p/3206818.html