Chapter 2 What Is a File System?

2020-09-07  本文已影响0人  lnsyyj

2.1 The Fundamentals(基础知识)

计算机的主要目的是create,manipulate(操纵),store和retrieve数据。 file system提供了这些机制。 高级别file system是一种在诸如磁盘之类的永久存储介质上组织,存储,检索和管理信息的方法。 file system管理永久性存储,并构成所有操作系统的组成部分。在确定哪种file system适合特定的操作系统时,我们必须权衡问题的需求和项目的其他约束(没有绝对的正确,只有最适合的)。牢记文件系统必须实现的抽象目标很重要:store(存储),retrieve(检索),locate(定位)和manipulate(操作)信息。

2.2 The Terminology(术语)

Disk:一定大小的永久存储介质。disk还有sector或block size,这是disk可以读写的最小单位。大多数现代disk的block size为512 bytes。

Block:disk或file system可写的最小单位。file system都是对block进行操作。file system的block大小始终等于或大于disk block size的整数倍。

Partition:disk上所有block的子集。disk可以具有多个partitions。

Volume:为某些存储介质(如disk)上block集合指定的名称。也就是说一个volume可以是单个disk上的所有block,也可以是disk上block总数的一部分,或者甚至可以跨多个disk,并且是几个disk上的所有block。术语volume用于表示已使用file system初始化的disk或partitions。

Superblock:file system在其中存储重要的volumewide信息的volume区域。superblock通常包含诸如volume的大小,volume的名称等信息。

Metadata:一个通用术语,指的是与某物有关但不直接属于该物的信息。例如,文件的大小是有关文件的非常重要的信息,但它不是文件中数据的一部分。

Journaling:一种即使在断电或意外重启的情况下也可以确保file system metadata正确性的方法。

I-node:file system存储有关文件的所有必要metadata的地方。i-node还提供到文件内容以及与该文件关联的任何其他数据的连接。术语"i-node"起源于Unix。i-node也称为 file control block(FCB)或file record。

Extent:disk上的起始block number和连续blocks的长度。例如,extent可能从block 1000开始并连续150个blocks。extent始终是连续的。extent也称为 block runs。

Attribute:name(作为文本字符串)和与该name关联的value。该value可以具有定义的类型(字符串,整数等),也可以只是任意数据。

2.3 The Abstractions(抽象)

任何file system都有两个基本概念files和directories。

Files
所有file system必须提供的主要功能是存储命名的数据并以后通过这个名称检索数据。 我们通常将已命名的数据称为file。 file仅提供file system中最基本的功能。
file是程序永久存储数据的地方。file以其最简单的形式存储一条信息。一条信息可以是一些文本(例如,字母,程序源代码等),图形图像,数据库或用户希望永久存储的任何字节集合。 存储的数据大小范围可能仅从几个字节到volume的整个容量。file system应该能够容纳大量file,从数万到数百万。

The Structure of a File
鉴于file的概念,file system对file没有强加任何结构,或者它可能对file的内容强制实施大量的结构。非结构化的"raw" file(通常称为"字节流")实际上没有结构。file system只是记录file的大小,并允许程序按它们想要的任何顺序或方式读取字节。
非结构化file一次可读取 1 字节,一次读取 17 字节,或者程序员需要的任何字节。此外,不同的程序可能会以不同的方式读取同一file; file system不关心它获取的 I/O 请求的对齐方式或大小。将file视为非结构化流是当今file system最常用的方法。
如果file system对file实现结构,则通常以records的形式。使用record的概念,程序员指定record的大小和格式,然后该file的所有 I/O 必须发生在record边界上,并且是record长度的倍数。其他系统允许程序创建VSAM(虚拟顺序访问方法)和ISAM(索引顺序访问方法)文件,它们实际上是file中的数据库。 这些概念通常不会进入通用桌面操作系统。 在讨论file system时,我们将不考虑结构化文件。 如果您对此主题感兴趣,则不妨查看有关大型机操作系统(例如MVS,CICS,CMS和VMS)的文献。

File Metadata
file的名称是metadata,因为它是关于file的一条信息,不在组成file的字节流中。 关于file的metadata还有其他几个部分,例如owner,security access controls,date of last modification,creation time和size。
除了存储file内容之外,file system还需要一个位置来存储此metadata。 通常,file system将file metadata存储在i-node中。


2-1.png

图2-1绘制了i-node,其包含的内容及其数据之间的关系。

The Data of a File
存储在i-node中最重要的信息是与file中数据(即disk上的位置)的连接。 i-node通过跟踪disk上属于该file的block list来引用file的内容。 file在较高级别上显示为连续的字节流,但是包含file数据的block在disk上可能不是连续的。 i-node包含file system用来从file中的逻辑位置(例如,字节偏移量11,239)映射到disk上的物理位置的信息。


2-2.png

图2-2有助于说明(我们假设file system block size为1024字节)。 如果我们想从file的4096位置读取,我们需要找到file的第四个block,因为file的4096位置除以file system block size为4。i-node包含组成file的block list。 稍后我们将看到,i-node可以告诉我们file第四block的磁盘地址。 然后,file system必须要求disk读取该block。最后,在检索到数据之后,file system可以将数据传递回用户。

当请求读取(或写入)不在file system block边界上的数据时,file system必须将文件位置四舍五入到block的开头。然后,当file system将数据复制到block中或从block复制数据时,file system必须添加original position距block开头的offset。如果我们使用file offset 4732而不是4096,则仍需要读取file的第四个block。 但是在获得第四个block之后,我们将使用第四个block中字节offset 636(4732 - 4096)处的数据。

当对I/O的请求跨越多个block(例如,读取8192字节)时,file system必须找到许多block的位置。 如果file system做得很好,则block在disk上将是连续的。 对disk上连续block的请求提高了对磁盘执行I/O的效率。

The Block Map
i-node可以通过多种方式存储对文件数据的引用。最简单的方法是block list,每个file对应一个block。
例如,如果file长4096字节,则将需要四个disk blocks。使用虚拟磁盘块号,i-node可能类似于表2-1。
通常,一个i-node将直接在该i-node中存储4到16个block引用。 由于大多数file的量级通常在8K以下,因此直接在i-node中存储一些block地址可简化查找file数据的过程。


2-3.png

i-node只能存储有限数量的block地址,因此限制了file可以包含的数据量。为了克服在i-node中存储block地址的空间限制,i-node可以使用indirect blocks。 当使用indirect blocks时,i-node将存储indirect blocks的block地址(即指向该block的指针),而不是数据block的地址。 indirect blocks包含指向构成file数据的block的指针。 indirect blocks不包含用户数据,仅包含用户数据的block的指针。 因此,通过一个disk block地址,i-node可以访问更多数量的数据block。
indirect block可以引用的数据block数等于file system block size除以disk block addresses的大小。在32位file system中,disk block addresses为4字节(32位)。在64位file system中,它们是8个字节(64位)。因此,给定file system block size为1024字节,block addresses大小为64位,则indirect block可以引用128个block。
Double-indirect blocks使用与indirect blocks相同的原理。i-node包含double-indirect block的地址,double-indirect block包含指向indirect blocks的指针,而indirect blocks又包含指向文件数据块的指针。double-indirect block是指indirect blocks,就像indirect blocks是指数据块一样。double-indirect block可以引用的indirect blocks数与indirect blocks可以引用的数据块数相同。
也就是说,double-indirect block中的块地址数是file system块大小除以磁盘块地址大小。在上面给出的示例中,一个1024字节的块文件系统具有8字节(64位)的块地址,一个double-indirect block可以包含对128个indirect blocks的引用。当然,所引用的每个indirect blocks都可以引用相同数量的数据块。因此,使用我们提供的数字,double-indirect block允许我们映射的数据量为
128 indirect blocks * 128 data blocks per indirect block = 16,384 data blocks
16 MB with 1K file system blocks.
加载数据块后,block_offset值将使我们索引到与原始文件位置相对应的确切字节偏移。

Extents
管理从字节流中的逻辑位置到disk上data blocks的映射的另一种技术是使用范围列表。扩展区列表类似于前面描述的简单块列表,不同之处在于每个块地址不仅针对单个块,而且针对一系列块。即,将每个块地址指定为起始块和长度(表示为起始块之后的连续块数)。扩展区的大小通常大于简单的块地址,但可能能够映射更大的磁盘空间区域。
例如,如果文件系统使用8字节的块地址,则扩展区可能具有2字节的长度字段,从而允许该扩展区最多映射65,536个连续的文件系统块。 10字节的扩展区大小不是最佳的,因为它不能将任何文件系统块大小均分为2的幂。为了最大化可以容纳在单个块中的扩展区的数量,可以压缩扩展区。存在多种方法,但是一种简单的压缩方法是截断块地址并压缩长度字段。例如,对于64位块地址,可以将块地址缩减为48位,从而为16位长度字段留出足够的空间。这种方法的缺点是,它减少了文件系统可以处理的最大数据量。但是,如果考虑到典型的块大小为1024字节或更大,那么我们发现实际上文件系统将能够寻址多达2更大,则可以寻址58 字节的数据(如果块大小更多)。这是因为必须将块地址乘以块大小才能计算出磁盘上的字节偏移量。根据系统其余部分的需求,这可能是可以接受的。
尽管扩展区列表是引用大量数据的更紧凑的方式,但它们可能仍需要使用间接或双间接块。如果文件系统高度分散,每个扩展区只能映射几个数据块,则必须使用间接和双间接块。使用范围列表的一个缺点是定位特定文件位置可能需要扫描大量范围。因为扩展区的长度是可变的,所以在定位特定位置时,文件系统必须从第一个扩展区开始并扫描所有扩展区,直到找到覆盖感兴趣位置的扩展区。对于使用双间接块的大文件,这可能会令人望而却步。缓解此问题的一种方法是将扩展区的大小固定在文件的双间接范围内。

2.4 Basic File System Operations
files和directories的两个基本抽象构成了file system可以操作的基础。 file system可以对files和directories执行许多操作。 所有file system都必须提供一些basic level的支持。 除了最基本的file system原语之外,还包括其他功能,扩展名和更复杂的操作。
在对file system操作的讨论中,我们着重于file system必须实现的内容,而不一定是相应的user-level操作。 例如,在file system的context中打开files需要引用directory和name,但是在user level,所需要的只是代表文件名的字符串。 file system的user level API与file system实现的内容之间有着密切的关联,但是它们并不相同。

Initialization
file system必须提供的第一个操作是在给定volume上创建空file system的方法。file system使用要初始化的volume的大小以及用户指定的任何选项来确定其内部数据结构的size和placement。这些初始数据结构的placement可能会显着改善或降低性能。
通常,OS提供了一种方法来找出以多个device blocks表示的volume的大小。然后,此信息用于计算各种数据结构的大小,例如free/used block map(通常是bitmap),i-nodes的数量(如果已预先分配)以及journal area的大小(如果存在)。在计算这些数据结构的大小之后,file system可以决定将它们放置在volume中的何处。file system将这些结构的locations以及volume的大小,volume的状态(clean或dirty)以及其他file system全局信息放置到superblock数据结构中。file system通常将superblock写入volume中的已知位置。
file system初始化还必须创建一个空的top-level directory。如果没有top-level directory,那么在安装file system以供正常使用时,将没有容器存放创建的内容。top-level directory通常称为的root directory (或简称为 root file system)。表达式“root directory”来自file system directory层次结构的概念,即inverted tree,top-level directory是该tree的root。除非root directory始终位于volume上的固定位置,否则root directory的i-node号(或地址)也必须存储在superblock中。
初始化file system的任务可以作为单独的用户程序完成,也可以是核心file system代码的一部分。无论如何,初始化file system只是将volume准备为一个空容器,准备接受file和directory的创建。file system一旦初始化,就可以“mounted”。

Mounting
挂载file system是访问raw device,读取superblock和file system metadata,为访问volume做准备。挂载file system需要格外小心,因为挂载的file system的状态未知并且可能已损坏。file system的superblock通常包含file system的状态。如果file system已正确关闭,则superblock将指示该volume是clean的,不需要进行一致性检查。关闭不正确的file system应表明该volume已dirty,必须对其进行检查。
dirty file system的验证阶段非常重要。如果安装了损坏的file system,则损坏的数据可能导致对用户数据的进一步损害,甚至导致file system执行非法操作,甚至使系统崩溃。挂载之前验证file system有效的重要性不能被夸大。验证并可能修复损坏的file system的任务通常是非常复杂的。journaled file system可以replay其log以确保file system是一致的,但是在继续操作之前,它仍应验证其他数据结构。由于完整file system检查的复杂性,因此通常实现一个单独的程序,即file system检查程序。对file system进行完全验证可能会花费大量时间,尤其是遇到比较大的volume时。幸运的是,只有当superblock指示该volume dirty时,才需要进行此类冗长的检查和修复操作。
file system确定给定的volume有效后,就必须使用磁盘上的数据结构来构造内存中的数据结构,以允许其访问该volume。通常,file system将构建superblock的internal version,以及对root directory和free/used block map结构的引用。Journaled file system还必须加载有关log的信息。file system保持的内存状态允许其余的OS访问该volume的内容。
file system如何与其余OS连接的详细信息往往取决于OS。向file system提供对volume的handle或reference,然后启动对volume的访问,从而允许其读入并验证file system数据结构。当file system确定该volume可访问时,它将返回OS并挂接其操作,以便OS可以调用file system以执行引用该volume上file的操作。

Unmounting
与mounting file system相对应,还有一个unmount操作。unmount file system涉及将与volume关联的所有内存中数据刷新到磁盘。一旦将所有内存中数据写入volume,就可以说该volume是“clean”。unmount磁盘的最后一个操作是标记superblock,以指示发生了正常关闭。通过以这种方式标记superblock,file system可确保就其所知,磁盘未损坏,这使下一次Mounting操作可以达到一定程度的完整性。由于未标记为clean的file system可能会损坏,因此重要的是,file system应完全unmount所有volume。标记superblock之后,除非重新mount该volume,否则系统不应访问该volume。

Creating Files
mounting新初始化的volume后,该volume上没有任何内容。
因此,file system必须支持的第一个主要操作是create files的能力。create files需要两个基本信息:用于创建文件的directory和file name。借助这两条信息,file system可以创建一个表示文件的i-node,然后可以在directory中添加file name/i-node pair。附加参数可以指定文件访问权限,文件模式或file system的其他标志。
在为file分配i-node后,file system必须填写相关信息。存储创建时间的file system必须记录该时间,并且文件大小必须初始化为零。如果需要,file system还必须在i-node中记录所有权和安全性信息。
create files不会为文件contents保留存储空间。当数据写入文件时,分配空间以容纳数据。文件的创建仅分配i-node,并将文件输入到包含该i-node的directory中。

Creating Directories
create directory类似于create file,只是稍微复杂一点。与文件一样,file system必须分配一个i-node以记录有关directory的metadata,并在其parent directory中输入directory的名称。
但是,与文件不同,必须初始化directory的contents。初始化directory可能很简单,例如,将directory存储为list时,或者可能很复杂,例如,使用B-tree来存储directory的contents时。directory还必须包含一个指向其parent directory的reference。reference只是返回parent directory的i-node号。存储到parent directory的链接使file system层次结构的导航更加简单。程序可以遍历目录层次结构,大多数POSIX-style的file system都将到parent directory的link存储为该directory中的".."。"."始终存在,并且指directory本身。
create directory是一项基本操作,它允许用户构建层次结构来表示其信息的组织。directory必须维护对其parent directory的reference才能启用层次结构的导航。create directory对于分层file system的概念至关重要。

Opening Files
打开现有文件可能是file system最常用的操作。打开文件可能会有些复杂。打开文件是由两个操作组成。第一个操作是lookup,引用directory和name,然后在该directory中查找name。Lookup name涉及遍历directory数据结构,以查找名称是否存在,如果存在,则返回关联的i-node。lookup操作的效率很重要。许多directory只有几个文件,因此数据结构的选择可能不那么重要,但是大型服务器通常具有包含数千个directory。在那些情况下,目录数据结构的选择可能至关重要。
给定一个i-node号,open操作的后半部分涉及验证用户可以访问该文件。涉及检查权限是否被允许这样做。如果检查成功,则file system将分配一个内存中的结构来维护有关文件访问的状态(例如,文件是否以read-only打开,appending等)。
open操作的结果是一个handle,请求程序可以使用该handle对文件进行I/O操作。file system返回的handle由操作系统的higher-level portions使用。操作系统具有存储此handle的其他结构。user-level使用的handle与open操作返回的内部handle间接相关。操作系统通常在到达file system handle之前,通过多个表映射user-level file descriptor(fd)。

Writing to Files
file system的write操作允许程序将数据存储在文件中。将数据write文件所需的参数是对文件的引用,在文件中写入数据的position,memory buffer以及要写入的数据length。write文件等同于要求file system将data chunk复制到文件中的permanent location。
write操作将占用memory buffer,并将该数据写入指定文件中的指定position。如果已经在文件的末尾,则需要先扩大文件,然后才能进行写操作。增加文件的大小涉及分配足够的disk blocks来保存数据,并将这些blocks添加到文件"owned"的block list中。
扩大文件会导致对free/used block list,文件i-node以及事务中涉及的任何indirect或double-indirect blocks进行更新。file system的superblock也可能会被修改。
一旦有足够的数据空间,file system就必须从文件中的逻辑位置映射到disk block address。使用physical block address,file system可以将数据写入底层设备,从而使其成为永久性文件。
write完成后,内核维护的文件offset将增加写入的字节数。

Reading Files
read操作允许程序访问文件的contents。read的参数与write的参数相同:指向文件的handle,position,memory buffer和length。
read操作比write操作简单,因为read操作根本不会修改磁盘。read操作所需要做的就是将文件中的logical position映射到相应的disk address。有了physical disk address,file system可以从基础设备检索数据,并将其放入user’s buffer。
read操作还将文件position增加read的数据量。

Deleting Files
delete file是file system需要支持的下一个逻辑操作。delete file的最常见方法是传递文件名。如果名称存在,则delete file有两个阶段。第一阶段是从文件所在的directory中删除该文件的名称。删除该名称可防止其他程序在删除文件后打开该文件。删除名称后,该文件将标记为删除。
delete file的第二阶段仅在没有其他程序打开文件handle的时候发生。在没有其他人引用该文件的情况下,可以释放该文件使用的资源。在此阶段,file system可以将文件使用的data blocks返回到free block pool,并将文件的i-node返回到free i-node list。
必须将文件删除分为两个阶段,因为当请求删除时,文件可能正在打开以供读取或写入。如果file system立即执行两个阶段,则文件上的下一个I/O请求将无效(因为data blocks将不再属于该文件)。使delete操作立即删除文件会使文件的I/O的语义复杂化。通过等待直到文件的引用计数变为零再删除与文件关联的资源,系统才能向应用程序保证,一旦用户程序打开文件,它将保持有效的读写状态,直到关闭文件描述符。
两阶段方法的另一个额外好处是,程序可以为I/O打开一个临时文件,立即将其删除,然后继续正常的I/O处理。当程序退出并且其所有资源都关闭时,该文件将被正确删除。这使程序不必担心在出现错误情况时进行清理。

Renaming Files
rename操作是file system必须支持的最复杂的操作。rename操作所需的参数是source directory handle,,source file name,destination directory handle和destination file name。
在进行rename操作之前,必须对参数进行大量验证。如果file system是多线程的,则必须锁定整个file system,以防止其他操作影响rename操作的状态。
如果source directory和destination directory handles相同,则需要进行的第一个验证是source file name和destination file name是否不同。如果source directory和destination directory不同,则source name和destination name相同是可以接受的。
验证的下一步是检查source name是否引用了directory。如果是,则destination directory不能是source directory的subdirectory。要进行此检查,需要从destination directory一直到root directory遍历层次结构,并确保source name不是destination的root directory。此操作最复杂,需要锁定整个file system。
只有满足上述复杂的标准集,才能开始rename操作。rename的第一步是删除destination name(如果它指向file或空directory)。
rename操作本身涉及从source directory中删除source name,然后将destination name插入到destination directory中。此外,如果source name引用directory,则file system必须将对source directory的parent directory的引用更新。如果不这样做,将导致目录层次结构发生变化,从而导致在导航目录层次结构时出现不可预测的结果。

Reading Metadata
read metadata操作是一项内部管理功能,它允许程序访问有关文件的信息。该函数的参数只是对file的引用。返回的信息因系统而异,但本质上是i-node结构中某些字段的副本(上次修改时间,所有者,安全信息等)。在POSIX中此操作称为 stat() 。

Writing Metadata
如果能够读取file的metadata,则很有可能需要对其进行修改。write metadata操作允许程序修改file的i-node中的字段。在用户级别,可能会有许多不同的函数来修改每个字段(chown(), chmod(), utimes()等),但是内部只需要一个函数即可。当然,并非i-node的所有字段都可以修改。

Opening Directories
正如对file内容的访问是使用 open() 一样,directory有类似操作,通常称为 opendir()。 "opening" directory的概念很简单。directory需要提供一种机制来访问directory中存储的file列表,而opendir操作是用于授予对directory访问权限的操作。opendir的参数只是对directory的引用。请求程序必须检查其权限。如果没有什么阻止该操作,则返回一个handle,请求程序可以使用该handle来调用readdir操作。

Reading Directories
readdir操作枚举directory的内容。 没有相应的WriteDir(严格来说,create和makedir都"write" directory)。 readdir操作必须遍历directory,返回存储在directory中的连续name/i-node pairs(以及可能还存储在directory中的其他信息)。 返回entries的顺序取决于基础数据结构。
如果file system具有directory entries的复杂数据结构,则在调用readdir时,file system还会保留一些关联状态(分配在opendir中)。每次对readdir的调用都会更新状态信息,以便在下一次对readdir的调用时,可以读取并返回directory中的后续元素。没有readdir,程序将无法导航file system层次结构。

Basic File System Operation Summary
本节讨论的file system操作描述了任何file system功能的基线。任何file system必须提供的第一个操作是initialize volume的方法。Mounting file system,以便的操作系统其余部分可以访问它,这是接下来需要的最基本的操作。Creating files和directories是file system功能的基础。Writing和reading数据使用户可以从永久性存储中存储和检索信息。delete和rename操作提供了管理、操作,文件和目录的机制。read metadata和write metadata功能允许用户读取和修改file system维护的有关文件的信息。最后, opendir 和 readdir 调用使用户可以迭代并枚举directory层次结构中的文件。这组基本操作提供了file system所需的最少功能。

2.5 Extended File System Operations

仅提供纯file和directory的最基本功能的file system几乎不值得讨论。有许多feature可以增强file system的功能。本节讨论基本file system的一些扩展以及现代file system支持的一些更高级的功能。

Symbolic Links
许多file system实现的一项功能是symbolic link。symbolic link是一种在file system中创建仅引用另一个文件的命名实体。也就是说,symbolic link是directory中的名称entity,但是symbolic link包含应打开的另一个文件的名称,而不是关联的i-node引用文件。例如,如果directory包含一个名为 Feeder 的symbolic link,并且该symbolic link引用了一个名为Breeder的文件,则每当程序打开Feeder时,file system就会将其透明地转换为的打开 Breeder。如果将文件 Breeder 重命名为 Breeder.old,则symbolic link Feeder 将保持悬空状态(仍指向 Breeder),因此将不再起作用。尽管有这个问题,symbolic link还是非常方便的。

Hard Links
另一种形式的链接称为hard link。hard link也称为alias。hard link是与文件的更牢固的连接。使用hard link,directory中的名称entity仅包含其他文件的i-node号,而不是其自身的i-node(实际上,链接本身没有i-node )。这种连接非常牢固:即使移动或重命名了原始文件,其i-node地址也保持不变,因此与文件的连接永远也不会被破坏。即使删除了原始文件,file system也会保留引用计数,并且仅在引用计数为零(意味着没有人引用该文件)时才删除该文件。在不能断开与文件的连接的情况下,最好使用hard link。

Dynamic Links
第三种link,即dynamic link,实际上只是具有特殊属性的symbolic link。如前所述,symbolic link包含对另一个文件的引用,并且该引用存储为文本字符串。Dynamic link通过解释文本字符串增加了另一种间接访问级别。file system可以通过几种方式解释链接的文本。一种方法是将字符串视为environment variable,然后用匹配的environment variable的内容替换链接的文本。

Memory Mapping of Files
某些操作系统支持的另一个功能是能够map文件。Memory mapping文件会在程序的地址空间中创建virtual memory区域,并且该内存区域中的每个字节都对应于文件的字节。如果程序映射的文件从地址0x10000开始,则内存地址0x10000等效于文件中offset 0 byte。同样,地址0x10400等效于文件中的offset 0x400(1024)。
Unix-style的 mmap()调用可以选择将文件的内存中副本同步到磁盘,以便将写入内存的数据刷新到磁盘。还有用于跨多个进程共享映射文件的标志(共享信息的强大功能)。
文件的memory mapping需要OS的virtual memory system和file system之间紧密配合。主要要求是virtual memory system必须能够从file offset映射到disk上的相应block。在代表virtual memory(VM)系统执行操作时,file system还可能面临其他限制。例如,在与memory-mapped file相关的操作期间,VM系统可能无法容忍来自file system的页面错误或内存分配请求(因为VM系统已被锁定)。这些类型的约束和要求可能会使实现memory-mapped file变得棘手。

Attributes
最近有几种file systems(OS/2’s HPFS, NT’s NTFS, SGI’s XFS and BFS)支持extended file attributes。 attribute是一个简单的name(很像一个文件名)和value(任意大小的数据块)。通常,希望与文件一起存储有关文件的其他信息,但是修改文件的内容是不可行的。例如,当Web browser下载image时,它可以将image来源的URL作为attribute存储。当几个月后您想获得image的站点时,这将很有用。attribute提供了一种将有关文件的其他信息与文件相关联的方法。理想情况下,file system应允许任意数量的附加attribute,并允许这些attribute具有任意大小。file system选择存储attribute信息的位置取决于file system。例如,HPFS为文件attribute保留一个固定的64K区域。 BFS和NTFS提供了更大的灵活性,可以将attribute存储在磁盘上的任何位置。

Indexing
File attributes允许用户将其他信息与file相关联,但是file system可以通过扩展文件attribute来做更多工作,以帮助用户管理和查找他们的信息。如果file system也为attribute建立index,则可以发出有关attribute内容的查询。例如,如果我们添加了 关键字 向一组文件中attribute,并且对关键字attribute进行了index,那么用户可以发出查询,询问哪些文件包含各种关键字,无论它们在层次结构中的位置如何。
与良好的查询语言配合使用时,index为file system提供了强大的替代接口。使用查询,用户不限于浏览固定的文件层次结构;取而代之的是,他们可以发出查询来查找他们想要查看的文件的工作集,而不管文件的位置如何。

Journaling/Logging
避免corruption的方法是journaling。journaling是从数据库世界中借来的一种技术,它通过批处理更改组并将它们一次提交到transaction log中来避免corruption。批量更改保证了多个更改的原子性。原子性保证使file system可以保证操作完全发生或根本不发生。此外,如果确实发生crash,则系统仅需要replay transaction log即可将系统恢复到已知状态。Replaying log是一项最多需要几秒钟的操作,这比非journal file system必须进行的file system检查要快得多。

Guaranteed Bandwidth/Bandwidth Reservation
保证multimedia applications的高带宽I/O的愿望促使某些file system设计人员提供特殊的hooks,以使应用程序可以保证他们将获得一定数量的I/O带宽(在硬件限制的范围内)。为此,file system需要大量有关其使用的底层硬件功能的知识,并且必须调度I/O请求。

Access Control Lists
Access control lists(ACL)提供了扩展的机制,用于指定谁可以访问文件以及他们如何访问文件。在某些设置中,传统的POSIX方法具有三组权限(对于文件的owner,owner所在的group,以及其他所有人),这是不够的。Access control lists指定任何人对文件的确切访问级别。与POSIX security model中定义的广泛划分相比,这可以对文件的访问进行细粒度的控制。

上一篇下一篇

猜你喜欢

热点阅读