《现代操作系统》– 文件系统

1.文件的定义:文件是具有标识符(文件名)的一组相关信息的集合。标识符是用来标识文件的。不同的系统对标识符的规定有所不同。文件的确切定义有两种说法:

(1)文件是具有标识符的相关字符流的集合。(2)文件是具有标识符的相关记录的集合。

 

2.UNIX系统中的文件名:文件名是一个不大于14个字符的字符串。并且区分英文字母的大小写。在UNIX系统中文件名就是一个字符串,没有文件名和文件扩展名之分,文件的类型由用户命名时确定。

例如,li.c,UNIX系统认为这个文件名的长度是4个字符。而在DOS、WINDOWS系统中则解释这个文件名,li是文件名,c是文件扩展名,表示该文件是一个C语言的源程序文件,而.是文件名和文件扩展名的分隔符。

 

3.文件系统的定义:文件系统是操作系统中负责存取和管理文件信息的机构。它由管理文件所需的数据结构(如文件控制块,存储分配表等)和相应的管理软件以及访问文件的一组操作组成。

从系统的角度看:文件系统是一个负责文件存储空间管理的机构。

从用户的角度看:文件系统是用户在计算机上存储信息、和使用信息的接口。

 

4.文件结构:

a 字节序列:操作系统把文件看成字节序列提供了很大的灵活性。用户程序可以在文件中加入任何内容,并且以任何方便的形式来命名。这时,处理文件结构的任务由用户完成,操作系统无法提供任何帮助,但也不会设置障碍。

b 记录序列:在这个模型中,文件是一个固定长度记录的序列,每条记录都有内部结构。

c  树:这种方式中,文件由一棵记录树构成,并非每条记录都具有同样的长度。在记录的固定位置包含一个关键字域。记录树按关键字域进行排序,这便于对特定关键字进行快速查找。

 

5.文件存取:早期操作系统只有一种文件存取方式:顺序存取。进程在这些系统中可以从头顺序读取文件的全部字节或记录,但不能跳过某一些内容,也不能不按顺序读取。顺序读取文件是可以返回到起点的,需要时可多次读取该文件。在存储介质是磁带而不是磁盘时,顺序存取文件是很方便的。当用磁盘来存储文件时,我们可以不按顺序地读取文件中的字节或记录,或者按照关键字而不是位置来存取记录。这种能够以任何次序读取其中字节或记录的文件称作随机读取文件。许多应用程序需要这种类型的文件。如数据库系统。

 

6.文件属性:反映文件的类型、存取控制、等。常见属性有:文件类型、文件长度、文件的位置、文件的存取控制和文件的建立时间等。其它属性见下表

7.目录

文件控制块(也称目录项):每个文件有唯一的一个文件控制块也称目录项。包括文件名、文件类型、位置、大小、存取保护信息、使用计数、时间信息。对文件的操作须先找到它才能进行其它操作。
文件目录:控制块的有序集合称文件目录(完全由目录项构成的文件称目录文件)

文件目录结构:

一级目录系统:目录系统最简单形式是在一个目录中包含所有的文件。这有时称为根目录,但是由于只有一个目录,所以其名称并不重要。

层次目录系统:它将目录和文件放在一起,将目录也做成文件,形成树形多层次的目录结构:所有目录项统一增加一项指明是目录还是文件,并规定一没有上层的目录项为根目录,构成一树状逻辑结构。

UNIX操作系统中的文件卷是文件、层次结构目录和i节点(i-node)的三者组合体,它由“全路径”可确定唯一文件。硬盘可以在逻辑上划分成多个文件系统的文件卷,利用命令/etc/mount,/etc/umount可方便地动态装卸。

cp ../lib/dictionary .                拷贝上一级下lib/dicationary到当前目录。

 

8.文件系统的实现

①顺序文件:将一个文件中逻辑上连续的信息存放到若干连续的物理块中,这类文件叫连续文件,又称顺序文件。

优点:简单,支持顺序读取和随机存取,顺序存取速度快,所需的磁盘寻道次数和寻道时间最少。

image

②串联文件:一个文件的信息存放在若干不连续的物理块中,各块之间通过指针连接,前一个物理块指向下一个物理块。

优点:提高了磁盘空间利用率,不存在外部碎片问题,有利于文件插入和删除,有利于文件动态扩充。

image

③使用文件分配表:使用文件分配表,可以根据其实块,然后在文件分配表中查找该块的下一个磁盘块,一直到结束标志。

④i节点其实就是可以这么认为,把i节点看作是一个指向磁盘上该文件存储区的地址。只不过这个地址我们一般是没办法直接使用的,而是通过文件名来间接使用的。事实上,i节点不仅包含了文件数据存储区的地址,还包含了很多信息,比如数据大小,等等文件信息。但是i节点是不保存文件名的。文件名是保存在一个目录项中。每一个目录项中都包含了文件名和i节点。

 

9.文件目录

MS-DOS中的目录:

图示是一个MS—DOS的目录项。它总共32个字节长,其中包含了文件名、文件属性和第一个磁盘块的块号。根据第一个磁盘块的块号,根据链表得到文件所在块。

在MS-DOS中,目录可以包含其他日录,从而形成层次文件系统。通常在MS-DOS中,每个应用程序在根目录下创建一个目录,把它的所有文件都放在这个目录下,因此不同 的应用程序不会发生冲突。

UNlX中的目录:

UNIX中使用的目录结构非常简单,如图示,每个目录项只包含一个文件名及 其i-节点号。有关文件类型、长度、时间、拥有者和磁盘块等所有信息都放在i-节点中。有些UNIX系统有不同的布局,但无论如何,目录项中最终要包含一个ASCII字符串和一 个i-节点号。

在打开文件时,文件系统必须根据给出的文件名找到它所在的磁盘块。让我们分析如何来查找路径名/user/ast/mbox。尽管是以UNIx作为例子,但是这个查找算法对所有的层次目录系统基本上都一样。首先文件系统找到根目录。在UNIx中,根目录的i-节点位于磁盘上的固定位置。

然后在根目录中查找路径的第一部分,usr,从而也就获得了文件/usr的i-节点号。因为每个i-节点都位于磁盘的固定位置,所以根据i-节点号找到i-节点是很直接的。利用这个i-节点,文件系统找到目录/usr,并接着查找下一部分ast。当找到ast目录项后,得到目录/usr/ast的i-节点。从而找到目录/usr/ast并在该目录中查找文件mbox。接着,文件mbox的i-节点被读入内存,并保存在内存中,直至关闭该文件。

相对路径名的查找也类似。只是,相对路径名从工作目录,而不是根目录开始查找。每个目录在创建时都含有“.”和“..”项。“.”项给出当前 目录的i-节点号,“..”项给出了其父目录的i-节点号。因而,查找../dick/prog.c的过程仅仅是在工作目录中查找“..”项,找到父目录的i-节点号,并在父目录中查找到dick目录。我们不需要特别的机制来处理这些文件名,就目录系统而言,和其他的文件名一样,他们都仅仅是一些ASCII字符。

 

10.文件系统性能

减少磁盘访问次数最常用技术是块高速缓存(block cache或者buffer cache)。在这里,高速缓存是一些块,他们逻辑上属于磁盘,但基于性能的考虑而保存在内存中。

在管理高速缓存时,用到了不同的算法。一个常用算法是:检查所有的读请求,看看所需的块是否在高速缓存中。如果在,无须访问磁盘便可进行读操作。如果块不在高速缓存中,首先要把它读到高速缓存,再拷贝到所需的地方。之后,对该块的读写请求都通过高速缓存完成。

块提前读

在需要用到块之前,试图提前将其写入高速缓存,从而提高命中率。

减少磁盘臂运动

把有可能顺序存取的块放在一起,当然最好是在同一个柱面,从而减少磁盘臂的移动次数。

 

转载请标注来源www.blogfshare.com            By:AloneMonkey

本文链接:http://www.alonemonkey.com/operating-system-three.html