现代操作系统:文件系统
2016-08-15 17:22
393 查看
长期存储信息有三个基本要求:
能够存储大量信息;
使用信息的进程终止时,信息仍旧存在;
必须能使多个进程并发存取有关信息。
正如从处理器抽象出进程,从物理存储器中抽象出虚拟地址,从实际存储在磁盘中的信息中抽象出文件,这是操作系统中最重要的三个概念。
文件是进程创建的信息逻辑单元,是受操作系统管理的,操作系统中处理文件的部分称为文件系统。
在某些系统中(如UNIX),文件拓展名只是一种约定,操作系统并不强迫采用它。
但Windows对拓展名赋予含义。用户(或进程)可以在操作系统中注册拓展名,并且规定哪个程序“拥有”该拓展名。
无结构的字节序列,操作系统不知道也不关心文件内容是什么,操作系统所见到的就是字节。在UNIX和Windows中都采用这种方法。
记录序列,文件是具有固定长度记录的序列,每个记录都有其内部结构。
树,其基本操作是获得特定键的记录。
普通文件一般分为ASCII文件和二进制文件。
ASCII文件由多行正文组成,各行的长度不一定相同。ASCII文件的最大优势是可以显示和打印,还可以用任何文本编辑器进行编辑。
二进制文件有一定的内部结构,使用该文件的程序才了解这种结构。
保护:谁可以存取文件,以什么方式存取文件
口令:存取文件需要的口令
创建者:创建文件者的ID
所有者:当前所有者
只读标志:0表示读/写,1表示只读
……
create:创建空文件
delete:删除文件并释放磁盘空间
open:把文件属性和磁盘地址表装入内存,便于后续调用的快速存取
close:关闭文件以释放内部表空间
read
write
append:追加,在文件末尾添加数据
seek:对于随机存取文件,要指定从何处开始取数据,通常的方法是用seek系统调用把当前位置指针指向文件中特定位置,然后从该位置开始读写数据。
get attributes:查找文件的某些属性
set attributes:修改某些属性
rename
这一设计的优点是简单,并且能够快速定位文件。
另一种方法是使用相对路径名,它常和当前目录/工作目录一起使用。用户可以指定一个目录作为当前工作目录,这时所有的不从根目录开始的路径名都是相对于工作目录的。
支持层次目录结构的操作系统在每个目录中有两个特殊的目录项“.”和“..”,前者指当前目录,后者指其父目录。
create:创建空目录,除了目录项“.”和“..”外,目录项为空
delete:删除目录。只有空目录可以删除。
opendir:目论内容可被读取,在读目录前,必须先打开目录
readdir:返回当前目录的下一个目录项
rename
link:连接技术允许在多个目录中出现同一个文件
unlink:删除目录项,如果被解除连接的文件只出现在一个目录中,则将它从文件系统中删除
磁盘的0号扇区称为主引导记录(Master Boot Record),用来引导计算机。在MBR的结尾是分区表,给出了每个分区的起始和结束地址。
表中的一个分区被标记为活动分区,在计算机被引导时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区,读入它的一个块,称为引导块,并执行之。引导块中的程序将装载该分区中的操作系统。
除了引导块之外,文件系统通常还包含
超级块,包含文件系统的所有关键参数,如确定文件系统类型用的魔数、文件系统中数据块的数量等
空闲块
i节点,是一个数据结构数组,记录了每个文件的信息
根目录
其他所有的文件和目录
在块大小为1KB的磁盘上,50KB的文件要分配50个连续的块。
每个文件都是从一个新的块开始的,所以最后一块的结尾会浪费一些空间。
连续分配实现简单,方便读取,但会产生许多空闲块(碎片),不利于后续空间管理。
链表分配可以充分利用每个磁盘块,但随机存取却很慢,因为每次都必须从头开始。
另外,由于指针占据了一些字节,会降低系统的运行效率。
这种方法的主要缺点是必须把整个表都存放在内存中,内存占用太大。
与此密切相关的问题是在何处存放文件属性。
一种显而易见的方法是把文件属性直接存放在目录项中。
另一种方法是把文件属性存放在i节点中,并把i节点放到目录项中。
某用户和某共享文件的联系称为一个连接,在这种情况下,文件系统本身是一个有向无环图,而不是一棵树了。
为了让日志文件系统工作,被写入日志的操作必须是幂等的,即只要有必要,就可以重复执行多次而不会带来破坏。
Windows的NTFS有一个拓展的日志文件系统,并且它的结构几乎不会因系统崩溃而受到破坏。
VFS对用户进程有一个更高层的接口,称作POSIX接口。
VFS对实际文件系统有一个更底层的接口,称作VFS接口。
VFS就在用户进程和实际文件系统中起一个桥梁的作用。
大多数VFS应用本质上都是面向对象的。
管理高速缓存有不同的算法,常用的算法是:检查全部的读请求,查看在高速缓存中是否有所需要的块。如果存在,可执行读操作而无需访问磁盘。如果该块不在高速缓存中,首先要把它读到高速缓存中,再复制到所需的地方。之后,对同一个块的请求都通过高速缓存完成。
CD-ROM没有磁盘那样的同心柱面,而是沿一个螺旋线来顺序存储信息。螺旋线上的位序列被划分成大小为2352字节的逻辑块(扇区),其有效部分是2048字节。
每个CD-ROM由16块作为开始,这16块可以放入引导程序,使计算机能够从CD-ROM引导。接下来的一块存放基本卷描述符,它包含了CD-ROM的一些基本信息,如系统标识符(32字节)、卷标识符(32字节)、发布标识符(128字节)和数据预备标识符(128字节)等。
MS-DOS按32位存储文件,通过内存里的文件分配表(FAT)来跟踪文件块。
能够存储大量信息;
使用信息的进程终止时,信息仍旧存在;
必须能使多个进程并发存取有关信息。
正如从处理器抽象出进程,从物理存储器中抽象出虚拟地址,从实际存储在磁盘中的信息中抽象出文件,这是操作系统中最重要的三个概念。
文件是进程创建的信息逻辑单元,是受操作系统管理的,操作系统中处理文件的部分称为文件系统。
文件
文件是一种抽象机制,它提供了一种在磁盘上保留信息而且方便以后读取的方法。文件的命名
MS-DOS采用FAT-16文件系统,而最近几代Windows采用NTFS文件系统。在某些系统中(如UNIX),文件拓展名只是一种约定,操作系统并不强迫采用它。
但Windows对拓展名赋予含义。用户(或进程)可以在操作系统中注册拓展名,并且规定哪个程序“拥有”该拓展名。
文件结构
文件可以有多种构造方式:无结构的字节序列,操作系统不知道也不关心文件内容是什么,操作系统所见到的就是字节。在UNIX和Windows中都采用这种方法。
记录序列,文件是具有固定长度记录的序列,每个记录都有其内部结构。
树,其基本操作是获得特定键的记录。
文件类型
很多操作系统支持多种文件类型,如普通文件和目录。首先讨论普通文件。普通文件一般分为ASCII文件和二进制文件。
ASCII文件由多行正文组成,各行的长度不一定相同。ASCII文件的最大优势是可以显示和打印,还可以用任何文本编辑器进行编辑。
二进制文件有一定的内部结构,使用该文件的程序才了解这种结构。
文件存取
用磁盘存储文件时,能够以任何次序读取其中字节或记录的文件称作随机存取文件。文件属性
文件都有文件名和数据。另外,所有的操作系统还会保存其他与文件相关的信息,如文件创建的日期和时间、文件大小等,这些附加信息称为文件属性,又称为元数据。例如:保护:谁可以存取文件,以什么方式存取文件
口令:存取文件需要的口令
创建者:创建文件者的ID
所有者:当前所有者
只读标志:0表示读/写,1表示只读
……
文件操作
使用文件的目的是存储信息并方便以后的检索。下面是与文件有关的最常用的一些系统调用:create:创建空文件
delete:删除文件并释放磁盘空间
open:把文件属性和磁盘地址表装入内存,便于后续调用的快速存取
close:关闭文件以释放内部表空间
read
write
append:追加,在文件末尾添加数据
seek:对于随机存取文件,要指定从何处开始取数据,通常的方法是用seek系统调用把当前位置指针指向文件中特定位置,然后从该位置开始读写数据。
get attributes:查找文件的某些属性
set attributes:修改某些属性
rename
目录
文件系统通常提供目录或文件夹用于记录文件,在很多系统中目录本身也是文件。一级目录系统
目录系统的最简单形式是在一个目录中包含所有的文件。这有时被称作根目录。这一设计的优点是简单,并且能够快速定位文件。
层次目录系统
层次结构即目录树,可以用许多目录把文件以自然的方式分组。路径名
有两种常用的方法来指明文件名,第一种是为每个文件赋予一个绝对路径名,它由从根目录到文件的路径组成。在UNIX中路径之间用“/”分隔,在Windows中分隔符则是“\”。不管采用哪种分隔符,如果路径名的第一个字符是分隔符,则这个路径就是绝对路径。另一种方法是使用相对路径名,它常和当前目录/工作目录一起使用。用户可以指定一个目录作为当前工作目录,这时所有的不从根目录开始的路径名都是相对于工作目录的。
支持层次目录结构的操作系统在每个目录中有两个特殊的目录项“.”和“..”,前者指当前目录,后者指其父目录。
目录操作
管理目录的系统调用举例:create:创建空目录,除了目录项“.”和“..”外,目录项为空
delete:删除目录。只有空目录可以删除。
opendir:目论内容可被读取,在读目录前,必须先打开目录
readdir:返回当前目录的下一个目录项
rename
link:连接技术允许在多个目录中出现同一个文件
unlink:删除目录项,如果被解除连接的文件只出现在一个目录中,则将它从文件系统中删除
文件系统的实现
文件系统布局
文件系统存放在磁盘上,多数磁盘划分为一个或多个分区,每个分区有一个独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record),用来引导计算机。在MBR的结尾是分区表,给出了每个分区的起始和结束地址。
表中的一个分区被标记为活动分区,在计算机被引导时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区,读入它的一个块,称为引导块,并执行之。引导块中的程序将装载该分区中的操作系统。
除了引导块之外,文件系统通常还包含
超级块,包含文件系统的所有关键参数,如确定文件系统类型用的魔数、文件系统中数据块的数量等
空闲块
i节点,是一个数据结构数组,记录了每个文件的信息
根目录
其他所有的文件和目录
文件的实现
文件存储的关键问题在于记录各个文件分别用到了哪些磁盘块。有如下一些方法:1. 连续分配
最简单的分配方案是把每个文件作为一连串连续数据块存储在磁盘上。在块大小为1KB的磁盘上,50KB的文件要分配50个连续的块。
每个文件都是从一个新的块开始的,所以最后一块的结尾会浪费一些空间。
连续分配实现简单,方便读取,但会产生许多空闲块(碎片),不利于后续空间管理。
2. 链表分配
第二种方法是为每个文件构造磁盘块链表。每个块的第一个字作为指向下一块的指针,块的其他部分存放数据。链表分配可以充分利用每个磁盘块,但随机存取却很慢,因为每次都必须从头开始。
另外,由于指针占据了一些字节,会降低系统的运行效率。
3. 在内存中采用表的链表分配
如果取出每个磁盘块的指针字,把它放在内存的一个表中,就可以解决上述链表的两个不足。这样一个表称为文件分配表。这种方法的主要缺点是必须把整个表都存放在内存中,内存占用太大。
4. i节点
最后一个方法是给每个文件赋予一个称为i节点的数据结构,其中列出了文件属性和文件块的磁盘地址。只有在对应文件打开时,其i节点才在内存中,这比上一个方法的文件分配表要小很多。目录的实现
目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息。与此密切相关的问题是在何处存放文件属性。
一种显而易见的方法是把文件属性直接存放在目录项中。
另一种方法是把文件属性存放在i节点中,并把i节点放到目录项中。
共享文件
对于在一个项目里工作的几个用户来说,如果一个共享文件同时出现在属于不同用户的不同目录下,工作起来就很方便。某用户和某共享文件的联系称为一个连接,在这种情况下,文件系统本身是一个有向无环图,而不是一棵树了。
日志文件系统
基本思想:保存一个用于记录系统下一步将要做什么的日志。这样当系统在完成它们即将完成的任务前崩溃时,重新启动后,可以通过查看日志获取崩溃前计划完成的任务,并完成它们。这样的文件系统称为日志文件系统。为了让日志文件系统工作,被写入日志的操作必须是幂等的,即只要有必要,就可以重复执行多次而不会带来破坏。
Windows的NTFS有一个拓展的日志文件系统,并且它的结构几乎不会因系统崩溃而受到破坏。
虚拟文件系统
绝大多数UNIX操作系统都采用虚拟文件系统(Virtual File System,VFS),用来将多种文件系统统一成一个有序的框架。关键的思想就是抽象出所有文件系统都共有的部分,并且将这部分代码放在单独的一层,该层调用底层的实际文件系统来具体管理数据。VFS对用户进程有一个更高层的接口,称作POSIX接口。
VFS对实际文件系统有一个更底层的接口,称作VFS接口。
VFS就在用户进程和实际文件系统中起一个桥梁的作用。
大多数VFS应用本质上都是面向对象的。
文件系统性能
内存访问比磁盘访问快百万数量级,考虑到访问时间的差异,许多文件系统采用了各种优化措施以改善性能。高速缓存
最常用的减少磁盘访问次数的技术是块高速缓存或者缓冲区高速缓存。高速缓存是一系列的块,它们在逻辑上属于磁盘,但实际上被保存在内存中。管理高速缓存有不同的算法,常用的算法是:检查全部的读请求,查看在高速缓存中是否有所需要的块。如果存在,可执行读操作而无需访问磁盘。如果该块不在高速缓存中,首先要把它读到高速缓存中,再复制到所需的地方。之后,对同一个块的请求都通过高速缓存完成。
文件系统实例
CD-ROM文件系统
这种系统是为一次性写介质设计的,所以非常简单。最普遍的CD-ROM系统是ISO 9660文件系统。CD-ROM没有磁盘那样的同心柱面,而是沿一个螺旋线来顺序存储信息。螺旋线上的位序列被划分成大小为2352字节的逻辑块(扇区),其有效部分是2048字节。
每个CD-ROM由16块作为开始,这16块可以放入引导程序,使计算机能够从CD-ROM引导。接下来的一块存放基本卷描述符,它包含了CD-ROM的一些基本信息,如系统标识符(32字节)、卷标识符(32字节)、发布标识符(128字节)和数据预备标识符(128字节)等。
MS-DOS文件系统
要读文件时,MS-DOS程序首先调用一个open系统调用,以获得文件的句柄。open系统调用识别一个绝对路径或相对路径。MS-DOS按32位存储文件,通过内存里的文件分配表(FAT)来跟踪文件块。
相关文章推荐
- [置顶] [现代操作系统笔记][第四章文件系统]
- 《现代操作系统(中文第三版)》课后习题——第四章 文件系统
- 读书笔记-现代操作系统-4文件系统-4.1文件4.2目录
- 读书笔记-现代操作系统-4文件系统-4.4文件系统管理和优化
- 现代操作系统——文件系统
- 读书笔记-现代操作系统-7多媒体操作系统-7.6多媒体文件系统泛型7.7文件存放
- 现代操作系统之文件系统(上)
- [现代操作系统笔记][第四章文件系统]
- 读书笔记-现代操作系统-4文件系统-4.3文件系统的实现
- 【现代操作系统】第6章 文件系统
- (转)Linux操作系统文件系统基础知识详解
- 操作系统学习笔记(33)--文件系统
- Linux操作系统文件系统基础知识详解
- Linux操作系统文件系统基础知识详解
- Linux操作系统文件系统基础知识详解
- 操作系统总结之文件系统接口
- Linux操作系统文件系统基础知识详解
- Linux操作系统文件系统基础知识
- Linux学堂:Linux操作系统文件系统
- 嵌入式操作系统VxWorks中TFFS文件系统的构建