原创

操作系统核心原理-6.外存管理(下)文件系统

一、为何需要文件系统?

  磁盘具有大容量、低成本以及持久化的特点,即使发生断电,磁盘上的数据也不会丢失。但是,对于一般用户而言,使用磁盘是非常苦难的,因为他们不知道如何驱动一个磁盘,以及计算数据在磁盘上的存放位置。从上一篇《磁盘基础》可以知道,了解磁盘的各项技术细节将使用户不堪重负。

  操作系统是一个魔术师,其提供给用户的就是各种幻想:抽象。进程抽象的是CPU,虚拟内存抽象的是内存,对于磁盘来说,操作系统提供给用户的帮助就是在磁盘外面包裹一层容易使用的抽象,用户直接与这层抽象打交道,而无需了解磁盘的技术细节。在操作系统中,这层为磁盘提供的抽象就是:文件系统

二、文件系统的基本概念

2.1 文件系统是什么

  文件系统是操作系统为磁盘和用户之间提供的一个抽象,它是一个子虚乌有的,看不见摸不着的接口,如下图所示:

  (1)文件系统使得用户能够很方便的使用磁盘:将用户从数据存放的细节中解放出来,用户不需要知道内容存放在什么地方,也不需要知道如何存放,更不需要知道磁盘到底是如何工作的。

  (2)简单地说,文件系统将其接触的磁盘物理特性转换为用户看到的路径名和文件名。用户对磁盘进行访问只需要给出文件名和路径名即可,而无需知道磁柱、磁道、扇面、数据块等信息

  (3)文件系统的主要特性就是存储大量的信息,多个进程可以同时访问一个文件,进程结束也不会影响文件的持续存在

2.2 文件系统的目标

  (1)地址独立

  一个文件在产生的时候无需担心其存放的磁盘地址,即文件数据的产生与文件将来存放的磁盘地址相互独立。

  (2)地址保护

  地址保护需要对文件的访问进行一定的限制,即不是任何人都可以访问任何文件。

Difference:文件系统的地址保护与内存管理下的地址保护不同,内存管理下地址保护指的是一个进程不能访问另一个进程空间,而文件系统下的地址保护不是一个文件不能访问另一个文件空间,而是一个文件的访问时有限制的。

2.3 文件的基本知识

  (1)文件命名

  文件名可以便于访问一个文件,这个文件名既可以是英语名、中文名,也可以是图像名。当用户给出一个文件名,操作系统就可以根据这个名字找到对应文件的内容。具体来说,就是找到该文件存放在磁盘上的所有数据块

  操作系统将文件名翻译为其数据块在磁盘上存放的地址,由于磁盘的寻址单位是扇面,而这些磁盘地址实际上就是一个个的扇面号。

  (2)扩展名

  扩展名通常用来表明文件的类型,如何文本文件、二进制文件等等。例如:file.c 表明该文件是一个C语言的源文件。扩展名对文件类别的指示仅仅是指示性的,并不具有强制性。

  (3)内容寻址

  除了给出文件名外,还可以给出文件的内容,供操作系统查找使用。数据库系统是这种实现方式的典型应用。

  (4)文件访问

  ①顺序访问:从开头开始访问,按照先来后到的顺序读取数据。

  ②随机访问:可以按照任意顺序读取数据记录,就像我们看DVD一样可以随机选择想要观看的段落。

  (5)文件属性

  每个文件除了一个文件名外,还有许多信息也是我们感兴趣的,所以,文件还拥有一些属性。不同的操作系统,文件的属性种类和数量都不同,但每一种属性都有自己的用途,下表列出了常见的文件属性:

  (6)文件操作

  可以对文件进行操作有:创建/删除、打开/关闭、读写添加、寻找访问位置、读取属性/设置属性、重命名等等。

三、文件夹实现地址独立

3.1 为何要有文件夹

  我们可以对文件进行读写操作,那么给一个文件名,操作系统是如何知道从什么地方读取文件内容的呢?换句话说,文件在磁盘上的什么位置,操作系统是如何知道的呢?这需要一个数据结构来记录每个文件在磁盘上的地址,这个数据结构就是文件夹

  文件夹也称为目录夹(Folder),它的角色就是跟踪文件,里面存放的是从文件到文件所在磁盘的地址的映射,即“文件名→文件所在磁盘上的地址”。文件夹对于文件来说,就相当于从虚拟地址到实际地址的一种翻译机制。

3.2 文件夹结构

  由于文件夹里面可以有子文件夹,因此就形成了一个层次结构,这个层次结构的顶端就是根文件夹(也称为根目录),如下图所示:

  根目录是一个文件系统的总起点,它在操作系统启动的时候加载到内存。从根目录开始,该文件系统里面的所有文件都可以找出来。

四、文件系统的调用

4.1 操作系统提供的“接口”

  操作系统为用户提供的文件系统接口就是文件系统调用,用户可以在程序中通过这些系统调用来对文件系统进行读写操作。这些系统调用包括:打开文件、关闭文件、读文件内容、写文件内容等等。

4.2 文件系统调用实例

  下图展示了一个C语言编写的使用文件系统调用实现文件拷贝的简单实例程序:

  上述文件拷贝程序实现的是打开源文件和目标文件,然后循环往复地将源文件内容读取到一个缓冲区,然后将缓冲区的内容写到输出目标文件里。当拷贝结束后,关闭源文件和目标文件。

参考资料

邹恒明,《操作系统之哲学原理》,机械工业出版社

 

正文到此结束
本文目录