首页 > 代码库 > 文件系统
文件系统
第四章 文件系统
文件是进程创建的信息逻辑单元
目录是管理文件系统结构的系统文件
在Unix中,路径各部分之间用“/”分割,在Windows中,分隔符是“\”,在Multics中是“>”
不管哪一种分隔符,如果路径名的第一个字符是分隔符,则这个路径是绝对路径
支持层次目录结构的大多数操作系统在每个目录中都有两个特殊的目录项,“.”和“..”,常读作“dot”和“dotdot”,“dot”指当前目录,“dotdot”指父目录(在根目录中例外,根目录中它指向自己。
在删除目录的时候,在只有空目录可以调用删除目录,来删除
文件系统的实现
文件系统的布局:磁盘的0号扇区称为主引导记录(MBR),用来引导计算机,在MBR结尾时分区表,该表给出了每个分区的起始地址标,表中的一个分区被标记为活动分区,在计算机被引导时,BIOS读入并执行MBR。MBR做的第一件事就是确定活动分区,读入它的的一块,称为引导块,并执行之。除此之外,还有一个超级块,超级块包含文件系统的所有关键参数,在计算机启动时,或者该文件系统首次使用时,把超级块读入内存。超级块中的典型信息包括:确定文件系统类型用的魔术,文件系统中数据块的数量以及其他重要的管理信息
文件实现:
1. 连续分配,优点:实现简单、读操作性能较好;缺点:容易产生磁盘碎片
2. 链表分配:每块的第一个字作为指向下一个块的指针。该方法尽管顺序读取非常方便,但随机存取却相当缓慢,另外由于指针占用了额外的空间导致每个磁盘块不再是2的整数次幂,这种怪异的大小大大的降低了系统的性能(许多程序都是以2的整数次幂来读取磁盘的。
3. 在内存中采用链表分配:取出2中的磁盘块的指针,放入内存中的一个表中。这个表叫做文件分配表(FAT),缺点,整个表放入内存中
4. i节点:记录文件分别属于那些磁盘块,列出了文件属性和文件块的磁盘地址,给定i节点,只有文件打开时,文件的i节点才会存在内存中,最后一个磁盘块地址不是指向数据块而是指向一个包含磁盘块地址的块的地址
目录实现
1. 较好的一个方案是:文件项包含一个指向文件名的地址和文件的属性,对于长目录,线性搜索的方法太慢了,加快查找速度的一个方法是使用散列表
共享文件
1. 连接(link):特定目录与共享文件之间的联系称为一个连接。
2. 文件系统本身是一个无环图,而不是一棵树
3. 为了解决在共享文件中单个文件写入数据,违背了共享文件的目的,Unix采取的方法是i节点,即磁盘块不列入目录而是列入一个与文件本身相关的小型数据结构(i节点);另一种方案是符号连接:即系统创建一种指向共享文件的新文件(windows系统中的快捷方式)
日志结构文件系统
1. 基本思想是将整个磁盘结构化为一日志
2. 每隔一段时间,或是有特殊需要时,被缓冲在内存中的所有未决的写操作都被放到一个单独的段中,作为在日志末尾的一个邻接段写入磁盘
3. 日志文件系统有一个清理线程,该线程周期地扫描日志进行磁盘压缩
4. 整个磁盘成为一个大的环形缓冲区,写线程将新的段写在前面,而清理进程则将旧的段从后面移走
虚拟文件系统
1. 思想:抽象出所有文件系统都共有的部分,并且将这部分代码放到单独的一层,该层调用底层的实际文件系统来具体管理数据
2. 所有和文件相关的系统调用在最初的处理上都指向虚拟文件系统
3. 虚拟文件有两个不同的接口:上层用户进程的接口和下层给实际文件系统的接口
文件系统管理和优化
1.几乎所有的文件系统都把文件分割成固定的块大小来存储,各块之间不一定相邻
2.如果分配的单元太大,浪费了空间(再小的文件也会占用整个柱面),如果太小,则浪费了时间(文件跨越多个块,多次寻道和旋转延迟)
3.记录空闲块,方案一:采用磁盘块链表,方案二:使用位图
4.磁盘配额:管理员分配给每个用户拥有文件和块的最大数量,操作系统确保每个用户不超过分配给他们的配额
5.文件系统备份:处理两个问题:1)、从意外灾难中恢复;2)从错误操作中恢复,(windos中的回收站)
6.增量转储:周期性地做全面的转储,而在每天只对当天更改的数据备份。稍微好一点的做法是只备份最近一次转储以来更改过的文件。
7.转储两种方案:物理转储,逻辑转储;物理转储:从磁盘的第0块开始,将全部的磁盘块按序输出到磁带上,直到最后一块复制完毕;逻辑转储:从一个或几个指定的目录开始,递归地转储器自给定基准日期(例如,最近一次增量转储或全面转储的日期)后有所更改的全部文件和目录。
8.文件系统的一致性:很多计算机都带有一个使用程序以检查文件的一致性,Unix中是fsck,windos中是scandisk
9.文件系统的性能:
1)高速缓冲,
在Unix中有一个系统调用sync,它强制性地把全部修改过的块立即写回磁盘,系统启动时,在后台运行一个通常名为update的程序,它在无限循环中不断的执行sync调用,每两次调用之间休眠的实现是30秒
在windos中有一个FlushFileBuffers,它采用的做法是,只要被写进告诉缓冲,就把每个被修改的块写入磁盘。将缓冲中所有被修改的块立即写回磁盘称为通写高速缓冲。同非通写缓冲相比,通写缓冲需要更多的磁盘IO
2)块提前读
3)减少磁盘臂运动
把可能顺序存取的块放在一起,当然最好在同一个柱面上,从而减少磁盘臂的移动次数
磁盘碎片整理:移动文化使它们相邻,并把所有的(至少是大部分)空闲空间放在一个或多个大的连续的区域内。Windos有一个程序defrag从事这项工作。
文件系统实例:
1.CD-ROM,为一次性写介质设计的
Unix,ISO 9660文件系统标准的基础上做了一次扩展,Rock Ridge扩展,微软做的一次扩展是Joliet扩展
2.MS_DOS文件系统,它和扩展(FAT-32)一直被许多切入式系统广泛使用,如数码相机等。
3.UnixV7文件系统,i节点采用3级间接块。
本文出自 “虎哥的博客” 博客,请务必保留此出处http://7613577.blog.51cto.com/7603577/1551827
文件系统