-
Notifications
You must be signed in to change notification settings - Fork 1
8月31日学习笔记
17.3 目录、文件别名和文件系统种类
分层文件系统
文件以目录的方式组织起来,目录是一类特殊的文件,这个文件里面存储的内容,是用来表示其它文件的信息,目录的内容是文件索引表<文件名,指向文件的指针>
目录和文件的树型结构,早期的文件系统是扁平的(只有一层目录)
典型目录操作:搜索文件、创建文件、删除文件、列目录、重命名文件、遍历路径
这些操作,对于操作系统来说,都是封装到内核里头的,只允许内核来对目录进行修改,这样就可以保证这种目录的映射的完整性,用户通过系统调用来对目录进行相应的操作
目录的实现是描述目录里的文件的列表怎么来组织,最简单的做法是把它组织成一个线性的表,如果这个表很大,那这时候检索,或者说增删,它的时间会很长,但是它的好处是我编程比较简单
另一种做法是将目录中这些文件组织成一个哈希表,先做哈希,再进行后续的操作,这种做法,由于哈希的缘故,可以减少搜索时间,也会有问题,两个文件名,它做哈希之后,哈希结果是一致的,这时会产生冲突,冲突呢,需要在哈希表里由相应的解决,这样做以后,我目录表里的每一项,它的长度是固定的
文件别名,由一个文件,想给它起两个或多个名字的时候,这样做是为了方便共享,减少存储空间
硬链接:多个文件项指向一个文件
软链接:以“快捷方式”指向其他文件,通过存储真实文件的逻辑名称来实现
如何保证文件目录中没有循环?
1、只允许到文件的链接,不允许在子目录的链接
2、增加链接的时候,用循环检测算法确定是否合理
在实际中,通常是限制路径可遍历文件目录的数量,即限制可以检索下去的长度,超过这个长度,就不再往下检索了,这样的话,也就减少了由于循环所带来的问题
名字解析(路径遍历):把逻辑名字转换成物理资源(如文件)
1、依据路径名,在文件系统中找到实际文件位置
2、遍历文件目录直到找到目标文件
举例:解析“/bin/ls”
1、读取根目录的文件头(在磁盘固定位置)
2、读取根目录的数据块,搜索“bin”项
3、读取bin的文件头
4、读取bin的数据块,搜索ls项
5、读取ls的文件头
当前工作目录(PWD)
1、每个进程都会指向一个文件目录用于解析文件名
2、允许用户指定相对路径来代替绝对路径,如,用PWD=“/bin”能够解析“ls”
文件系统挂载
1、文件系统需要先挂载才能被访问;
2、未挂载的文件系统被挂载在挂载点上;
文件系统种类
磁盘文件系统:文件存储在数据存储设备上,如磁盘,例如:FAT、NTFS、ext2/3、ISO9660,等
不同的文件系统由于存的数不同,会做不同的优化
使用场景的不同也会做各自不同的优化
数据库文件系统
文件特征是可被寻址(辨识)的,可以基于文件特征来被寻址或者是被检索,一个例子就是winFS
日志文件系统
记录文件系统的修改/事件
网络/分布式文件系统,例如NFS、SMB、AFS、GFS,文件可以通过网络被共享,文件位于远程服务器,客户端远程挂载服务器文件系统,标准系统文件访问被转换成远程访问
标准文件共享协议:NFS for Unix, CIFS for Windows
分布式文件系统的挑战:客户端和客户端上的用户辨别起来很复杂,例如,NFS是不安全的
一致性问题
错误处理模式
特殊/虚拟文件系统,例如进程间通讯当中用到的管道
17.4 虚拟文件系统
面对我们由多种不同的文件系统,而对于操作系统,又希望对上提供一个统一的接口
分层的结构,虚拟(逻辑)文件系统(VFS,virtual File System)
使得文件系统对上层提供统一的文件访问和文件系统控制的系统调用接口
中间,维护各种文件系统所共同的一些数据结构和常用的操作算法
然后向下,来对各种不同的实际的文件系统提供相应的访问接口
虚拟文件系统目标是针对所有不同文件系统的抽象,具体要提供的功能有:1、提供相同的文件和文件系统访问接口;2、在内部,维护所有文件和文件系统关联的数据结构;3、高效查询例程,遍历文件系统;4、与特定文件系统模块的交互;
文件系统基本数据结构
1、文件卷控制块(Unix:superblock,超级块)
每个文件系统一个,文件系统详细信息,块、块大小、空余块、计数/指针等
2、文件控制块(unix:vnode or inode)
每个文件一个,文件详细信息,访问权限、拥有者、大小、数据块位置等
3、目录项(Linux:dentry)
每个目录项一个(目录和文件),将目录项数据结构及树型布局编码成树型数据结构,指向文件控制块、父目录、子目录等
文件卷控制块到每一个目录项,这些目录项组织成一个树状结构,树状结构里再往下一层是每一个文件,它的文件控制块,文件控制块知道它实际的文件里头的数据块
文件系统的存储结构
文件系统数据结构:卷控制块(每个文件系统一个)、文件控制块(每个文件一个)、目录节点(每个目录项一个)
持久存储在外存中,存储设备的数据块中,当需要时加载进内存
卷控制模块:当文件系统挂载时进入内存
文件控制块:当文件被访问时进入每次
目录节点:在遍历一个文件路径时进入内存