操作系统 Operating System.

Slides:



Advertisements
Similar presentations
3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
Advertisements

2 和 5 的倍数的特征 运动热身 怎样找一个数的倍数? 从小到大写出 2 的倍数( 10 个): 写出 5 的倍数( 6 个) 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 5 , 10 , 15 , 20 , 25 , 30.
操作系统 Operating System.
PURSUING EXCELLENCE / TOWARD SUCCESS WUCHANG UNIVERSITY OF TECHNOLOGY
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第2节 ext2文件系统 索引文件的的代表 索引文件 文件使用三部曲 文件共享 文件保护 举例.
Oracle数据库 Oracle 子程序.
文件系统 第8章 文件系统.
在PHP和MYSQL中实现完美的中文显示
作業系統 第十三章 檔案系統實例.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Hadoop I/O By ShiChaojie.
存储系统.
第4节 虚拟文件系统 virtual filesystem (VFS)
Linux File System 文件系统 VFS VFS的作用 基于VFS的文件访问 VFS重要数据结构 文件系统的注册与安装
走进编程 程序的顺序结构(二).
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
2019/1/12 GDP设计协同 超级管理员操作手册 GDP项目组.
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
CPU结构和功能.
第四章 附件 (应用程序软件包).
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Linux的虚拟文件系统.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
作業系統 Operating System 第四單元 檔案系統
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
实验七 安全FTP服务器实验 2019/4/28.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Lab17 程序设计B班
信号量(Semaphore).
第11章 文件管理.
iSIGHT 基本培训 使用 Excel的栅栏问题
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
Python 环境搭建 基于Anaconda和VSCode.
Google的云计算 分布式锁服务Chubby.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
数据表示 第 2 讲.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
位似.
第6章 文件管理 本章学习目标 6.1 文件与文件系统 6.2 文件的逻辑结构 6.3 文件的物理结构 6.4 UNIX系统文件索引结构举例
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
RefWorks使用指南 归档、管理个人参考文献.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

操作系统 Operating System

教学目的 通过对本章地讲解使学生理解并掌握文件系统的功能、结构,外存空间的管理和目录结构。

本章重点: 文件的逻辑结构和物理结构 文件外存空间的管理 文件目录结构的管理 文件的保护与共享

本章难点: 目录的搜索 文件外存空间的管理

第6章 文件系统 本章主要内容: §6.1 文件 §6.2 目录 §6.3 文件系统 §6.4 Linux虚拟文件系统 现代计算机系统中,大量的程序和数据总是以文件的形式存放在外存中,需要时随时调入内存。文件系统是指操作系统中用来管理文件以及对文件进行操作的机制及其实现。 文件系统由三个基本部分组成:存储数据的文件的集合,组织文件的目录结构,管理文件的软件机构。 本章主要内容: §6.1 文件 §6.2 目录 §6.3 文件系统 §6.4 Linux虚拟文件系统 §6.5 Ext2文件系统 §6.6 Windows文件系统

本章学习目标 文件、文件系统、文件目录、目录项、文件共享等基本概念及文件的分类 文件的两种逻辑结构及两种存取方法 文件的三种物理结构:连续结构、链接结构及索引结构 UNIX系统的文件索引结构 三种目录结构:单级、两级、多级目录结构 文件的共享及保护 外存空间的管理方法

§6.1 文件 §6.1.1 文件及文件类型 §6.1.2 文件的逻辑结构 §6.1.3 文件的物理结构 §6.1.4 文件的存取方法 主要内容: §6.1.1 文件及文件类型 §6.1.2 文件的逻辑结构 §6.1.3 文件的物理结构 §6.1.4 文件的存取方法 §6.1.5 文件存储空间的管理 §6.1.6 文件操作 §6.1.7 文件的共享与保护 §6.1.8 文件的存储设备

§6.1.1 文件及文件类型 1.文件的定义 2.文件系统的定义 文件是具有标识符(文件名)的一组相关信息的集合。标识符是用来标识文件的。不同的系统对标识符的规定有所不同。文件的确切定义有两种说法: (1)文件是具有标识符的相关字符流的集合。 (2)文件是具有标识符的相关记录的集合。 2.文件系统的定义 文件系统是操作系统中负责存取和管理文件信息的机构。它由管理文件所需的数据结构(如文件控制块,存储分配表等)和相应的管理软件以及访问文件的一组操作组成。

3.文件的分类 按文件的用途可分为: (1)用户文件:由用户建立,并由文件拥有者进行读/写和执行。这类文件只能由文件所有者或所有者授权用户使用。 (2)库文件:由系统为用户提供的实用程序、标准子程序、动态链接库等。 (3)系统文件:由系统建立的文件,如操作系统、编辑系统、编译系统等。这类文件只允许通过系统调用来执行,不允许读/写与修改。

按文件中的数据形式分为: (1)源文件:由源代码和数据构成的文件。通常是由ASCII码或汉字所组成。 (2)目标文件:是指源程序经过编译程序编译后,但尚未链接成可执行文件的目标代码文件。属于二进制文件。 (3)可执行文件:是指目标代码经过链接程序链接后所形成的可以执行的文件。

按文件的访问控制属性分为: (1)只读文件:允许所有者或授权用户对文件进行读,但不允许写。 (2)读写文件:允许所有者或授权用户对文件进行读写。 (3)执行文件:允许授权用户调用执行,但不允许对它进行读写。 (4)不保护文件:不加任何访问限制的文件。

按信息流向分类 (1)输入文件:如读卡机上的文件只能读入,所以它们是输入文件。 (2)输出文件:如打印机上的文件只能写出,所以它们是输出文件。 (3)输入/输出文件:如磁盘、磁带上的文件,既可读又可写,所以它们是输入/输出文件。 按文件的组织方式分类 (1)一般文件:也叫普通文件,它按一般的文件格式进行组织,如字符流文件。 (2)特殊文件:如目录文件(由目录信息构成的文件)。在某些操作系统中,把I/O设备也定义为特殊文件。

UNIX文件类型 (1)正规文件:是指系统所规定的普通格式的文件,包括系统文件、库文件以及各种用户文件等。 (2)目录文件:是由文件目录构成的一类文件。是用来维护文件系统结构和管理普通文件和目录的文件。 (3)符号链接:又称为软链接。它是一个短文件,其中包含了另一个文件的任意一个路径名。这个路径名可以指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。硬链接是指目录表中的目录项所确定的文件名和索引节点之间的对应关系。硬链接的次数就是同一索引节点被目录项引用的次数。

(4)设备文件:包括块设备文件和字符设备文件。在UNIX系统中,所有的输入输出设备都被看成是文件,甚至在使用形式上也和普通文件相同。 (5)管道(pipe)文件:系统使用管道文件的目的是希望将一个进程的输出作为另一个进程的输入。管道文件使用一块专用的内存区域来保存中间信息。 (6)套接字(socket):又称插口。通过在发送方和接收方分别创建一个称为套接字的通信端点可以获得TCP服务。每个套接字有一个套接字序号(地址),包含主机的IP地址和一个端口。每条连接由两端的套接字标识符来识别,即(socket1, socket2)。

§6.1.2 文件的逻辑结构 1.文件结构 文件结构是指文件的组织形式。通常分为文件的逻辑结构和文件的物理结构。 文件的逻辑结构是指从用户的观点出发,用户所观察到的文件组织形式。 文件的物理结构又称为文件的存储结构,是指文件在外部存储介质上是如何存放的,即文件在外存上的存储组织形式。

2.文件的逻辑结构(常分为2种) (1)有结构的文件 有结构的文件是指由若干个相关的记录构成的文件,又称记录式文件。用户存取文件是以记录为单位进行的。记录又分为定长的和变长的记录。 (2)无结构文件 无结构文件又称流式文件,组成流式文件的基本信息单位是字节或字,其长度是文件中所含字节的数目,如大量的源程序,库函数等采用的就是流式结构。

§6.1.3 文件的物理结构 为了有效地管理文件存储器,通常把文件存储空间划分成若干个大小相等的物理块,物理块是分配及传输信息的基本单位。块的大小通常是扇区的倍数,如512B、1KB、2KB或者4KB。 一个物理块中可以存放若干个逻辑记录,一个逻辑记录也可以存放在若干个物理块中。 为了有效地利用外存和便于系统管理,一般也把文件信息划分为与物理存储块大小相等的逻辑块。 常见的文件物理结构有三种:连续结构、链接结构和索引结构。

1.连续结构 连续结构,又称顺序结构,是一种最常用和最简单的物理文件结构,它把逻辑上连续的文件信息存储在物理位置连续的物理块中。 图6.1 文件的连续结构

文件名 起始块号 长度 File A 2 3 File B 8 5 File C 15 4 文件目录表 文件名 起始块号 长度 File A 2 3 File B 8 5 File C 15 4 14 29 磁盘空间 图4-1 连续结构的文件组织

连续结构的主要优点是实现简单和存取速度快,只要记住文件的第一块号和块数就能确定该文件在外存上的位置。当文件是定长记录文件时,还可根据文件起始地址及记录长度进行随机访问。 缺点:不利于文件的动态增长,因为文件末尾处可能已经没有空闲块了,一旦增长,就需要进行大量的改动;反复增删文件以后,存储设备中便会产生类似于内存分配中出现的磁盘空间碎片。因此,连续结构只适用于长度固定的文件。

2.链接结构 链接结构是指可以将文件存储在外部存储介质上的若干个不必连续的物理块中,其中的每个物理块都设有一个指针字段,指向下一个物理块的位置,从而使得存放同一个文件的物理块链接起来。以链接结构存放的文件称为链接文件。 图6.2 文件的链接结构

文件名 起始块号 结束块号 File A 2 7 File B 10 14 File C 15 22 文件目录表 文件名 起始块号 结束块号 File A 2 7 File B 10 14 File C 15 22 19 13 7 4 14 29 磁盘空间 图4-2 链接结构的文件组织 -1 12 22

链接结构的优点是可以解决文件存储空间的碎片问题,提高了文件存储空间的利用率,同时允许文件动态增长。 缺点:但链接文件只能按照文件的链接指针顺序访问,为了访问文件的第i块,必须从第一块开始访问,然后一块接着一块,直到找到第i块。另一个缺点是必须为指针字段分配空间。

为了克服链接结构文件的缺点,可以把所有链接文件里的指针从物理块中取出,存放在一张链接表中,表的长度就是文件存储器能划分的物理块数,表的序号就是物理块号。 在每个表项中,存放链接指针,即下一个物理块号。该链接表存放在内存里。 由于分配给文件的所有物理块的块号都在该链接表中,故把该链接表称为文件分配表FAT(File Allocation Table),MS-DOS及OS/2等操作系统都采用FAT

显式链接 图 6-9 显式链接结构

图 6-10 MS-DOS的文件物理结构

3.索引结构 索引结构就是把每个文件占用磁盘的物理块号集中存放在一张表中,即每一个文件都有一张索引表。每一个索引表项存放文件数据所占用的一个磁盘块的地址。以索引结构存放的文件称为索引文件。 图6.3 文件的索引结构

文件目录表 文件名 索引块号 File A 20 File B 10 19 13 7 4 14 29 磁盘空间 图4-3 索引结构的文件组织 磁盘空间 图4-3 索引结构的文件组织 4,6,9,11,14,16

图6.4 文件的多重索引结构

模式 拥有者 时间戳 文件大小 块的数量 直 接 块 一级间接块 二级间接块 三级间接块 … 数据块 图4-4 UNIX文件的索引结构

§6.1.4 文件的存取方法 文件存取方法是指用户在使用文件时按怎样的次序存取文件。文件的存取方法是由文件的性质和用户使用文件的情况决定的。根据对文件信息的存取次序不同,把文件存取方法分为顺序存取、随机存取、索引存取等。 1.顺序存取 顺序存取是最简单的方法。它严格按照文件信息单位排列的顺序依次存取,后一次存取总是在前一次存取的基础上进行,所以不必给出具体的存取位置。在文件读写过程中总有两个位置指针指向其中要读写的字节位置或要读写的记录位置。 读写指针R R+l :

2.随机存取 定长记录随机存取 变长记录随机存取 起始R R+4*l 随机存取又称直接存取,在存取时必须先确定进行存取时的起始位置(如记录号、字符序号等)。直接存取通常是对记录式文件而言的。 对于定长记录式文件来说,直接存取方便、高效。 对于变长记录文件,采用顺序存取方法会更高效。磁盘是支持随机存取的典型设备。 变长记录随机存取 起始R R+l0 l0 l1 l2 l3 l4 l5 R+l0+l1+l2+l3+l4

3.按键存取 文件索引存取又称为按键存取,即对文件中的记录按某个数据项的值进行排序,从而可以根据键值来快速存取。 l0 起始R l1 按键值排列的 索引表

§6.1.5 文件存储空间的管理 文件存储空间主要是指磁盘空间。文件系统应为分配存储空间而设置相应的数据结构,还应提供对存储空间进行分配和回收的功能。下面介绍几种常用的空闲存储空间管理方法。 1.空白文件目录 系统将文件存储设备上的每个连续空闲区都看作一个空白文件,并为所有空白文件单独建立一个目录,每个空白文件在这个目录中占一个目录项,目录项的内容包括第一个空白块的地址(物理块号)和空白块的数目。

表6-1 空白文件目录 序号 第一个空白块号 空白块的数目 物理磁盘块号 1 14 6 (14,15,16,17,18,19) 2 23 2 (23,24) 3 51 4 (51,52,53,54) … … … … 这是一种最简单的空闲区管理技术。适合于文件的静态分配(即连续结构的文件分配)。分配存储空间时,分割某个空白文件;系统回收该文件所占空间,要考虑相邻接空白文件合并问题。 显然,当文件存储空间中只有少量空白区时,这种方法才有较好的效果。如果存储空间中有大量小的空白区,那么空白文件目录会变得很大,因而效率大为降低。

2.位映像表 15 14 …… 9 8 7 6 5 4 3 2 1 0 适合文件静态分配和动态分配的最简单管理方法是采用位映像表(或位示图)。 0 1 2 3 :: 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 …………………… 系统需要将位映像表中的二进制位所在位置与盘块号之间进行转换: 分配时,已知位坐标i、j,盘块号k=16*i+j; 回收时,已知K,则i=k/16,j=K%16。 一个1G的磁盘,每个盘块为1KB时,它要求一个1M位的映像表,这个表占128个磁盘块(1M/8k)。位映像表需要调入内存。

3.空闲块链表 空闲块链表是通过链表来实现的。 ∧ first 该方法的优点是实现简单,但工作效率低,因为每当在链上增加或移去空闲块时,都需要对空闲块链做较大的调整,因而会有较大的系统开销。 对空闲块链管理技术的改进方法是采用成组空闲块链表,即利用盘空闲块管理盘上的空闲块,每个磁盘块记录尽可能多的空闲块。

UNIX系统采用了这种成组空闲块链表管理方法。 显然这种管理方法既适合连续结构,也适合链接和索引结构。

§6.1.6 文件操作 文件系统向用户提供的对文件的操作可以分为两大类:一类是对文件自身的操作,例如,创建新文件、打开文件、删除文件、读写文件等;另一类是对记录的操作,例如,检索文件中的记录、插入记录、删除记录等。常用的文件操作如下: 1.创建文件 当用户需要把一批信息作为文件保存时,要通过系统调用命令向系统提出请求。系统首先要为新文件分配必要的外存空间,并且在文件系统的相应的目录中,为之建立一个目录项,其中记录了该文件的文件名及其在外存中的地址等文件属性信息。

2.打开文件 当用户要访问外存文件时,应先打开文件,在用户和文件之间建立起联系。将文件属性信息装入内存,在内存建立起相应的文件对象。一旦文件被打开就可以多次使用,直到文件被关闭为止。 3.读文件 读文件就是把文件中的数据从外存读入内存的用户区。在读文件的系统调用中要给出文件路径名和存放读出内容的内存地址。系统首先根据用户提供的文件路径名查找目录,找到指定文件的目录项,从中得到该文件在外存的地址。在目录项中,还有一个指针用于对文件的读写。通过读指针,将位于外存上的数据读入指定的内存区域。

4.写文件 5.关闭文件 6.删除文件 当用户需要在文件中添加信息或修改文件时,可通过写文件系统调用向系统提出请求。 关闭文件是指撤销该文件在主存中的目录项(属性)信息,切断用户与该文件的联系;若在文件打开期间,该文件做过某些修改,则应将其写回辅存。 关闭文件不但为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。 6.删除文件 当用户提出删除文件的请求后,系统先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件占用的存储空间。

§6.1.7 文件的共享与保护 文件共享是指不同的用户可以通过共享使用同一文件。文件的共享可以节省大量的辅存空间和主存空间,减少输入/输出操作,为用户间的合作提供便利条件。文件的共享应该是有条件的,是要加以控制的。因此,文件的共享要解决两个问题,一个是如何实现文件共享,二是对各类需共享文件的用户进行存取控制。 实现文件共享有两种方法。一种方法是由系统实现对文件的共享,即当用户知道要共享文件的路径时,可以通过提供从根目录出发的路径名来共享访问这些文件。另一种方法是对需要共享的文件进行链接,即一个目录中的目录项直接指向另一个目录的目录项。

文件保护是指避免文件拥有者或其他用户因有意或无意的错误操作而使文件遭到破坏。文件保密是指文件本身不得被未授权的用户访问。这两个问题都涉及到用户对文件的访问权限,即文件的存取控制。存取控制矩阵如下所示: Joan Alice Tom FILE1 RW RWX R FILE2 X FILE3 W

UNIX系统为每个文件的三类用户:拥有者、拥有者的小组成员及其它用户都规定了访问权限。 每类用户有一个由三个二进制位组成的存取控制表。这三位用来指示该类用户对文件是否有读、写、执行的存取权。若相应位被设置,则允许执行相应操作,否则拒绝执行。 例如,当一个文件的访问权限为111 101 001时,表示该文件允许文件主读、写、执行,小组成员读和执行,其它用户则只能执行。此外,允许文件主通过chmod命令修改文件的存取权限。

NTFS卷上的每个文件和目录在创建时创建人就被指定为拥有者。拥有者控制着文件或目录权限设置, 并能赋予其他用户访问权限。NTFS的权限设置规则如下: (1)当用户被赋予权限或是属于拥有这种权限的组时,才可以访问相应的文件或目录。 (2)当用户在相应权限的目录中创建新的文件或子目录时,创建的文件或子目录继承该目录的权限。 (3)创建文件或目录的拥有者,可以随时更改对文件或目录的权限设置来控制其他用户对该文件或目录的访问。

(4)权限是累积的。若组A用户对一个文件拥有“写入”权限,组B用户对该文件只有“读取”权限,而用户C同属于两个组,则C将获得“写入”权限。 (5)文件权限优先级高于目录权限。 (6)“拒绝访问”权限优先级高于其他所有权限。 通过对文件和目录的权限设置,用户不仅可以实现对文件的保护,还可以实现对相应权限的文件数据的共享。

§6.1.8 文件的存储设备 1.文件存储设备 保存文件的设备主要有磁盘、磁带、光盘等等。通常,存储在不同设备上的文件,其存取方法也不同。这里以磁盘和磁带为例介绍一下文件存储设备。 磁带是一种典型的顺序存取设备。为了存取方便,磁带被划分成若干物理块,由于磁带机的启动和停止都要花费一定的时间,因此在磁带相邻物理块之间设计有一段间隙将它们隔开。

磁带的存取速度与其上的信息密度、磁带带速以及块间间隙有关。若磁带带速较高,信息密度较大并且所需的块间间隙较小,则磁带的存取速度就高。反之,磁带的存取速度就低。在读写磁带时,如果要访问的数据所在的物理块离磁头当前位置较近,则读写数据较快。反之,则较慢。 磁盘是一种典型的随机存取(直接存取)设备,即磁盘允许文件系统直接存取磁盘上的任意物理块。磁盘上的物理块可以用柱面号、磁道号和扇区号表示。

磁盘组结构: 访问磁盘时,首先需要寻道,将磁头从当前位置移动到指定磁道上,称之为寻道时间;接着将指定扇区移动到磁头下面叫旋转延迟时间;然后将扇区上的数据读出或向该扇区写入数据,称为传输时间。 读写臂 0号磁头 5号磁头 转速为r=7200/分,转一圈1/r

柱面号 扇区 因此访问磁盘的时间由寻道时间、旋转延迟时间和传输时间组成。即 访问磁盘的时间=寻道时间+旋转延迟时间+传输时间

2.磁盘调度算法 磁盘属于共享设备,可以被多个进程共享。当多个进程都提出访问磁盘的请求时,系统应采用相应的磁盘调度算法,在满足各个进程请求的同时,尽力缩短访问磁盘的时间。常用的磁盘调度算法有先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)算法、循环扫描(Circular SCAN)算法。

(1) 先来先服务FCFS (First-Come, First Served)

(2) 最短寻道时间优先SSTF (Shortest Seek Time First)

(3) 扫描(SCAN)算法 1) 进程“饥饿”现象 SSTF算法虽然能获得较好的寻道性能, 但却可能导致某个进程发生“饥饿”(Starvation)现象。因为只要不断有新进程的请求到达, 且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必须优先满足。对SSTF算法略加修改后所形成的SCAN算法, 即可防止老进程出现“饥饿”现象。

2) SCAN算法 图 5-25 SCAN调度算法示例

§6.2 目录 §4.2.1 文件控制块和索引节点 §4.2.2 目录结构 通过文件目录来对外存上所存储的文件进行管理的,功能有: (1)按名存取。这是文件系统向用户提供的最基本功能。 (2)提高检索速度。合理地组织目录结构,可以加快对目录的检索速度,从而提高对文件的存取速度。 (3)文件共享。允许多个用户共享同一文件,以节省存储空间,同时也方便用户。 (4)允许文件重名。以方便用户按照自己的习惯来命名和使用文件。 §4.2.1 文件控制块和索引节点 §4.2.2 目录结构

§6.2.1 文件控制块和索引节点 用于描述和控制文件的数据结构被称为文件控制块(FCB,File Control Block)。文件控制块的有序集合称为文件目录,即一个文件控制块占用一个文件目录项。通常,把文件目录也看作一个文件,称为目录文件。 1.文件控制块 在文件控制块中常用的属性如下: (1)文件名。用户利用文件名来存取文件。 (2)文件的物理地址。包括:文件所在的设备名、盘块号、占用的盘块数。 (3)文件的逻辑结构。文件是流式文件还是记录式文件。 (4)文件的物理结构。指示文件是顺序结构,还是链接结构或索引结构。

目录文件 (5)存取权限。文件主、核准用户、一般用户的存取权限。 (6)日期和时间。文件建立、修改的日期和时间。 (7)当前使用信息。当前已打开该文件的进程数,文件在内存中是否被修改过但尚未写回磁盘上。 目录文件 文件名 扩展名 文件属性 建立日期 建立时间 文件长度 修改日期 修改时间 第一个磁盘块号

2.索引节点 (1)索引节点的引入 文件目录存放在磁盘上,当文件很多时,文件目录要占用大量的磁盘块。 设盘块大小为1K,目录项占64字节,则一个盘块可存放1024/64=16,查找时只须比对文件名,因而读进来的目录项内容大部分没有用处。 假设目录文件所占用的盘块数为N,按此方法查找,则为了找到一个目录项,平均需要调入盘块数为 (N+1) /2个。可见查找效率很低。

(2)索引节点 通过分析可发现,在检索目录文件的过程中,只用到了文件名。属性信息在检索目录时无需调入内存。因此可把文件名和文件属性信息分开,即把文件属性信息用一个称为索引节点的数据结构来描述,而在文件目录的每个目录项中,仅存有文件名和该文件的索引节点编号。 索引节点表 文件名 索引节点号 1 2 … 目录文件 文件属性 建立日期 建立时间 文件长度 修改日期 …… 磁盘块号 索引 节点号 1 2 …

§6.2.2 目录结构 1.单级目录结构 目录的逻辑结构分为:单级目录结构、两级目录结构、树型目录结构。 单级目录结构是指在整个文件系统中只建立一张目录表,其中每个目录项对应一个文件。 创建及删除文件涉及到目录项申请与回收。 单级目录结构的主要优点是实现简单。 其缺点:不允许文件重名;文件查找速度慢。 文件名 扩展名 文件属性 建立日期 建立时间 文件长度 修改日期 修改时间 第一个磁盘块号

2.两级目录结构 两级目录结构是指把系统中的目录分为一个主目录表和多个次目录表。在多用户系统中,可以为每个用户建立一个次目录表,而主目录表则存储着各个次目录表的信息。 两级目录结构的优点:提高了文件检索速度;在不同的用户目录中,可以使用相同的文件名。其缺点:不便于用户之间共享文件;同一用户内不允许文件重名。

3.树型目录结构 树型目录结构是两级目录结构的推广。为了克服两级目录结构不够灵活的缺点,方便文件查找,提高系统效率,在现代操作系统中采用了树型目录结构,如图4-6所示。 根目录 root usr home bash sbin local Zhang Liu Abc squid a.out poly httpd 图4-6 树型目录结构

从树的根目录到任何数据文件,都只有一条唯一的路径,在该路径上从根目录开始,把全部目录文件名和数据文件名,依次用“/”连接起来,就构成了该数据文件的绝对路径名。如a.out文件的路径名为“/home/Liu/a.out”。 通常,一个进程在运行时所要访问的文件只局限于某个范围之内,因此可为每个进程设置一个“当前工作目录”。因此路径名又分为相对路径名和绝对路径名。 树型目录结构的优点:可以把不同类型和不同用途的文件分类,查找速度快;允许文件重名,不同的文件有不同的路径名;利用多级层次关系,能更方便地制定文件的存取权限,有利于保护文件;有利于文件共享。

图 多级目录结构

(1)在根目录下,查找B子目录文件; (2)在B目录下,再查找B子目录文件; 目录查询技术 文件控制块检索 根目录表 B目录文件 查找/B/B/AA/B的步骤 (1)在根目录下,查找B子目录文件; (2)在B目录下,再查找B子目录文件; 文件名 类型 其他属性 A D …… B D …… C D …… …… … ……… 根目录表 文件名 类型 其他属性 B D …… E F …… F D …… …… … ……… B目录文件 B B

目录查询技术 文件控制块检索 (3)在B目录下,再查找AA子目录文件; (4)在AA目录下,再查找B文件; B目录文件 AA目录文件 查找/B/B/AA/B的步骤 (3)在B目录下,再查找AA子目录文件; (4)在AA目录下,再查找B文件; 文件名 类型 其他属性 AA D …… B F …… C F …… …… … ……… B目录文件 文件名 类型 其他属性 B F …… C F …… …… … ……… AA目录文件 AA B

目录查询技术 索引节点检索 图 查找/usr/ast/mbox的步骤 索引节点表 根目录表 索引节点 文件 类型 属性 物理地址 1 d … 6 132 26 496 60 f 200 (1) 在根目录表中查找usr目录 文件 名 索引 节点 . 1 .. bin 4 dev 7 lib 14 etc 9 usr 6 tmp 8 (2) 读入6号索引节点到内存

目录查询技术 索引节点检索 图 查找/usr/ast/mbox的步骤 索引节点表 usr目录文件 (3) 从 132 号 盘块 读入 usr , 查找 ast 索引节点 文件 类型 属性 物理地址 1 d … 6 132 26 496 60 f 200 文件 名 索引 节点 . 6 .. 1 are 19 jkl 30 hui 51 ast 26 lkm 45 (4) 读入 26 号 索引 节点 到 内存

目录查询技术 索引节点检索 图 查找/usr/ast/mbox的步骤 索引节点表 ast目录文件 (5) 从 496 号 盘块 读入 ast , 查找 mbox 索引节点 文件 类型 属性 物理地址 1 d … 6 132 26 496 60 f 200 (7) 从 200 号 盘块 读入 mbox 文件 , 查找 结束 文件 名 索引 节点 . 26 .. 6 gran 64 book 92 mbox 60 mini 81 scr 17 (6) 读入 60 号 索引 节点 到 内存

§6.3 文件系统 §6.3.1 文件系统模型 §6.3.2 文件系统的结构 §6.3.3 常用文件系统 本节从整体角度来讨论文件系统,如文件系统模型、文件系统的结构以及常见文件系统。 §6.3.1 文件系统模型 §6.3.2 文件系统的结构 §6.3.3 常用文件系统

§6.3.1 文件系统模型 1.层次模型 传统的文件系统模型是层次模型。每一层都在下一层的基础上创建新的功能来为上一层服务,由下至上逐层扩展,从而形成一个层次清晰和功能完备的文件系统。 通常,文件系统的层次模型采用四层结构,如图4-7所示。其中包括逻辑文件系统层、文件组织模块层、基本文件系统层、I/O控制层。 应用程序 逻辑文件系统层 文件组织模块层 基本文件系统层 I/O控制层 物理磁盘 图4-7 文件系统层次模型

(1)I/O控制层由设备驱动程序和中断处理程序组成,在内存和磁盘之间传输信息。 (2)基本文件系统层主要向相应的设备驱动程序发出读写磁盘物理块的命令。 (3)文件组织模块层负责对具体文件的逻辑块和物理块进行操作。文件组织模块层能够把文件的逻辑块号对应到物理块号,供基本文件系统层使用。另外,文件组织模块层还负责磁盘空闲空间的管理。 (4)逻辑文件系统层管理元数据信息。元数据包括除了文件内容之外的所有文件结构数据。根据给定的文件名,通过文件目录结构,能找到文件控制块(FCB)信息。逻辑文件系统层还负责文件的保护和安全。

2.虚拟文件系统模型 有些操作系统,如Linux和UNIX系统,具有兼容其它操作系统的能力。人们能够透明地安装磁盘或分区,在这些磁盘或分区上可以驻留其它操作系统所用的文件系统。 要实现操作系统对其它各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓的虚拟文件系统(Virtual File System Switch,VFS)。例如,在Linux操作系统中,可以将DOS格式的磁盘或分区,即文件系统,“安装”到系统中,然后用户程序就可以按完全相同的方式访问这些文件,就好像它们也是Ext2格式的文件一样。

通常,虚拟文件系统分为三个层次,如图4-8所示。 第一层为文件系统接口层,如open、write、close等系统调用接口。 第二层为VFS (Virtual File System)接口层。该层有两个接口:一个是与用户的接口;一个是与特定文件系统的接口。VFS与用户的接口主要是V节点(Vnode,虚拟节点)。V节点是内核中的一个活动文件基类抽象。它定义了文件的访问接口,并且将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过vfs-operations来实现的。VFS通过网络文件系统协议处理远程文件访问。 第三层是具体文件系统层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS (network file system)。

采用虚拟文件系统结构,用户不仅能够访问包含在本地磁盘上的多种文件系统中的文件,甚至能够通过网络访问远程文件系统中的文件。 文件系统接口 VFS接口 图4-8 虚拟文件系统模型 本地文件系统类型2 本地文件系统类型1 远程文件系统类型1 磁盘

3.Windows文件系统模型 在Windows 2000中, I/O管理器通过设备驱动程序、中间驱动程序、过滤驱动程序和文件系统驱动程序(File System Driver,FSD)等来完成I/O操作。 I/O管理器底层的设备驱动程序直接对设备进行I/O操作。中间驱动程序是为了增强设备驱动程序的功能而设计的。例如,当I/O失败时,中间驱动程序会向设备驱动程序发出再试请求。文件系统驱动程序能扩展低层驱动程序的功能,以实现特定的文件系统(如NTFS)。一个网络重定向过滤驱动程序可以截取有关对远程文件的操作,重定向到远程文件服务器上。 设备驱动 磁盘 应用程序 I/O管理器 本地FSD 用户态 核心态 图4-9 本地文件系统驱动

文件系统驱动程序与文件系统管理最为密切。文件系统驱动程序一般分为本地FSD和远程FSD。用户通过本地FSD访问本地计算机上的数据;通过远程FSD访问远程计算机上的数据。 当用户访问某个卷时,I/O管理器通过FSD完成卷识别,之后,本地FSD创建一个设备对象来表示所装载的文件系统。I/O管理器还在由存储管理器所创建的卷设备对象和由FSD所创建的设备对象之间建立连接。 I/O管理器的I/O请求通过该连接传递到FSD设备对象。内存管理器与本地FSD一起实现内存映射文件。本地FSD的体系结构如图4-9所示。

远程FSD由客户端FSD和服务器端FSD组成。客户端FSD首先接收来自应用程序的I/O请求,接着转换为网络文件系统协议命令,然后再通过网络发送给服务器端FSD。服务器端FSD监听并接收网络文件系统协议命令,接着转交给本地FSD去处理。 远程FSD (服务器) 本地FSD 设备驱动 用户态 核心态 应用程序 I/O管理器 (重定向器) 客户端 服务器端 磁盘 图4-10 远程文件系统驱动

§6.3.2 文件系统的结构 通常,一套系统存储装置可以由若干个物理磁盘组成,而每个物理磁盘又可以进行分区。分区(逻辑盘)包括基本分区(primary partition)和扩展分区(extended partition)。扩展分区可以由逻辑分区(logical partition)组成。 分区是磁盘的基本组成部分,是一个能够被格式化和单独使用的逻辑单元。 分区的目的有三个:一是使磁盘初始化,以便可以格式化和存储数据;二是用来分割不同的操作系统;三是便于管理,可以有针对性地对数据进行分类存储,另外也可以更好地利用磁盘空间。分区格式化之后,操作系统就可把初始的文件系统数据结构存储于该分区,此时的分区又称为文件系统或文件卷。一个磁盘可以有多个文件卷,一个文件卷也可以由多个磁盘组成,如RAID磁盘阵列。

通常,磁盘分区由若干个物理磁盘块组成。当用户在使用Format命令或其他的格式化程序格式化磁盘分区时,物理磁盘块的大小就确定了。物理磁盘块的大小是物理扇区的整数倍,通常为2的整次幂。 文件系统的结构包括在磁盘上的结构和在内存中的结构。这些结构随操作系统和文件系统的不同而不同,但又有一些共同的规律。如,在磁盘上,文件系统有多少个磁盘块、空闲磁盘块数、目录结构、文件数据区等。

通常,逻辑盘的结构包括: 引导控制块:操作系统的初始引导块,用以读入并启动操作系统。一个文件系统,只有根文件系统才含有引导控制块。典型地,逻辑盘的第一块或作为引导控制块或空闲不用。在UFS中,被称为引导块;在NTFS中,被称为引导扇区。 盘控制块:包含整个逻辑盘的资源管理信息,如逻辑盘中的块数、块大小、空闲块数、空闲块地址、空闲FCB数以及FCB地址。在UFS中,被称为超级块;在NTFS中,它是主控文件表MFT。 目录结构:被用来组织文件的。 FCB:包含文件的属性信息,如文件访问权限、大小、存储地址。在UFS中,被称为i节点(inode);在NTFS中,文件属性信息实际上被存储在MFT里。

在内存中的数据结构包括: 已安装文件卷表:包含每一个被安装文件卷的信息。 内存目录结构:维持最近访问过的目录信息。已安装文件卷的目录包含一个指向该文件卷的指针。 系统打开文件表:包含每个已打开文件的FCB的副本,以及其他信息。 进程打开文件表:包含一个指向系统打开文件表相应项的指针,以及其他信息。 当创建一个新文件时,应用程序调用逻辑文件系统,由逻辑文件系统分配一个新的FCB(文件控制块)。同时把相应的目录读入内存,用新的文件名和FCB来更新该目录,接着把该目录写回磁盘。 逻辑文件系统能通过调用文件组织模块,实现目录I/O到磁盘块号的映射,该磁盘块号会被送到基本文件系统层和I/O控制层。文件组织模块层能为文件数据的存储分配磁盘块。文件被创建后,就可以读写文件了。

读写文件之前必须先打开文件。在文件被打开的过程中,要根据给定的文件路径名搜索目录结构。在内存,常常缓存部分目录结构以便加速目录操作。一旦文件被找到,文件的FCB被复制到内存里的系统打开文件表里。该表不仅存储FCB,还记录打开该文件的进程数。接着,在进程打开文件表里创建一个指针字段,指向系统打开文件表里相应的表项。 打开文件系统调用返回指向进程打开文件表相应项的指针,以后文件的操作都通过这个指针进行。在UNIX系统,打开文件系统调用返回的是文件描述符;在Windows 2000中,返回的是文件句柄。

图6-12 两个进程打开文件后的数据结构

当进程关闭文件时,相应的进程打开文件表项被删除,相应的系统打开文件表项里的文件打开次数减一。当所有打开该文件的进程都关闭该文件时,已修改的文件信息被写回磁盘,相应的系统打开文件表项被删除。 实际上,open系统调用首先搜索系统打开文件表,看该文件是否已被其它进程打开了。如果已经打开了,在进程打开文件表里增加一个指针,指向该文件在系统打开文件表里所占用的表项即可。 在UFS中,系统打开文件表维持者i节点和其它文件信息,为网络连接和设备也维持着同样的信息。

§6.3.3 常用文件系统 S5FS:Unix系统V的文件系统 §6.3.3 常用文件系统 S5FS:Unix系统V的文件系统 FAT(File Allocation Table):FAT文件系统于1982年开始应用于MS-DOS中。经过不断改进,它已经发展成为包含FAT12,FAT16和FAT32的庞大家族。 NTFS(New Technology File System):NTFS是微软为了配合Windows NT的推出而设计的文件系统,为系统提供了极大的安全性和可靠性。 Ext2:是Linux系统常用的文件系统,向后兼容性好。 Minix:最早的Unix文件系统之一,但缺少特色,能力也有限。 HPFS(High Performance File System):用于OS/2操作系统的高性能文件系统。 NFS:网络文件系统,允许多台计算机之间共享文件系统。

6.4 Linux虚拟文件系统 §6.4.1 概述 Linux和UNIX系统,具有兼容其它操作系统的能力。 §6.4.1 概述 Linux和UNIX系统,具有兼容其它操作系统的能力。 要实现操作系统对其它各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。使用户程序可以通过同一个文件系统操作界面,对各种不同的文件系统以及文件进行操作。 这样,就可以隐去各种不同文件系统的实现细节,为用户程序提供一个虚拟的、抽象的、统一的文件系统操作界面,即所谓的虚拟文件系统(Virtual Filesystem Switch,VFS)。

VFS抽象界面主要由一组标准的文件操作构成,以系统调用的形式提供给用户程序,如read()、write()等 Linux的虚拟文件系统对多种类型的文件系统提供更为广泛的支持。不同的文件系统与VFS之间的界面是一个file_operations数据结构。 每个进程通过打开文件与具体的文件建立起连接,或者说建立起一个读/写的上下文。该连接用一个file数据结构来表示,结构中有个类型为file_operations的指针域f_op。将指针域f_op设置成指向某个具体的文件系统所提供的一组操作函数。Linux内核中,VFS与具体文件系统的关系如图4-11所示。

函数sys_read()、sys_write()、sys_open()等等 用户进程 VFS 用户空间 系统空间 文件系统操作的系统调用界面,包括read()、write()、open()等等 Minix Ext2 FAT … 设备文件 通过file结构中的f_op指针实现的“文件系统总线” 函数sys_read()、sys_write()、sys_open()等等 图4-11 VFS与具体文件系统的关系示意图

§6.4.2 VFS的数据结构 在虚拟文件系统中引入了一个通用的文件模型,这个模型能够表示所有支持的文件系统。要实现每个具体的文件系统,必须将其物理组织结构转换为虚拟文件系统的通用文件模型。 通用文件模型中的对象主要有以下四个: 超级块对象(superblock object)用于存放已安装的文件系统的有关信息。对于基于磁盘的文件系统,该对象对应于存放在磁盘上的文件系统控制块。 索引节点对象(inode object)用于存放具体文件的相关属性信息。对于基于磁盘的文件系统,该对象对应于存放在磁盘上的文件控制块。 文件对象(file object)用于存放进程与打开文件之间进行交互的有关信息。 (dentry object) 目录项对象用于存放目录项与对应文件进行链接的有关信息。

图6-12显示了一个进程与文件的交互的例子。三个不同进程打开同一个文件,其中两个进程使用同一个硬链接。每个进程都有自己的文件对象,每个硬链接对应一个目录项对象。三个文件对象只需要两个目录项对象,这两个目录项对象对应同一个索引节点对象,这个索引节点对象标识的是超级块对象以及普通磁盘文件。 进程1 进程2 进程3 文件对象 目录项对象 目录想对象 索引节点 对象 超级块对象 磁盘文件 图6-12 进程与VFS对象的交互

1.超级块对象 Linux操作系统用super_block数据结构来描述超级块对象,超级块对象的部分域如下: 类型 域 描述 struct list_head s_list 形成超级块对象的双向链表 kdev_t s_dev 设备标识符 unsigned long s_blocksize 以字节为单位的盘块大小 struct file_system_type *s_type 文件系统类型 unsigned char s_lock 锁标志 s_flags 安装标志 struct super_operations *s_op 超级块方法 struct dentry *s_root 指向安装目录的目录项对象的指针 s_dirty 已被修改的索引节点的链表 …… union u 具体文件系统信息

所有已安装文件系统的超级块对象都以双向循环链表的形式链接在一起。超级块对象的s_list域包含指向链表中两个相邻超级块对象的指针next和prev。表中的第一个元素和最后一个元素的地址分别存放在super_blocks变量的s_list域的next和prev中。超级块链表如图6-13 超级块对象 next prev s_list super_blocks 图6-13 超级块对象链表

超级块对象中的最后一个u联合体域包含了属于具体文件系统的超级块信息。假如超级块对象指的是Ext2文件系统,该域就存放ext2_sb_info数据结构。通常,为了效率起见u域的数据被复制到内存。 与超级块对象关联的方法就是所谓的超级块操作(s_op),这些操作是由数据结构super_operations来描述的,如read_inode(inode)、write_inode(inode)、put_inode(inode)、delete_inode(inode)、put_super(super)、write_super(super)等等。每种文件系统都可以定义自己的超级块操作,当VFS需要调用write_inode()操作时,VFS执行: sb->s_op->write_inode(inode); 其中sb存放的是相应超级块对象的地址。

2.索引节点对象 系统内核用数据结构inode来描述内存中的索引节点对象。 每个索引节点对象总是出现在下列某个循环双向链表中:未使用索引节点链表(由变量inode_unused指向)、正在使用索引节点链表(由变量inode_in_use指向)、脏索引节点链表(由超级块对象的s_dirty域指向)。属于“正在使用”或“脏”链表的索引节点对象也同时存放在一个称为inode_hashtable的散列表中。 最后一个u联合体用于存放属于具体文件系统的索引节点信息。假如索引节点对象指的是Ext2文件,该域就存放ext2_inode_info数据结构。 对索引节点的操作用索引节点对象关联的方法(i_op)来实现。

表6-3 索引节点对象的部分域 类型 域 描述 unsigned long i_ino 索引节点号 表6-3 索引节点对象的部分域 类型 域 描述 unsigned long i_ino 索引节点号 unsigned int i_count 引用计数器 nlink_t i_nlink 硬连接数目 kdev_t s_dev 设备标识符 struct list_head i_hash 指向散列链表的指针 struct list_head i_list 指向索引节点链表的指针 struct list_head i_dentry 指向目录项链表的指针 umode_t i_mode 文件类型和访问权限 uid_t i_uid 所有者标识符 gid_t i_gid 组标识符 off_t i_size 文件的字节数 unsigned long i_blksize 块的字节数 unsigned long i_blocks 文件的块数 unsigned long i_nrpages 包含文件数据的页数 struct semaphore i_sem 索引节点信号量 struct inode_operations * i_op 索引节点的操作 struct super_block * i_sb 指向超级块对象的指针 struct page * i_pages 指向页描述符的指针 … … … union u 具体文件系统信息

3.文件对象 进程与一个打开文件交互的信息是由文件对象来描述的。用一个file数据结构表示。文件对象在磁盘上没有对应的映像,存放在文件对象中的主要信息是文件当前的位移量(文件指针)。由于几个进程可能并发访问同一个文件,因此文件指针不能存放在索引节点对象中,只能存放在文件对象中。 文件对象也是被包含在循环双向链表之中:“未使用”文件对象的链表和“正在使用”文件对象的链表。 每个文件系统都有自己的文件操作集合,执行读写文件的操作。当内核将一个索引节点从磁盘装入内存时,会在file_operations数据结构中存放一个指向这些文件操作的指针,该结构的地址存放在该索引节点对象的inode_operations数据结构的default_file_ops域中。

file_operations表所包含的文件操作函数如下:read、write、open、ioctl、release和readdir等等。文件对象的部分域如下: 类型 域 描述 struct file **f_prev 指向前一个文件对象的指针 struct file *f_next 指向下一个文件对象的指针 struct dentry *f_dentry 指向相关目录项对象的指针 struct file_operations *f_op 指向文件操作表的指针 loff_t f_pos 文件当前的位移量(文件指针) unsigned int f_count 文件对象的引用计数器 unsigned int f_uid 用户的UID unsigned int f_gid 用户的GID … … … void * private_data tty驱动程序所需

4.目录项对象 VFS把目录看作文件,即一个由若干子目录和文件组成的普通文件。内核把目录项读入内存后,VFS就把它转换为基于dentry结构的一个目录项对象,该结构的部分域如表6-5 所示。 内核为进程查找的路径名中的每个分量都创建一个目录项对象。每个目录项对象都与其对应的索引节点相联系。例如,在查找路径名/usr/local时,内核为根目录“/”创建一个目录项对象,为根目录下的usr项创建一个第二级目录项对象,为/usr目录下的local项创建一个第三级目录项对象。目录项对象在磁盘上没有对应的映像。

表6-5 目录项对象的部分域 类型 域 描述 struct qstr d_name 文件名 表6-5 目录项对象的部分域 类型 域 描述 struct qstr d_name 文件名 struct inode * d_inode 与文件名关联的索引节点对象 int d_count 目录项对象引用计数器 struct dentry * d_parent 父目录的目录项对象 struct dentry * d_mounts 对于安装点,表示被安装fs根项 struct dentry * d_covers 对fs根而言,表示安装点的目录项 struct list_head d_hash 散列表表项的指针 struct list_head d_lru 未使用链表的指针 struct list_head d_child 父目录中目录项对象的链表的指针 struct list_head d_subdirs 表示子目录目录项对象的链表 struct list_head d_alias 相关索引节点(别名)的链表 struct dentry_operations* d_op 目录项方法 struct super_block * d_sb 文件的超级块对象 … … …

5.与进程相关的文件 每个进程都有它自己的当前工作目录和它自己的根目录。该信息存放在一个结构类型为fs_struct的内核表中,该表的首地址存放在进程描述符(或进程控制块)的fs域中。 Struct fs_struct { atomic_t count; 共享同一fs_struct表的进程数目 int umask; 系统调用umask()为新创建的文件设置初始文件许可权 struct dentry * root, * pwd; 当前工作目录和根目录 }

一个结构类型为files_struct的表存有进程当前打开的文件信息,该表的首地址存放在进程描述符的files域。files_struct数据结构的部分域如表6-6所示。 类型 域 描述 int count 共享该表的进程数目 int max_fds 当前文件对象的最大数目 struct file ** fd 指向文件对象指针数组的指针 struct file * fd_array[32] 文件对象指针的初始化数组 … … … fd域存放文件对象指针数组的首地址,文件对象指针数组的长度存放在max_fds域中。如果进程打开的文件数目多于32,内核就分配一个新的、更大的文件对象指针数组,并将其地址存放在fd域中,内核同时也更新max_fds域的值。

文件对象指针数组中的索引就是文件描述符(file descriptor)。索引为0、1、2的元素是进程标准输入、输出、标准错误文件的指针,如图6-14所示。Unix进程将文件描述符作为主文件标识符。 fd 1 2 3 4 stdin stdout stderr 文件对象 图6-14 fd数组

§6.4.3 VFS系统调用的实现 1.文件的打开与关闭 用户进程在读/写一个文件之前必须先打开这个文件。所谓打开文件实质上是在进程与文件之间建立连接,而打开文件描述符唯一地标识着这个连接。 应用程序对open ( )的调用将引起内核调用服务例程sys_open ( )函数,该函数接收的参数为:要打开文件的路径名和访问模式等。该系统调用成功后将返回一个文件描述符,也就是文件对象指针数组的一个索引;系统调用不成功时返回-1。 用户程序通过close ( )系统调用关闭打开的文件,该函数接收的参数为要关闭文件的文件描述符。内核服务例程为sys_close ( )函数。

图6-15 Linux文件系统逻辑结构图 files_struct inode_op dentry_op dentry d_inode fd_array[fid] inode_op dentry_op dentry d_inode files_op read inode U i_op files f_dentry f_op write task_struct fs file fs_struct root pwd d_op 当前目录的inode 用户进程根目录的inode 图6-15 Linux文件系统逻辑结构图

2.文件的读与写 文件的读/写主要是通过系统调用read ( )和write ( )完成的,对于读/写文件的进程,目标文件是由一个打开文件描述符代表的。 为了提高效率,一般操作系统对文件的读/写都是带缓冲的。所谓缓冲,是指系统为最近刚读/写过的文件内容在内核中保留一份副本,以便当再次需要时就不必从设备上读入,而需要写的时候则可以先写到副本中,待系统较为空闲时再从副本写回设备。 在多进程的系统中,由于同一文件可能为多个进程所共享,缓冲的作用就更显著了。

如果将文件的内容以页面为单位缓冲,放在附属于该文件的inode结构的缓冲队列中,那么只要相应地设置进程的内存映射表,就可以很自然地将这些缓冲页面映射到进程的用户空间中。 建立了这样的映射以后,就可以象访问内存一样地访问这个文件。这样可以通过read ( )和write ( )系统调用目标文件的inode结构访问这些缓冲页面;在通过内存映射机制访问这个文件时,就可以经由页面映射表直接读写这些缓冲着的页面。 如图6-16所示。通常磁盘块的大小与内存缓冲区的大小相当,即一个磁盘块中的数据能存储在内存里的一个缓冲区中。

图6-16 文件页面缓冲队列与设备缓冲区队列的关系图 每个缓冲页面4个记录块 buffer_head 系统空间映射 用户空间映射 pages file dentry inode i_pages page virtual 文件缓冲页面队列 设备缓冲区队列 data 页面映射表 图6-16 文件页面缓冲队列与设备缓冲区队列的关系图

inode数据结构中有一个page结构的指针i_pages,在page结构中有一个指针virtual指向其所代表的页面,但是page结构本身则不在这个页面中。同样地,在缓冲区头部(buffer_head)数据结构中有一个指针b_data指向缓冲区,而buffer_head结构本身则不在缓冲区中。所以在设备层中只要保持一些buffer_head结构,让它们的b_data指针分别指向缓冲页面中的相应位置就可以了。 以一个缓冲页面为例,在文件层它通过一个page数据结构挂入所属inode结构的缓冲页面队列;同时又通过各个进程的页面映射表映射到这些进程的内存空间;在设备层通过若干(通常是4个)buffer_head结构挂入其所在设备的缓冲区队列。可见,以页面为单位为文件内容建立缓冲是最佳选择。

read ( )和write ( )的服务例程分别是sys_read ( )和sys_write ( )函数。它们都需要三个参数:一个文件描述符fd;一个包含要传送数据的内存缓冲区地址buf;一个指定应该传送多少字节数的count。read ( )把数据从文件传送到缓冲区,而write ( )执行相反的操作。 两个系统调用都返回所成功传送的字节数,或者发一个错误信号并返回-1。读或写操作总是发生在由当前文件指针所指定的文件偏移量处(文件对象的f_pos域)。两个系统调用都通过把所传送的字节数加到文件指针来更新文件指针。

§6.5 Ext2文件系统 Linux最初采用的是Minix的文件系统,Minix只是一种试验性(用于教学)的操作系统,其文件系统的大小仅限于64M字节,文件名长度限于14个字符。后来Linux引入了扩展文件系统(Ext FS)。扩展文件系统包含了几个重要的扩展,但提供的性能不令人满意。 在1994年Linux又引入了第二扩展文件系统(Second Extended File System, Ext2)。Ext2在增加了几个新的特点后,运行起来相当高效和强健,已成为广泛使用的Linux文件系统。 下面我们主要阐述Ext2文件系统的“磁盘数据结构”和“内存数据结构”。最后介绍一下Ext2的方法和磁盘空间管理。

§6.5.1 磁盘数据结构 在许多文件系统中常把整个设备划分成若干“柱面组”,将反映着盘面存储空间的组织与管理的信息分散后就近存储于各个柱面组中。以便提高效率。 柱面组划分的要求: (1)关于这些柱面组本身的结构信息,如此就要用一些磁盘块来保存所有的柱面组的描述,即所谓“组描述结构”(group descriptor)。 (2)有些信息是对于整个设备的而不只是针对一个柱面组的,所以不能把它拆散,而只能重复地存储于每个柱面组中。从另一个角度来讲,将某些重要的信息重复存储于每个柱面组为这些信息提供了备份,从而增加了可靠性。

Ext2文件系统采用了“盘块组”结构,而不是“柱面组”。并且将超级块和所有的块组描述结构重复存储于每个块组。 1个块 n个块 超级块 组描 述符 盘块 位图 索引节 点位图 索引 节点区 数据区 引导块 块组0 块组n …… 图6-17 Ext2文件系统格式示意图

超级块和组描述符被复制到每个块组中。只有块组0中所包含的超级块和组描述符才由内核使用。当系统对文件系统的状态执行一致性检查时,就引用存放在块组0中的超级块和组描述符,然后把它们复制到其它所有的块组中。 块组的多少取决于分区的大小和块的大小。其主要限制在于盘块位图必须存放在一个单独的块中(盘块位图的每1位对应着块组中的一个盘块,1表示已分配,0表示空闲)。 每组中至多可以有8×b块,b是以字节为单位的块大小。因此,块组的总数大约是s/(8×b),s是总块数。例如,一下8GB的Ext2分区,盘块的大小为4KB。每个4KB的盘块位图描述32K个磁盘块,即128MB。因此,最多需要64个块组。可见,盘块的大小越小,块组数越多。

1.超级块 Ext2在磁盘上的超级块存放在一个ext2_super_block数据结构中,它的部分域列于表6-7中。 s_inodes_count域存放Ext2文件系统中全部索引节点数,s_blocks_count域存放Ext2文件系统中的块数。s_log_block_size域以2的幂次方表示块的大小,用1024字节作为单位,0表示1024字节的块,1表示2048字节的块,等等。 s_blocks_per_group域存放每个块组中的块数 s_inodes_per_group域存放每个块组中的索引节点数。

表6-7 Ext2超级块的部分域 类型 域 描述 __u32 s_log_block_size 块的大小 __u32 s_blocks_per_group 每组中的块数 __u32 s_free_blocks_count 空闲块计数器 __u32 s_inodes_count 索引节点的总数 __u32 s_inodes_per_group 每组中的索引节点数 __u32 s_free_inodes_count 空闲索引节点计数器 __u32 s_blocks_count 以块为单位的文件系统的大小 __u32 s_creator_os 创建文件系统的操作系统 __u16 s_inode_size 磁盘上索引节点结构的大小 __u8 [16] s_uuid 128位文件系统标识符 char [16] s_volume_name 卷名 char [64] s_last_mounted 最后一个安装点的路径名 … … …

2.组描述符和位图 每个块组有自己的组描述符,其数据结构ext2_group_desc的部分域如下: 表6-8 Ext2组描述符的部分域 类型 域 描述 __u32 bg_block_bitmap 块位图所在的块号 __u32 bg_inode_bitmap 索引节点位图所在的块号 __u32 bg_inode_table 索引节点表的第一个块的块号 __u16 bg_free_blocks_count 组中空闲块的个数 __u16 bg_free_inodes_count 组中索引节点的个数 __u16 bg_used_dirs_count 组中目录的个数 … … … 表6-8 Ext2组描述符的部分域

3.索引节点表 索引节点表存放在一些连续磁盘块中,其中每一块包含索引节点的预定义号。索引节点表第一个块的块号存放在组描述符的bg_inode_table域中。所有索引节点的大小相同,即128字节。一个1024字节的块可以包含8个索引节点。每个Ext2索引节点是一个ext2_inode结构,其部分域在表6-9中给出。 分配新节点和数据块时要用到的域:bg_free_blocks_count、bg_free_inodes_count和bg_used_dirs_count域。

表6-9 一个Ext2磁盘索引节点的部分域 类型 域 描述 __u16 i_uid 拥有者的标识符 类型 域 描述 __u16 i_uid 拥有者的标识符 __u16 i_mode 文件类型和访问权限 __u32 i_size 以字节为单位的文件长度 __u32 i_ctime 索引节点最后改变的时间 __u32 i_atime 最后一次文件访问的时间 __u32 i_mtime 文件内容最后改变的时间 __u16 i_links_count 硬连接计数器 __u16 i_gid 组描述符 __u32 i_blocks 文件的数据块数 __u32 i_block[EXT2_N_BLOCKS] 指向数据块的指针(索引表) __u32 i_file_acl 文件访问控制表 __u32 i_dir_acl 目录访问控制表 union osd1 特定的操作系统信息 … … …

位图是位的序列,0表示相应的索引节点或数据块是空闲的,1表示已被占用。因为每个位图必须被存放在一个单独的块中,而块的大小可以是1024、2048或4096,因此,一个单独的位图能描述8192、16384或32768个块的状态。 磁盘索引节点结构中的i_size域存放以字节为单位的文件的有效长度,而i_blocks域存放已分配给文件的数据块数(以512字节为单位)。i_block域是一个一维数组,其中包含EXT2_N_BLOCKS(通常是15)个指针元素,其指针用来标识分配给文件的数据块。

§6.5.2 内存数据结构 为了提高系统运行效率,在安装Ext2文件系统的同时,内核把存放在Ext2分区的磁盘数据结构中的大部分信息拷贝到内存RAM中,如下表。其中频繁更新的数据需要缓存。内核通过让缓冲区引用计数器的值一直大于0来达到此目的。 表6-10 Ext2数据结构的VFS映像 类型 磁盘数据结构 内存数据结构 缓存模式 超级块 ext2_super_block ext2_sb_info 总是缓存 组描述符 ext2_group_desc ext2_group_desc 总是缓存 索引节点位图 块中的位数组 缓冲中的位数组 固定限制 块位图 块中的位数组 缓冲中的位数组 固定限制 索引节点 ext2_inode ext2_inode_info 动态 数据块 未指定 缓冲 动态 空闲索引节点 ext2_inode 无 从不缓存 空闲块 未指定 无 从不缓存

缓存模式为“从不缓存”的数据是指不需要保存在缓冲区高速缓存中的数据,如磁盘上的空闲索引节点数据以及空闲块数据不需要保存在内存。 “固定限制”的缓存模式是指被保存在缓冲区高速缓存中的数据量是有限度的,当超过这个限度时,老的数据被刷新到磁盘上。 在“动态”的缓存模式中,只要相应的对象(索引节点或数据块)正在被使用,其数据就被保存在缓冲区高速缓存中,当相应的文件被关闭或块被删除时,shrink_mmap( )函数从高速缓存中删除相关的数据并把数据写回磁盘。

1.ext2_sb_info和ext2_inode_info结构 安装Ext2文件系统时,内核给Ext2磁盘超级块分配一个缓冲区并从磁盘读取超级块的内容。只有当Ext2文件系统被卸载时才释放这个缓冲区,若缓冲区标记为“脏”则写回。 同时,内核用类型为ext2_sb_info的结构把Ext2的超级块装入VFS超级块的u域。内核据此就能找出与这个文件系统相关的内容。当属于Ext2文件的索引节点对象被初始化时,内核用ext2_inode_info类型的结构把索引节点装入VFS索引节点对象的u域。

ext2_sb_info结构: 在磁盘超级块结构中而不在一般的VFS超级块对象中的大部分域 索引节点位图高速缓存,用s_inode_bitmap和s_inode_bitmap_number数组跟踪。 块位图高速缓存,用s_block_bitmap和s_block_bitmap_number数组跟踪。 一个s_sbh指针,指向磁盘超级块缓冲区的缓冲区首部 一个s_es指针,指向磁盘超级块缓冲区 s_desc_per_block,组描述符的个数,被压缩在一个块中 一个s_group_desc指针,指向缓冲区首部的一个数组,缓冲区中包含组描述符 其它数据,如安装状态、安装选项等

ext2_inode_info结构: 磁盘索引节点结构中的大部分域 索引节点所在块组的i_block_group块组索引 为数据块进行预分配时使用的i_alloc_block和i_alloc_count域 一个指定是否同步地更新磁盘索引节点的标志i_osync域

2.位图高速缓存 随着磁盘容量的增加,索引节点位图和数据块位图增长迅速,已不能把所有的位图都保存在内存RAM中了。例如,一个8GB的磁盘,磁盘块的大小为1KB。则每个位图只能描述8192个磁盘块。磁盘的块组数为8GB/8MB=1024个。则内存中要存放2048个位图(索引节点、数据块)将需要2MB的RAM。 内核限制Ext2文件系统位图,使用两个高速缓存区。一个存放大部分最近访问的索引节点位图,另一个存放大部分最近访问的块位图。每个高速缓存都是用有EXT2_MAX_GROUP_LOADED (通常为8)个元素的两个数组来实现的。一个数组包含当前在高速缓存中的块组位图(或索引节点位图)的索引,另一个数组包含引用这些位图的缓冲区首部指针。

(a)位图已经在高速缓存中 3 1 4 8 5 6 2 9 (b)位图被加到高速缓存 (c)位图被加到高速缓存,但是位图被丢弃 7 图6-18 在高速缓存中增加一个位图 引用块组9的三种可能:(a)块组9的位图已在高速缓存中;(b)块组9的位图不在高速缓存中,但高速缓存中有空闲位置;(c)块组9的位图不在高速缓存中,高速缓存中也没有空闲位置。

内核在ext2_sb_info内存数据结构中存放块组位图高速缓存的数组和索引节点位图高速缓存的数组。 一个被安装的Ext2文件系统的内存数据结构及高速缓冲如图6-19所示。在该图中,只显示了磁盘上的三个块组,其描述符存放在三个磁盘块中,在内存有三个缓冲区与之对应。内存数据结构ext2_sb_info的s_group_desc域指向由这三个缓冲区首部组成的一个数组。该图仅仅显示了索引2的块位图和索引4的索引节点位图,内核最多可以在位图高速缓存中保存2×EXT2_MAX_GROUP_LOADED个位图。

图6-19 Ext2的内存数据结构及高速缓冲区 Ext2分区 索引节点位图 块 位图 组 描述符 超级 缓冲区 VFS’s super_block ext2_sb_info b.h. s_inode_bitmap[4] s_group_desc s_block_bitmap[2] s_es s_sbh b_data

§6.5.3 Ext2的方法 Ext2超级块方法的地址存放在ext2_sops指针数组中。除了VFS方法中的clear_inode和umount_begin外,其它VFS超级块操作在Ext2中都有专门的实现。 Ext2文件系统对索引节点的操作取决于索引节点所指的文件类型。对正规文件的索引节点的操作地址存放在ext2_file_inode_operations中,对目录文件的索引节点的操作地址存放在ext2_dir_inode_operations中。 系统调用ioctl(fd, cmd, arg ),通过一个参数cmd来间接地给出具体操作命令,可以认为是对常规系统调用界面的扩充。其中fd为目标文件的打开文件号,cmd为具体操作命令代码,arg可以用作对具体操作命令的参数。

VFS的文件操作(通用函数) Ext2的方法 read generic_file_read( ) write ext2_file_write( ) ioctl ext2_ioctl( ) lseek(改变文件读写位置) ext2_file_lseek( ) mmap generic_file_mmap( ) open ext2_open_file( ) release ext2_release_file( ) fsync ext2_sync_file( ) … 无 表6-11 Ext2的文件操作

§6.5.4 磁盘空间管理 在管理磁盘空间时要考虑两个问题。第一个问题是必须尽力避免文件存储在不相邻盘块上。文件离散存放会增加对文件的连续读操作的平均时间,因为在读操作期间,磁头必须频繁地重新定位。第二个问题是内核应该能从文件的偏移量快速地导出Ext2分区上相应的逻辑块号,尽可能地限制对磁盘上存放的索引表的访问次数,因为对该表访问次数的增加会极大地增加文件的平均访问时间。 磁盘上每个非空的普通文件都由一组数据块组成。这些数据块或者由文件内的相对位置来标识,或者由所在磁盘分区上的盘块号来标识。从文件内的偏移量f导出相应数据块所在的物理盘块号需要两个步骤:首先从文件内的偏移量f导出文件的逻辑块号,即在偏移量f处的字符所在的逻辑块索引。接着利用磁盘上存放的索引表把文件的逻辑块号转化为相应的物理块号。 Linux(或Unix)文件不包含任何控制字符,因此导出文件的第f个字符所在的文件逻辑块号是相当容易的,只要用f除以文件块的大小并取整数即可。例如,文件块的大小为4KB,如果文件的偏移量f小于4096字节,那么这个f处的字符就在文件的第一个数据块中,即在逻辑块号为0的数据块中。如果偏移量f等于或大于4096字节而小于8192字节,那么这个f处的字符就在逻辑块号为1的数据块中。

直接寻址 图6-20 文件索引节点中的索引表的数据结构 据 12 2 5 i_block (b/4)2+ (b/4)+12 b/4+12 1 3 4 6 7 8 9 10 11 13 14 图6-20 文件索引节点中的索引表的数据结构 据

直接寻址1225(b/4)2+ (b/4)+12b/4+12(b/4)3+(b/4)2+ (b/4)+11i_block01234567891011121314图4-20 文件索引节点中的索引表的数据结构 据 Ext2文件系统在磁盘索引节点的i_block域提供了一种方法,用这种方法可以在磁盘上建立每个文件逻辑块号与相应物理块号之间的映射(索引表)。i_block域是一个有EXT2_N_BLOCKS个元素的数组,用来存放磁盘块号。EXT2_N_BLOCKS的默认值为15,如图4-20所示,数组的15个元素有4种类型: 最初的12个元素产生的物理块号与文件最初的12个逻辑块号对应,是直接索引。 索引12中的元素包含一次间接索引块,这个物理块是一个包括物理块号的一级数组。这个数组对应的文件逻辑块号从12到(b/4)+11,这里b是文件系统的块包含字节个数(每个逻辑块号占4个字节)。 索引13中的元素包含二次间接索引块,这个物理块包含物理块号的一个二级数组,其对应的逻辑块号从b/4+12到 (b/4)2+(b/4)+11 索引14中的元素利用了三级间接索引,其对应的逻辑块号从 (b/4)2+(b/4)+12到(b/4)3+(b/4)2+(b/4)+11。 这个索引表与UNIX系统V一样,都是四级索引:直接、一次间接、二次间接和三次间接。只是它的直接索引项包含12个。

§6.6 Windows文件系统 Windows 2000直接支持的文件系统有CDFS、UDF、FAT12、FAT16、FAT32、NTFS。CDFS(CDROM File System)是于1988年为只读光盘而制定的文件系统标准,比较简单,现已被UDF标准代替,但为了向后兼容,Windows 2000仍支持CDFS。UDF(Universal Disk Format)是于1995年为光盘存储媒介(如DVD-ROM等)而制定的,用以代替CDFS。文件分配表(FAT,File Allocation Table)文件系统是遗留文件系统,为了向后兼容,Windows 2000仍支持FAT。FAT是以簇作为磁盘空间分配和回收的基本单位的,Windows 2000的簇大小在512B和8KB之间。通常用一个数字来标识盘簇号的位数。FAT12的簇标识是12位二进制数,即每个磁盘分区最多存储212(4096)个簇。FAT16的簇标识是16位二进制数。FAT32的簇标识是32位二进制数,而Windows 2000限制它的文件卷大小为32GB。FAT文件卷的结构如图21所示。 伴随Windows NT的推出,微软NT设计小组创建出了一种具有较好容错性和安全性的全新的文件系统——NTFS (New Technology File System)。伴随着操作系统的不断发展,NTFS也得到了不断地发展。现在,NTFS已经成为第一个为高端服务器以及Intel工作站家族提供健全的文件服务的文件系统。NTFS是以卷为基础的,而卷是建立在磁盘分区上。当以NTFS格式来格式化磁盘分区时就创建了NTFS文件卷。 NTFS为了满足用户对磁盘数据存储的可靠性需求,采用了基于原子事务(Atomic transaction)概念的文件系统可恢复性。原子事务的基本原则就是对文件的操作要么全做要么全不做。加密文件系统(Encrypted File System, EFS)提供的文件加密技术可将加密的NTFS文件存储到磁盘上。

引导块 文件分配表 根目录 其它目录和文件 图4-21 FAT文件卷的结构

§6.6.1 NTFS磁盘结构 NTFS文件系统与其它的文件系统如FAT一样,也是以簇为单位对磁盘空间进行划分和管理的。这里的簇在有的操作系统里被称为物理磁盘块。通过簇来间接管理磁盘,不需要知道磁盘扇区的大小,这样就使NTFS保持了与磁盘物理扇区大小的独立性,从而能够为不同大小的磁盘选择合适的簇。NTFS系统里的文件总是占用若干个整簇。簇的大小是物理扇区的整数倍,通常为2的整次幂。对于大于2GB的磁盘,默认的簇大小是4KB。 NTFS使用逻辑簇号(Logical Cluster Number, LCN)和虚拟簇号(Virtual Cluster Number, VCN)来对簇进行定位。LCN是对整个文件卷中所有的物理簇从头到尾进行的编号。VCN则是对属于特定文件的逻辑簇从头到尾进行的编号。在实际操作中,文件的VCN需要映射到磁盘分区的LCN。文件可以离散存储。

1.主控文件表 FAT文件系统是通过文件访问表来管理磁盘文件的。而NTFS文件系统是通过主控文件表(Master File Table, MFT)来管理文件卷上的所有文件的。与FAT不同的是,NTFS把所有的数据,甚至所有的元数据(metadata)都存储在文件中。主控文件表本身也是一个文件,其中包含了文件卷中所有文件的信息。MFT是NTFS文件卷的核心,是NTFS中最重要的系统文件。把元数据(包括用于文件定位和恢复的数据结构、引导程序数据以及记录整个卷的分配状态的位图等)存储在文件中,便于NTFS系统通过文件来定位和管理其中的数据,通过文件安全描述符来保护文件。如果磁盘的一个部分发生损坏,NTFS可以重新定位元数据,从而防止磁盘访问失效。 MFT是一个结构类型的数组。文件卷上的每个文件(包括MFT本身)的属性信息在MFT中都占有一个表项。每个表项的大小固定为1KB。在MFT中,开始的16个表项是保留的,用于存储元数据文件的属性信息。这些元数据文件都有一个以“$”开头的文件名称,不过该符号是隐藏的。16个表项之后的表项用于存储普通用户文件和目录的属性信息。 MFT的部分结构如表6-12所示

表6-12 MFT的元数据文件 0 $Mft MFT本身 1 $MftMirr MFT的镜像文件(提高可靠性) 2 $LogFile 日志文件:记录所有影响NTFS卷结构的操作 3 $Volume 卷文件:包含卷名、被格式化的卷的NTFS版本等 4 $AttrDef 属性定义表:存放卷支持的所有文件属性 5 $\ 根目录:保存根目录下所有文件和目录的索引 6 $Bitmap 位图文件:存放卷的分配状态,一位代表一簇, 7 $Boot 引导文件:存放引导程序代码 8 $BadClus 坏簇文件:记录卷中所有的损坏的簇号 9 $Secure 安全文件:存储了整个卷的安全性描述符数据库 10 $UpCase 大写文件:包含一个大小写字符转换表 11 $Extended metadata directory 扩展元数据目录 12 预留 13 预留 14 预留 15 预留 >15 其他用户文件和目录 已分配 或空闲

MFT的前16个元数据文件很重要,为了防止数据的丢失,NTFS系统在该卷文件存储区的正中央对它们进行了备份,见图4-22。文件存储区文件存储区MFT元数据文件存储区MFT前16个元数据文件备份图6-22 MFT空间分配 NTFS把磁盘分区划分成元数据文件存储区和普通文件存储区,其中元数据文件存储区占大约12%的空间,以满足其不断增长的文件数量和保持元数据文件的连续性。余下的88%的空间被用来存储普通文件数据。MFT空间的使用机制:当文件数据耗尽了文件存储区时,Windows操作系统就会简单地减少MFT元数据文件存储区,以增加文件存储区。当文件存储区有剩余空间时,这些空间又会重新被划分给MFT。 NTFS通过MFT访问卷的过程:当NTFS访问卷时,它会查看引导文件($Boot),找到MFT的物理磁盘地址。然后它就从文件的数据属性中获得VCN到LCN的映射信息,并存储在内存中。这个映射信息确定了MFT数据在磁盘上的位置。接着,NTFS再从MFT中读出几个元数据文件的属性信息,并打开这些文件。在NTFS打开了剩余的元数据文件后,用户就可以开始访问该卷了。

文件存储区 MFT元数据文件存储区 MFT前16个元数据文件备份 图6-22 MFT空间分配

2.文件引用号 NTFS文件卷上的每个文件都有一个唯一的64位的文件引用号(File Reference Number)。文件引用号由文件号和文件顺序号组成。文件号为48位二进制数,对应于该文件在MFT中的位置号。16位的文件顺序号随着每次该文件属性的重用而增加,以便于NTFS系统进行内部一致性检查。

3.文件的属性 NTFS不同于其它文件系统。它不仅把通常的文件属性(如文件名、文件拥有者、文件时间标记等)作为属性来处理,也把文件数据作为属性来处理。文件数据就是未命名属性的值。常用的文件属性如下: 标准信息:包括文件的基本属性信息,如访问权限、文件大小、文件的创建时间、最近一次修改的时间、有多少目录指向本文件(即硬链接数)。 文件名:用Unicode字符表示的文件的名字。Unicode是一种16位的字符编码方案,世界上每种主要语言中的每个字符都能够被唯一地表示,这有助于国际化。 安全描述符:主要用于保护文件,防止未授权用户访问。 文件数据:文件的内容,即未命名属性值。目录没有默认的数据属性,但有可选择的命名数据属性。 索引根:对大目录文件所管理的文件和子目录进行索引。 索引分配:是对大目录文件存储在索引缓冲区中VCN到LCN的映射。 位图:跟踪索引缓冲区,以便确定哪些VCN正在使用,哪些VCN是空闲的。 属性列表:当一个文件需要使用多个主控文件表项时,就用属性列表表示。其中包括文件属性的名称和类型以及属性所在MFT的文件引用号。 文件的每个属性都是由单个的字符流(stream)组成。确切地说,NTFS并不对文件进行操作,而是对属性流进行操作。NTFS所提供的对属性字符流的操作包括:创建、删除、读/写(字节范围)。读写操作一般是针对文件的未命名属性而言的,对于已命名的属性则可以通过已命名的字符流句法来进行操作。

当一个文件很小时,其所有属性和属性值可以存放在主控文件表项中。当属性值能直接存放在主控文件表项中时,该属性就称为常驻属性。如,标准信息和文件名属性就总是常驻属性。NTFS对常驻MFT的属性的访问时间较短,NTFS只需访问磁盘一次,就可立即获得数据。 每个属性都有一个标准头,在标准头中包含该属性的信息和NTFS用来管理属性的信息。属性的标准头总是常驻MFT,并记录着属性值是否常驻。对于常驻属性,其标准头中还包含着属性值的偏移量和属性值的长度。 当小文件的所有属性能在MFT中常驻时,其文件数据存放在未命名属性中。如图6-23所示。文件索引文件1文件2文件3文件名标准信息图6-24 小目录的主控文件表项 当小目录的所有属性能在MFT中常驻时,目录中的所有文件和子目录的索引放在索引根属性中。如图6-24所示。

标准信息 文件名 文件数据 图6-23 小文件的主控文件表项 图6-24 小目录的主控文件表项 文件索引 文件1 文件2 文件3 文件名 图6-23 小文件的主控文件表项 文件索引 文件1 文件2 文件3 文件名 标准信息 图6-24 小目录的主控文件表项

当文件或目录较大时,其所有属性就不能都存放在只有1KB的MFT表项中,这样一来,文件或目录的属性就分为常驻的和非常驻的。NTFS将从MFT之外为非常驻属性分配存储空间,这些MFT之外的存储空间被称为一个运行(run)或一个盘区(extent),用来存储属性值。值存储在运行中而不是在MFT中的属性被称为非常驻属性。以后,属性值增加时,NTFS还会再分配运行用来存储增加的这部分属性值。一个运行可以包含几个盘簇。

标准信息文件名数据图6-25 存储在两个运行中的非常驻属性数据数据其它属性 图6-25显示了一个存储在两个运行中的非常驻属性,它的属性头包含了在磁盘上定位该属性值的有关信息。 对于非常驻属性,NTFS通过VCN-LCN之间的映射关系来记录非常驻属性值的存储情况。至于VCN-LCN映射关系则存储在MFT表项中与非常驻属性相关的属性头中。如图6-26所示。当该文件含有超过2个运行时,则第三个运行从VCN 8开始。 如果一个文件有太多的属性,致使一个主控文件表项不够用,那么就可以用第二个主控文件表项。这样以来,就需要一个“属性列表”(attribute list)的属性来管理这些主控文件表项。属性列表包括文件属性的名称和类型代码以及属性所在MFT的文件引用号。例如,当太大或太零散的文件的VCN-LCN映射关系太大而需要多个主控文件表项时,就需要一个属性列表的属性。VCNLCN6714521453132513261327文件9 文件11 …标准信息文件名 “\”根索引文件4文件8….索引分配图4-28 根目录的文件索引位图VCN到LCN映射012345文件13文件5 文件6 文件7120112021203文件1文件2文件3…标准信息文件名文件索引文件3文件7….索引分配图6-27 大目录的主控文件表项位图文件1 文件2文件4 文件5 文件6索引缓冲区 当目录很大时,其文件和子目录的索引只能有一部分存放在MFT表项中的索引根属性里,而另一部分则需存放在叫做“索引缓冲区”的非常驻运行中。如图6-27所示。

标准信息 文件名 数据 图6-25 存储在两个运行中的非常驻属性 其它属性

401 400 402 403 321 320 322 323 5 4 6 7 1 2 3 标准信息 文件名 开始的 VCN 开始的LCN 图6-26 非常驻数据属性的VCN-LCN映射 簇数 LCN

VCN LCN 6 7 1452 1453 1325 1326 1327 文件9 文件11 … 标准信息 文件名 “\” 根索引 文件4 文件8 …. 索引分配 图6-28 根目录的文件索引 位图 VCN到LCN映射 1 2 3 4 5 文件13 文件5 文件6 文件7 1201 1202 1203 文件1 文件2 文件3 … 文件索引 文件7 图6-27 大目录的主控文件表项 文件1 文件2 文件4 文件5 文件6 索引缓冲区

NTFS系统中的文件目录仅仅是文件名的一个索引。对于一个大目录,文件名实际存储在组织文件名的固定4KB大小的索引缓冲区中。图6-28中显示了每个文件项占有一个VCN,而实际上多个文件项被包装在同一个VCN(簇)中。每个4KB大小的索引缓冲区能容纳20至30个文件项。图6-27显示了一个文件卷的根目录的主控文件表项。 为了便于快速访问文件,NTFS使用了一种特殊方式来组织目录中的文件名,即将目录中的文件名和子目录名通过B+树数据结构进行排序。B+树是一种平衡树,而平衡树是一种理想的分类查找树。把目录中的文件名组织成B+树,可以使NTFS在查找一个文件时所需的访问磁盘的次数减到最少。B+树的根一级信息存放在索引根属性中。 图6-27在索引根和索引缓冲区中,只显示了文件名。实际上,索引中的每个文件项不仅包含了文件的名字,还包含了文件的引用号、文件的时间、文件的大小等信息。NTFS从文件的主控文件表项中复制文件时间标记和文件大小信息到文件目录的索引文件项中。这种技术虽然比较麻烦,但是,它能提高目录浏览速度,能在文件系统不打开目录中任何文件的情况下显示每个文件的时间标记和大小。 索引分配属性包含了索引缓冲区的VCN到LCN映射。位图属性跟踪在索引缓冲区中哪些VCN是在使用,哪些是空闲的。

§6.6.2 NTFS文件系统驱动程序 Win32 I/O API通过I/O管理器将I/O请求送交文件系统驱动程序FSD去执行。执行时,I/O管理器还要与内存管理器、高速缓存管理器、卷管理器、磁盘驱动程序等一起协作,完成I/O任务。如图6-29所示。 用户通过文件系统驱动程序创建和读/写文件。其简要步骤如下:首先系统验证文件的使用权限;然后I/O管理器将文件句柄转换为文件对象指针;最后NTFS通过文件对象指针对磁盘上的文件进行操作。 NTFS通过文件对象指针获得磁盘上文件的过程:NTFS通过文件对象指针获得文件属性信息,每个属性的SCB(System Control Block,SCB)包含了如何获得该属性的信息。同一个文件的所有SCB都指向一个共同的数据结构文件控制块FCB。FCB包含了一个指向主控文件表中该文件所占表项的指针。NTFS通过该指针获得文件其它信息。如图6-30所示。

I/O管理器 NTFS FSD 文件卷管理器 磁盘驱动程序 图6-29 NTFS及其相关组件图 磁盘 进程 文件对象 文件属性 文件控制块(FCB) 控制表 图6-30 NTFS数据结构 MFT