文件系统接口

文件系统接口

    文件系统由两个部分组成:一组文件(文件用于存储相关数据)和目录结构(目录用于组织系统内的文件并提供有关文件的信息)。

文件概念

    计算机能在多种不同介质上存储信息。为了方便地使用计算机习系统,操作系统提供了信息存储的统一逻辑接口。操作系统对存储设备的各种属性加以抽象,从而定义了逻辑存储单元(文件),再将文件映射到物理设备上。这些物理设备通常为非易失性的。

    文件是记录再外存上的相关信息的具有名称的集合。从用户角度而言,文件是逻辑外存的最小分配单元,即数据除非在文件中,否则不能写到外存。通常,文件表示程序(源形式和目标形式)和数据。数据文件可以是数字,字符,字符数字或二进制。文件可以是自由形式,如文本文件,也可以具有严格的格式。通常,文件由位、字节、行或记录组成,其具体意义是由文件创建者和使用者来定义。因此,文件的概念极为广泛。

文件属性

    文件是有名称的,以方便用户通过名称对之加以引用。在文件被命名后,它就独立于进程、用户甚至创建它的系统。

    文件有一定的属性,这根据系统而有所不同,但是通常都包括如下属性:

    名称:文件符号名称是唯一的、按照人们容易读取的方式保存。

    标识符:标识文件系统内文件的唯一标签,通常为数字;对人而言这是不可读的文件名称。

    类型:被支持不同类型的文件系统所使用。

    位置:该信息为指向设备和设备上文件位置的指针。

    大小:文件当前大小(以字节、字或块来统计),该属性也包括文件允许的最大容量值。

    保护:决定谁能读、写、执行等的访问控制信息。

    时间、日期和用户标识:文件创建、上次修改和上次访问相关信息。这些数据用于保护、安全和使用跟踪。

    所有文件的信息都保存在目录结构中,而目录结构也保存在外存上。通常,目录条目包括文件名称及其唯一标识符,而标识符又定位文件其他属性信息。一个文件的这些信息可能需要1KB左右的空间来记录。在具有许多文件的系统中,目录本身带大小可能有数兆字节。因为目录如同文件一样也必须是非易失性的,所以它们必须存放在设备上,并在需要时分若干次调入内存。

文件操作

    文件属于抽象数据类型。为了合适地定义文件,需要考虑有关文件地操作。操作系统提供系统调用对文件进行创建、写、读、定位、删除和截短。

    创建文件:创建文件有两个必要步骤。第一,必须在文件系统中为文件找到空间。第二,在目录中为新文件创建一个条目。

    写文件:为了写文件,执行一个系统调用,其指明文件名称和要写入文件的内容。对于给定的文件名称,系统会搜索目录以查找该文件位置。系统必须为该文件维护一个写位置的指针。每当发生写操作时,必须更新写指针。

    读文件:为了读文件,使用一个系统调用,并指明文件名称和要读入文件块的内存位置。同样,需要搜索目录以找到相关目录项,系统要为该文件维护一个读位置的指针。每当发生读操作时,必须更新读指针。一个进程通常只对一个文件读或写,所以当前操作位置可作为每个进程当前文件位置指针。由于读和写操作都使用同一指针,这即节省了空间也降低系统复杂度。

    在文件内重定位:搜索目录相应条目,设置当前文件位置指针为给定值。在文件内重定位不需要包含真正的I/O。该文件操作也称为文件寻址(seek)。

    删除文件:为了删除文件,在目录中搜索给定名称的文件。找到相关目录条目后,释放所有的文件空间以便其他文件使用,并删除相应目录条目。

    这6个基本操作组成了所需文件操作的最小集合。

    为了避免这种不断的搜索操作,许多操作要求在首次使用文件时,需要使用系统调用open( )。操作系统维护一个包含所有打开文件的信息表(打开文件表,open-file table)。当需要一个文件操作时,可通过该表的一个索引指向文件,而不需要搜索。当文件不再使用时,进程可关闭它,操作系统从打开文件表中删除这一条目。系统调用create和delete操作的是关闭文件而不是打开的文件。

    调用open()也可接受访问模式参数:创建、只读、读写、添加等。该模式可以根据文件许可位进行检查。如果请求模式获得允许,进程可打开文件。系统调用open( )通常返回一个指向打开文件表中的一个条目的指针。通过使用该指针,而不是真实文件名称,进行所有I/O操作,以避免进一步搜索和简化系统调用接口。

    对于多个进程可同时打开同一文件,操作系统采用两级内部表:单个进程的表和整个系统的表。单个进程表跟踪单个进程打开的所有文件。表内所存是该进程所使用的文件的信息。单个进程表的每一条目相应地指向整个系统的打开文件表。整个系统表包含进程无关信息,如文件在磁盘上的位置,访问日期和文件大小。一旦一个进程打开一个文件,系统打开文件表就会在表中为打开文件增加相应的条目。当另一个进程执行调用open(),其结果只不过简单地在其进程打开表中增加一个条目,并指向整个系统表的相应条目。通常,系统打开文件表的每个文件还有一个文件打开计数器open count,以记录多少进程打开了该文件。每个close()会递减count,当打开计数器为0时,表示该文件不再被使用,该文件条目从系统打开文件表中删除。

    总而言之,每个打开文件有如下相关信息:

    文件指针:对于没有将文件偏移量作为系统调用raed()和write()参数的系统,系统必须跟踪上次的读写位置以作为当前文件位置指针。这种指针对打开文件的某个进程来说时唯一的,因此必须与磁盘文件属性分开保存。

    文件打开计数器:当文件关闭时,操作系统必须重用其打开文件表条目,否则表内的空间会不够用。因为多个进程可能打开一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。文件打开计数器跟踪打开和关闭的数量,在最后关闭时计数器为0。这时,系统可删除该条目。

    文件磁盘位置:绝大多数操作要求系统修改文件数据。用于定位磁盘上文件位置的信息保存在内存中以避免每个操作从磁盘中读取该信息。

    访问权限:每个进程用一个访问模式打开文件。这种信息保存在单个进程打开的文件表中,以便操作能允许或拒绝以后的I/O请求。

    有操作系统提供接口以锁住文件(或部分文件)。文件锁允许一个进程锁住文件,以防止其他进程访问它。文件锁可用于由多个进程共享的文件,例如由系统内多个进程访问与修改的系统日志文件。

    共享锁(shared lock)类似于读者锁,可供多个进程并发获取。专用锁(exclusive lock)类似于写着锁,只有一个进程可获取此锁。

文件类型

    实现文件类型的常用技术是在文件名称内包含类型。这样,用户和操作系统仅仅通过文件名称就能确定文件类型是什么。名称可分为两部分:名称和扩展名。

访问方法

顺序访问

    最为常见的访问方式是顺序访问。文件信息按顺序,一个记录接着一个记录加以处理。这种访问模式最为常用。例如,编辑器和编译器通常按这种方式访问文件。

    大量的文件操作是读和写。读操作读取下一文件部分,并自动前移文件指针,以跟踪I/O位置。类似地,写操作会向文件尾部增加内容,相应的文件指针移到新增数据之后(新文件结尾)。文件也可重新设置到开始位置,有的系统允许向前或向后跳过n个记录。顺序访问如图10.3所示。顺序访问基于文件的磁带模型,不仅适用于顺序访问设备,也适合用于随机访问设备。

直接访问

    另一种方式是直接访问(或相对访问文件由固定长度的逻辑记录组成,以允许程序按任意顺序进行快速读和写。直接访问方式是基于文件的磁带模型,这是因为磁带允许对任任意文件块进行随机读和写。对直接访问,文件可作为块或记录的编号序列。对于直接访问文件,读写顺序是没有限制的。

    直接访问文件可立即访问大量信息,所以极为有用。数据库通常使用这种类型的文件。

    用户向操作系统提供的块号通常为相对块号。相对块号是相对于文件开始的索引。因此,文件的第一块的号码是0,下一块是1,而第一块的真正的绝对磁盘地址可能为14703,下一块为3192等。使用相对块号允许操作系统决定该文件放在哪里(称为分配问题),以阻止用户访问不属于其文件的其他的文件系统部分。有的系统的相对块号从0开始,其他的从1开始。

其他访问方式

    其他访问方式可建立在直接访问方式之上这些访问通常涉及创建文件索引。索引包括各块的指针。为了查找文件中的记录,首先搜索索引,再根据指针直接访问文件,以查找所需要的记录。

    对于大文件,索引本身可能太大以至于不能保存再内存中。解决方法之一是索引文件再创建索引文件。初级索引文件包括二级索引文件的指针,而二级索引再包括真正指向数据项的指针。

目录结构

存储结构

    磁盘(或任何足够大的存储设备)可以整体地用于一个文件系统。但是,有时需要在一个磁盘上装多种文件系统,或一部分用于文件系统而另一部分用于其他地方,如交换空间或非格式化地磁盘空间。这些部分称为分区片,或称为小型磁盘。每个磁盘分区可以创建一个文件系统。这些部分可以组合成更大地可称为卷(volume)的结构,也可以在其上创建文件系统。为了简单起见,可以将存储文件系统的一大块存储空间作为卷。卷可以存放多个操作系统,使系统启动和运行多个操作系统。

    包含文件系统的每个卷还必须包含系统上文件的信息。这些信息保存在设备目录卷表中。设备目录(常简称为目录)记录卷上所有文件的信息如名称,位置,大小和类型等。

目录概述

    目录可看做符号表,它能将文件名称转换成目录条目。如果采用这种观点,那么目录可按许多方式来加以组织。对目录,需要能够插入条目、删除条目、搜索给定条目、列出所有目录条目。

    搜索文件:需要能够搜索目录结构以查找特定文件的条目。因为文件具有符号名称,且类似的名称可能表示文件之间的关系,所以要能查找文件名和某个模型相匹配的所有文件。

    创建文件:可以创建新文件并增加到目录中。

    删除文件:当不再需要文件时,可以从目录中删除它。

    遍历目录:需要能遍历目录内的所有文件以及其目录中每个文件条目的内容。

    重命名文件:因为文件名称可向用户表示其内容,当文件内容和用途改变时名称必须改变。重新命名文件也允许改变该文件在目录结构中的位置。

单层结构目录

    最简单的目录结构是单层结构目录。所有文件都包含在同一目录中,其特点是便于理解和支持。

    单层结构目录有严格限制。由于所有文件位于同一目录,它们必须具有唯一名称。如果两个用户都称其数据文件为test,那么就违背了唯一名称规则。随着文件数量增加,单层结构目录的单个用户会很难以记住所有文件的名称。

双层目录结构

    单层目录结构通常会在不同用户之间引起文件名称的混淆。标准解决方法是为每个用户创建独立目录。

    对于双层结构目录的结构,每个用户都有自己的用户文件目录(user file directory, UFD)。每个UFD都有相似的结构,但只列出了单个用户的文件。当一个用户作业开始执行或一个用户注册时,就搜索系统的主文件目录(master file directory, MFD)。通过用户名或账号可索引MFD,每个条目指向用户的UFD。

可以定义一个特殊的用户目录,它包括所有系统文件。当给定名称文件需要装入时,操作系统首先会搜索本地UFD。如果查找到,那么就使用。如果查找不到,那么系统会自动搜索特殊用户目录(它包括系统文件)。当给定一文件时,搜索的一系列目录称为搜索路径(search path)。这种方法可以加以扩展,以至于搜索路径可包括没有任何限制的目录链表。这种方法被UNIX和MS-DOS所使用,系统也可以设计为允许每个用户用户自己的搜索路径。

树状结构目录

    树是最为常见的目录结构。树有根目录,系统内的每个文件都有唯一路径名。

    目录(或子目录)包括一组文件和子目录。一个目录只不过是一个需要按照特定方式访问的文件。所有目录具有相同的内部格式。每个目录条目都用一位来定义其为文件(0)或子目录(1)。创建和删除目录条目需要使用特定的系统调用。

    在通常情况下,每个进程都有一个当前目录。当前目录包括进程当前感兴趣的绝大多数文件。当需要引用一个文件时,就搜索当前目录。如果所需文件不在当前目录中,那么用户必须指定路径名或将当前目录改变为包括所需文件的目录。为了改变目录,用户可使用系统调用以重新定义当前目录,该系统调用需要有一个目录名作为参数。这样,用户需要时就可以改变当前目录。从当前改变直到下次改变,系统调用open搜索当前目录以打开所指定的文件。

    路径名有两种形式:绝对路径名或相对路径名。绝对路径名从根本开始并给出路劲上的目录名直到所指定的文件。相对路劲名从当前目录开始定义路径。

无环图目录

    树状结构禁止共享文件和目录。无环图(acyclic graph)允许目录含有共享子目录和文件。同一文件或子目录可出现在两个不同目录中。无环图时树状结构目录方案的扩展。

    注意,共享文件(或目录)不同于文件复制。如果有两个副本,每个程序员看到的是副本而不是原件;如果一个程序员改变了文件,那么这一改变不会出现在另一个程序员的副本中。对于共享文件,只存在一个真正文件,所有任何改变都会为其他用户所见。共享对于子目录尤其重要,由一个用户创建的文件可自动出现在所有共享目录。

    实现共享文件和目录由许多方法。一个为许多UNIX系统所采用的常用方法是创建一个称为链接的新条目。链接实际是另一个文件或目录的指针。链接可用绝对路径名或相对路径名来实现。当需要访问一个文件时,就可搜索目录。如果目录条目标记为链接,那么就可获得真正文件(或目录)的名称。链接可以通过使用路径名定位真正的文件来获得解析。链接可通过目录条目格式而容易地加以标识,它实际上是具有名称地间接指针。在遍历目录时,操作系统忽略这些链接以维护系统的无环结构。

    硬链接,用户并不需要保留整个文件列表,只需要保留文件引用的数量。增加一个新链接或目录条目就增加引用计数,删除链接或条目就降低计数。当计数为0时,没有它的其他引用就能删除该文件。

通用图目录

文件系统安装

    如同文件使用前必须要打开,文件系统在被系统上的进程使用之前必须要安装(mount)。具体来说,目录结构可以建立在多个卷上,这些卷必须安装以使它们在文件系统命令空间中可用。

    安装步骤相对简单。操作系统需要知道设备名称和文件系统的安装位置(称为安装点)。通常,安装点(mount point)为空目录。

 

 

文件共享

多用户

    为了实现共享和保护,多用户系统必须比单用户系统维护更多的文件和目录属性。现在绝大多数系统都采用了文件(或目录)拥有者(或用户)和组的概念。拥有者是目录最高控制权的用户,可以改变属性和授权访问。组属性定义对文件用户相同权限的用户子集。例如,在UNIX系统中,一个文件的拥有者可对文件执行所有操作,文件组的成员只能执行这些操作的子集,而所有其他用户可能只能执行另一操作子集。

远程文件系统

    随着网络和文件技术的发展,远程文件共享方式也不断改变。采用的第一种实现方式为,用户通过程序(如ftp)可实现在机器之间进行文件的人工传输。采用第二种实现方式分布式文件系统(DFS),远程目录可从本机上直接访问。采用第三种方式万维网。

保护

    当信息保存在计算机中,需要保护其安全,使之不受物理损坏(可靠性)和非法访问(保护)。可靠性通常是由文件备份来提供的,保护有多种方法。

访问类型

    通过限制可进行的文件访问类型,保护机制可提供控制访问。是否允许访问的决定因素有若干个,其中之一就是所请求的访问类型。一下几种类型的操作都可以加以控制:

读:从文件中读。

写:对文件进行写或重写。

执行:将文件装入内存并执行它。

添加:将新信息添加到文件结尾部分。

删除:删除文件,使其空间用于其他目的。

列表清单:列出文件名称及其属性。

访问控制

    解决保护问题最为常用的方法是根据用户身份进行控制。不同用户可能对同一文件或目录需要有不同类型的访问。实现基于身份访问的最为普通的方法是为每个文件和目录增加一个访问控制列表(access-contral list,ACL),以给每个用户名及其所允许的访问类型。

    可以通过精简的访问列表来解决用户名列表过长的问题。

    为精简访问列表,许多系统为每个文件采用了三种用户类型:

    拥有者:创建文件的用户为拥有者。

    组:一组需要共享文件且需要类似访问的用户形成了组或工作组。

    其他:系统内的所有其他用户。

小结

    文件是由操作系统所定义和实现的抽象数据类型。它由一系列逻辑记录组成。逻辑记录可以是字节、行(固定或可变长度)或更为复杂的数据项。操作系统可自己支持各种记录类型或让应用程序提供支持。

    操作系统的主要任务是将逻辑文件概念映射到物理存储设备,如磁盘或磁带。由于设备的物理记录大小可能与逻辑记录大小不一样,所以可能由必要将多个逻辑记录合并以存入物理记录。同样,这个任务可以由操作系统自己完成或由应用程序来提供。

    文件系统的每个设备都有内容的卷表或设备目录,以列出设备上文件的位置。另外,可创建目录以组织文件。多用户系统的单层结构目录会由命名问题,因为每个文件必具有唯一文件名。双层结构目录通过为每个用户创建独立目录来解决这个问题。每个用户由其自己的目录,包括自己的文件。目录可通过名称列出其文件,目录包括许多文件信息,如文件在磁盘上的位置,长度,拥护者,创建时间,上次使用时间等。

    双层结构目录的自然扩展是树状结构。树状结构目录允许目录创建子目录以组织其文件。无环结构目录允许共享子目录和文件,但是使得搜索和删除变得复杂了。通过图结构目录在文件和目录共享方面提供了更好的灵活性,但是有时需要采用垃圾收集以恢复未使用的空间。

    磁盘分为一个或多个卷,每个卷可包括一个文件系统或无文件系统的生区(raw partition)。文件系统可安装到系统命名结构中,以使其可用。命名方案因操作系统而异。一旦安装,分区内的文件就可使用。文件系统可以卸载以不允许访问或用于维护。

    文件共享依赖于系统所提供的语义。文件可有多个读者,多个写着或有限共享。分布式文件系统允许客户机安装来自服务器的分区或目录,只要能从网络访问就可。远程文件系统在可靠性、性能和安全方面有些挑战。分布式信息系统维护用户、主机、访问信息以便客户机和服务器能共享状态信息以管理使用和访问。

    由于文件是绝大多数计算机的主要信息存储机制,所以需要文件保护。文件访问可以针对每种访问类型如读、写、执行、添加、删除、列表等分别加以控制。文件保护可以由口令、访问控制列表和其他特定技术来实现。

原文地址:https://www.cnblogs.com/kexinxin/p/9939086.html