文件系统

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chifredhong/article/details/71512885

一个文件系统包含了目录和目录下的文件。

文件

文件名
文件名+扩展名。UNIX系统区分文件名大小写
文件系统结构
文件系统

文件结构
a)序列结构,UNIX及Windows都采用这种文件结构
b)记录序列,由记录序列组成的文件,每个记录的长度时固定的。
c)树,不定长度的记录为结点的树。

文件类型
普通文件一般分为ASCII文件和二进制文件。
ASCII文件由多行正文组成,Windows下,每行以回车符(\r)和换行符(\n),UNIX下以换行符(\n)结束。
二进制文件有一定的内存结构。简单的二进制可执行文件文件由文件头、代码段、数据段、重定位表和符号表组成。文件头以魔数开始,表明该文件是一个可执行的文件。
文件结构
不可执行的二进制文件,比如UNIX的存档文件。它由已编译但没有链接的模块集合而成。
操作系统必须能识别它自己的可执行文件的类型,有些操作系统还能识别相应的源文件信息。比如shell的make程序,它就能识别源文件在编译后是否被修改了,实现最小编译。

文件存取
顺序存取:从头到尾读取文件的字节或记录
随机存取:读取任意位置的字节或记录。seek操作设置当前位置指针

文件属性
比如创建时间、文件大小等附加信息。这些信息保存在文件系统中。
文件属性

文件的操作
针对文件常见的系统调用有
open,它识别一个路径,返回一个文件描述符
close ,它关闭一个文件
read,读取一个文件
write,向一个文件写入内容
seek,调整文件指针的位置
get attribute:调用make时,常常需要这个系统调用。

文件描述符
Linux中所有的设备都是文件,键盘和显示器时标准输入输出,它们也是文件,stdin,stdout,stderr的文件描述符分别是0,1,2。open(…)系统调用返回一个文件描述符fd,fopen()是库函数,它返回一个FILE指针,这个FILE指针包含了fd。

进程的PCB中保存着所需文件的文件描述符表,表的索引就是fd,表项是已打开文件的指针。fd是从小到大分配的,默认从3开始,因为0,1,2被使用了,重定向就是关闭stdout,然后把内容写到fd=1那个表项指向的文件。

目录

一级目录系统
一个目录中包含所有文件

层次目录系统
一个目录树结构

路径名
分隔符
windows下是”\”,UNIX下是”/”

绝对路径名:从根目录开始
相对路径名:从工作目录开始

目录操作
对目录常见的系统调用
opendir
closedir
readdir
link,连接技术用于创建一个文件在指定路径中的引用。它被称为硬连接
unlink,解除连接
硬链接和软链接的区别
硬链接增加了一个文件的链接计数,它是对文件的直接引用。
软链接不影响一个文件的链接计数,它通过名称进行引用,效率比硬链接低。

文件系统的实现

文件系统布局
文件系统放在磁盘上,每个磁盘划分为多个分区,每个分区有一个独立的文件系统。磁盘的0号扇区称为主引导记录(MBR),用来引导计算机。MBR的结尾是分区表,该表给出每个分区的起始地址和结束地址。计算机开机引导时,BIOS读入并执行MBR。随后读入每个分区的引导块,引导快包含该引导程序,引导程序装载操作系统。
文件系统的布局
超级块:包含文件系统中的关键参数。包括确定文件系统类型的魔数,文件系统中的数据块数量等。

文件的实现
1、连续分配
每个文件作为连续的数据块存储在磁盘上,每个文件按顺序放入磁盘。
连续分配
优点是实现简单,只需要一个文件起始地址和文件占据的块数。而且读性能较好。
缺点是当需要删除文件时,空闲区不能使用了。最终需要重新压缩或利用空闲区,前者代价太高,后者在文件创建时不得不指定最终文件的大小。

2、链表分配
每一个块的第一个字为指向下一块的指针。
链表分配
优点是可以充分利用每个磁盘块。
缺点是随机读取代价非常大,并且指针域占据一定的空间,文件域的字节数不是2的整数次幂,但许多程序以2的整数次幂来读写磁盘,影响性能。

3、在内存中采用表的链表分配
将每个磁盘块的指针放入内存中的一个称为文件分配表的表格中。
内存中链表分配
缺点是,如果是大容量磁盘,文件分配表的表项非常多,整张表占据内存大量空间。

4、i节点
每个文件分配一个i节点的数据结构,数据结构中包含文件属性和文件块的磁盘地址的信息。但每个节点保存的磁盘地址数量是固定的,解决方法是最后一个磁盘地址不指向文件块,而是二级磁盘地址。
i节点
目录的实现
目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息。
两种存放文件属性方法
文件属性存放
a)目录中有个固定大小的目录项列表,每个表项对应一个文件,表项包含文件名和文件属性信息。
b)目录列表同样是固定的长度,但是每个表项存放的是文件名和i节点号。文件属性放在i节点中。

目录、i节点以及数据块关系
目录、i节点以及数据块关系

处理长文件名的两种方法
处理长文件名的两种方法
a)每个目录项以可变的长度存储文件名,文件名被填充成整数个字。缺点是移走中间的任何一个文件后,就引入一个长度可变的空隙,而下一个进来的文件不一定能填充满这个空隙,引入碎片。而且一个目录项可能会分布到多个页面上,读文件时,发生页面故障。
b)每个目录项有固定的长度,文件名放在目录后面的堆中。文件名也不用对齐到字边界。没有碎片,但是也可能有页面故障

文件查找
文件查找
对大目录,线性地从头到尾搜索文件名,很耗时。每个目录引入散列表,相同哈希值的文件放在一个链表中。

共享文件
有了链接(link)的存在,文件系统不是一个简单的目录树,而是一个有向无环图。
共享文件
B目录与该共享文件的关系是链接。

如何保持不同目录中的文件同步呢?
第一种方案是,将磁盘地址放入与文件相关联的一个数据结构中,目录指向这个数据结构。UNIX系统采用这个方法,数据结构就是i节点。当文件所有者删除文件后,只删除目录项,将i节点保存下来,并将引用计数减1。当引用计数变为0时,删除该文件。
文件同步
第二种方法是,在B目录中创建一个类型为LINK的文件。新的文件只包含它所连接的文件的路径名。这种方法称为软链接。
文件同步
二者区别
删除软链接根本不影响引用计数。也不影响文件本身。软链接的开销比硬链接大,因为软链接需要搜索路径。但软链接可以通过网络连接到其他的文件系统上的文件。

日志结构文件系统
为了减少碎片化写磁盘的低效,提出LFS。整个磁盘被视为一个大的日志,日志由段组成,每隔一段时间将内存中的段,在日志的末尾处写入磁盘。LFS有一个清理线程,该线程周期性的扫描日志并进行磁盘压缩。
这里写图片描述

日志文件系统
保存一个用于记录系统下一步做什么的日志。如遇到系统崩溃,重启后,查看日志,接着崩溃前的任务继续完成。
这里写图片描述
移除一个文件需要三步:
1、删除目录表中该文件对应的表项
2、释放i节点到空闲i节点池。
3、将所有的磁盘块归还空闲磁盘池。
这三个动作被列成一个日志项,然后日志项被写入磁盘,但所有的操作完成后,擦除日志项。NTFS就是一个扩展的日志文件系统。

虚拟文件系统
一个操作系统下,可能有不同的文件系统。虚拟文件系统将不同类型的文件系统整合成统一模式。
VFS有两个不同的接口:上层给用户进程的接口和下层给实际文件系统的接口。
大多数文件系统是面向对象的,通常包括几种对象类型,包括超级块(描述文件系统)、v节点(描述文件)和目录(描述文件系统目录)。
当系统启动时,根文件系统在VFS中注册(挂载)
虚拟文件系统

文件系统管理

磁盘空间管理
几乎所有的文件系统都是把文件分割成固定大小的块来存储,各块之间不一定相邻。

1、块大小
小的磁盘块导致低磁盘传输速率和高的空间利用率。大的磁盘块则相反。现代计算机,通常将块的大小提升到64KB

2、记录空闲块
这里写图片描述

  • 空闲表中每个块有1KB空间,包含有255个空闲块的块号,每个块号占据32位(4字节),最后4个字节存放下个指向下个空闲表的指针。

  • 采用位图,n个块需要n位位图。

文件系统备份
物理转储和逻辑转储

文件系统一致性
一致性检查程序,UNIX中用fsck,Windows用scandisk。
一致性检查分为两种:块的一致性检查和文件的一致性检查。
文件系统一致性
第一个表中的计数器跟踪该块在文件中出现的次数,第二个表中的计数器跟踪该块在空闲表中出现的次数。
如果文件系统一致,则每个块要么在第一张表中为1,要么在第二张表中为1;如果两个表中都为0,则表示该块丢失,浪费了磁盘空间。如果第二张表中为2,第一张表为0,则表示重复,重新建立一张新空闲表。如果第一张表为2,第二张表为0,则有重复数据块,,需要备份到空闲块,然后插入其中一个份文件中。
UNIX中使用rm命令删除文件时,仅仅在对应目录或i节点上设置了某一位,磁盘块还未返回空闲表。可以恢复。

文件系统性能
访问磁盘比访问内存慢得多,因此提高性能的关键是减少磁盘访问次数。
1、高速缓存
高速缓存
高速缓存是位于内存中的一系列块,逻辑上是磁盘的内容。当请求一个磁盘块时,系统首选检查这个块是否在cache中,如果在,就可以直接中cache中获取这个块,否者,系统会从磁盘中把块读入cache。将设备和磁盘地址进行散列操作,相同散列值的块,放在一个链表中,当高速缓存已满时,可是使用分页系统中的页面置换算法,比如LRU、第二次机会算法等。最近最少使用的放在链表前端,保证它占用的块缓冲区可以很快被重用,最常使用的放在末尾,保证在高速缓存中保留较长时间。
为了减少计算机崩溃后内存中数据丢失的可能性,UNIX系统中有个sync系统调用,它每30秒就吧全部修改的块立即写回磁盘。

2.块提前读
块提前读策略只适用于顺序读取的文件。

3、减少磁盘臂活动
这里写图片描述

MS-DOS文件系统
MS-DOS的目录项大小为32字节。组成如下,
这里写图片描述

UNIX文件系统
UNIX目录中为每个文件保留一个目录项,每个目录项包含两个域,文件名(14字节)和i节点编号(2字节),因此每个文件系统的文件数目为64K。

一个UNIX的i节点
这里写图片描述
从根目录查找/usr/ast/mbox的过程
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页