一个磁盘可以有数个分区,典型的UNIX系统中每个磁盘分区会有几个文件系统。顺序介绍几个概念,会对以后的问题更为清晰。
MBR
主引导记录(Master Boot Record),整个磁盘的0号扇区。它的最基本作用就是引导载入计算机的操作系统。过程如下:
1.计算机启动BIOS
2.BIOS读入执行MBR
3.MBR的结尾有分区表。
就是C,D分区在磁盘的物理起始位置和结束地址。另外,其中大多数情况下,C盘会被标记为活动分区(操作系统所在的地方)。
4.读入活动分区的第一个块,这个块叫做引导块
5.引导块记录着怎么装载操作系统,之后是一些和文件系统相关的系统。
PS:关于磁盘分区中的结构有待进一步研究。
文件和目录
这个问题根本不用阐述,但系统考虑问题,就是需要把基本问题罗列。
况且只知道文件和目录层级关系远远是不够的,深入文件系统的实现:
文件系统通过目录管理文件,每个文件都有属性和记录其物理磁盘块地址的信息。如果对于windows,那应该先说文件,对于UNIX那应该先说目录。
关于windows的实现请参考:
作者Andrew S. Tanenbaum的《modern operating system》
Unix把文件抽象成一个称为
i
<script type="math/tex" id="MathJax-Element-1">i</script> 节点的数据结构。i节点的结构如下:
i 节点结构
结构 | 描述 |
---|---|
文件属性列表 | 包括所有者,创建日期等内容 |
磁盘块地址列表 | 记录文件的实际物理地址 |
(可选)指针块 | 通常i节点是固定长度的,大文件需要指向另一个额外列表 |
这样UNIX的目录就变成了这样:
元素名 | i节点指针 |
---|---|
one.png | 文件one的i节点 |
second.doc | 文件second的i节点 |
这个实现简单而且节省开销,为什么呢?紧接着看下面
文件系统内存中目录对文件磁盘块的管理
上下文:由于文件包含数个磁盘块在磁盘上的不连续分配,我们需要一个指针对应文件的一个磁盘块。
Windows
因为windows对目录项的处理每个文件构造一个链表,文件从起始位置开始可以获得整个文件。而所有文件的链表保存在一个表中,这个表叫
FAT-文件分配表(File Allocation Table)。
假设文件sample的磁盘块组成如下:
4->7->2->10->12
FAT结构如下:
第一项序号表示物理块的地址,而第二项表示下一个物理块的地址。
如果下一个物理块地址没有,代表文件结尾,第二项填-1。空闲块不填任何数。
物理块序号 | 下一个物理块 |
---|---|
0 | |
1 | |
2 | 10 |
3 | |
4 | 7(文件开始) |
6 | |
7 | 2 |
8 | |
9 | |
10 | 12 |
11 | |
12 | |
13 | |
14 | -1(文件结尾) |
15 |
这个开销和磁盘上的文件数是成正比的。如果文件占的总磁盘数为n,那么目录项数也是n。
UNIX
这个就非常简单了,在内存中载入i节点。这就增大了灵活性,如果在目录下你打开文件,目录项会存在一个硬连接指向 i 节点,然后动态载入内存。开销是你打开的所有文件的所占的磁盘块数总数。明显,UNIX取出所有文件的子集。
看来动态分配和抽象封装的思想是多么伟大啊!动态分配降低成本,而抽象封装为动态分配提供了基础,即管理的方便。