操作系统的文件系统思考

文件系统是操作系统的一部分,最终是目的是管理文件。

 

操作系统中之所以产生文件的概念,是为了方便多个进程可以共享一些数据,那么这些数据就要存储在磁盘上。多个进程可以进行访问。

 

把文件看成是磁盘上的地址空间。

 

文件的内容其实对计算机而言,就是字节序列。对用户看到的才是一行一行数据。

 

文件系统要解决的关键性问题是什么?

就是记录一个文件用到哪些磁盘块(哪些磁盘块分配给了哪些文件),这样找一个文件的时候,就知道去哪个磁盘块上寻找。

不同的操作系统使用不同的方式来实现这一目标。

大体分为三种方式:

 

1、连续分配。

没怎么理解,到底区别是在哪里呢?

 

一个文件,占据着多个磁盘块,特点是这些磁盘块是连续相邻在一起的。

 

每个文件是预先分配大小吗?预先申请多少个磁盘块?

这种方式的缺点是,一旦删除,增加文件,就会形成大量的空闲磁盘块(叫做磁盘碎片)。如果想要新加入的文件,去使用这些空闲磁盘块,那么就要计算一个文件的大小,然后才能找合适大小的磁盘块存入。关键问题是,很难确定一个文件的大小(因为一个文件以后会写入新的数据进去,或者会删除文件里面数据,大小总是在变化中)。正因为文件大小很难固定死,所以反而比较适合cd上的文件来存储,因为cd上的文件大小是固定的,不会改变的。

磁盘碎片多是它的缺点。

 总体来说,这种文件分配方式只适合文件大小固定的文件。

 

2、链表分配(fat方案,文件分配表简称)

 

包括在链表存储在磁盘上,链表放入内存中。放在内存中的时候,速度是快。

链表是相对于连续分配磁盘块的方式而言的。这样子,一个文件不需要固定在连续的磁盘块。比如文件a的内容,在连续分配方式中。随着文件内容的增加,扩容。会使用磁盘块1,磁盘块2,磁盘块3,也就是必须是连续(位置相邻,连续的一片区域)的磁盘块。

优点:避免了连续分配方式中的磁盘碎片。

 

而链表方式,不需要连续的磁盘块。每个磁盘块的第一个字节存储指针,指向下一个磁盘块的地址。这样就能顺着指针去寻找。不需要连续的磁盘块都可以了。

 

为了提高速度,将链表存入到内存中去。内存中维护的这样一个表格(实际上可以理解成一个key->value的映射表),英文名称叫做file acllocation table(文件分配表),缩写是取每个单词的首个字母,就叫FAT。

 

联想到实际例子加深印象

我们经常在使用window的时候,会有fat32文件系统。就是这种原理来维护的。

 

某天,我在安装软件的时候,注意到一个现象,我删除了目录,但是这个目录还是在列表中:

 

 

这让我想起了fat文件系统的知识,把这个映射表放入了内存中(为了提高速度)。所以即便是删除了目录,在选择的时候还是会列出来(什么时候会删除呢?)。

我新加一个目录,看来只要往内存中的映射表(fat)加一条记录项即可,所以上图看到,新增加的目录develop会显示出来,因为直接是从内存的表中载入进来的。

 

重启电脑后,内存中的映射表会重新加载一次

 

 

 

 

 

3、i节点

链表分配法的缺点是,要占据着很大的内存(链表放入内存中为提高速度)。一个目录多少个文件,那么就要维护多少个项在内存中。

那么n多的目录,就会更加多。

磁盘空间越大,所需要维护的链表就越大,意味着内存中链表占据的内存空间就越大。比如200g的磁盘,每个磁盘块是1kb。那么总共就有200g*1kb个项。

这个项的目的,就是指明这个磁盘块的位置。

这个表需要2亿个项,大致需要600-800m的内存。太浪费内存空间了。

 

于是发明了一种改进办法,只有用户打开的文件,才将其节点信息载入内存中。这样子就会占据内存少很多。

 

 

 

3、目录的实现

 

每个目录,就会建一个目录表。目录表里面的每一项叫做目录项,其实就是这个目录中的一个文件对应一个项,通俗点说,就是把这个目录所有的文件都放到目录表里面记录起来。

查找一个目录里面的文件,或者是加入文件,都要搜索这个目录表里面的文件项。

 

目录的本质其实也是文件,只不过是一种特殊的文件,因为它包含了多个文件。所以目录其实是包括这几项:目录名称,目录的开始磁盘块编号,结束磁盘块编号。

 

 

两种实现算法,线性表和hash表。hash表的长度是一个问题。

 

 

理解操作系统,理解了它的三个概念,就几乎成为一个操作系统专家了:

1、进程(线程)。对cpu建立模型

2、地址空间。操作系统对内存的抽象模型

3、文件。难怪在linux操作系统中,一切皆是文件的概念。

 

 

操作系统有自己的文件系统。那么数据库系统如何与磁盘打交道,难道是按照自己的组织方式,还是说没有使用操作系统提供的文件系统呢。

 

但是,要知道,数据库系统最终是在操作系统上运行的,那么要操作磁盘数据,就离不开文件系统的使用。

 

数据库的物理管理有两种方式:

 

1、 借助操作系统的文件系统来组织数据。

由文件系统负责与磁盘交互,申请与分配磁盘块。

 

2、 自己实现一套管理方式,负责申请磁盘块与分配。可以理解为自己实现一套文件系统

实际上,大部分数据库系统一开始就申请固定大小的磁盘空间,然后由自己来进行分配和管理。

 

 

备份:磁盘控制器处理磁盘坏块的操作是透明的,甚至连操作系统都不知道。

posted @ 2015-06-29 12:51  王滔  阅读(640)  评论(0编辑  收藏  举报