其他分享
首页 > 其他分享> > 操作系统哲学原理(16)文件原理-文件基础

操作系统哲学原理(16)文件原理-文件基础

作者:互联网

说明:该系类文章主要是从哲学视角看 操作系统 这门学科。同时也是 博主阅读《操作系统之哲学原理》的笔记总结。因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主,因此这个系类文章也是这两个领域不可或缺的基石之一,尤其是对操作系统感兴趣的伙伴可特别关注。


16 文件系统

16.1 为什么需要文件系统

将数据存储在内存上,掉电后数据就会丢失,要想把数据保存下来,就需要将数据放在一种持久的媒介上,就是磁盘。磁盘的特点是容量大、低成本、持久、可共享。即使掉电依然不会丢失数据。驱动磁盘对于一般用户而言非常困难,因此需要操作系统来进行抽象,而操作系统将磁盘其抽象为文件与文件系统。

16.2 文件系统

文件系统就是操作系统提供的一种抽象。具体描述如下:文件系统将具体的磁盘物理特性转换为用户能够看到的路径名和文件名,即用户只要给出路径名、文件名即可,不需要知道磁柱、磁道、扇面和数据块等信息。文件系统主要就是存储大量信息,多个进程可以访问同一个文件,进程结束也不会影响文件的持续存在。

16.3 文件系统的目标

文件系统的目标:地址保护和地址独立。

16.4 文件的基本知识

下面内容是从用户的角度看待文件以及文件系统的,从用户的角度分析文件的地址独立和地址保护是怎样实现的。

16.5 从用户角度看文件系统

16.5.1 文件命名

一个符号名,便于访问一个文件的访问;具体来说就是找到文件存放在磁盘上的所有数据块。

操作系统如何找到这些数据块:

  1. 将该文件名翻译成其数据块在磁盘上存放的地址。(由于磁盘的寻址单位是扇面,这些磁盘地址实际上就是一个个的扇面号。由于一个文件可能占用多个扇面,文件在磁盘上的地址通常有多个)
  2. 根据文件在磁盘上的组织方式不同,这种从名字到磁盘地址的翻译将有所不同。

16.5.2 扩展名

扩展名用于表明文件的类型,入二进制文件、文本文件等。

注意:扩展名对文件类别的指示仅仅是指示性的,并不具有强制性。(在UNIX下,系统并不遵守扩展名;而在windows下,扩展名规则是被遵守的,例如可执行文件只有.bat、.exe和.com)

16.5.3 内容寻址

提供文件的内容,以供操作系统来查找,数据库就是以这种方式来查找的,这种方式成为内容寻址。

16.5.4 文件内容组织

从哲学角度来看,文件组织的形式有两种:关系导向图组织和非关系导向图组织。

@1 关系导向图组织:将数据之间的关系记录在文件里面,文件的构造和数据之间的关系存在某种对应关系。

三种结构比较如下:

@2非关系导向图组织:不考虑数据里面的任何结构,对于此种方法,数据就是数据流,没有记录,没有关系;这个数据可以是字节流,可以是数据块流,不同之处就是这个“流”的单位不同,如图所示:

对于如此多的组织方式中,哪一种最有效需要分析,分析过程如下:

对于文件系统,需要做的是让磁盘更加容易使用,而不是涉及文件里面数据的语义。因此从可靠性、安全性、兼容性来讲,关系导向图方式都不合适。对于非关系导向图而言 字节流方式最受欢迎。因为从计算机来看,大部分寻址的最小单位是字节,因此,字节是最为简单的了。总体来讲,字节流文件系统的好处是:操作系统代码更加可靠、更加灵活、用户编写程序也更加方便。

16.5.5 文件类型

大部分操作系统支持多种文件。根据文件的内容是用户数据还是文件系统本身的数据,文件分为3种:目录、一般文件、块文件

16.5.6 文件格式

不同类型的文件有着不同类型的逻辑单元,而这些逻辑单元在空间上的关系也因文件系统的不同和操作系统的不同而不同。其中,可执行文件和归档文件在UNIX下的格式如图所示:

对于可执行文件来说,它有一个标题(header)、一个代码部分、一个数据部分、一个重定位部分、一个符号表

而标题通常分为多个逻辑单元:魔数(告诉操作系统这个文件的类型。魔数是个很重要的数字,如果你把一个不是可执行的文件的魔数改成可执行文件的魔数,将会产生不可预料的后果。当然,不同的文件类型也可能共享同一种文件格式。(例如,windows里而的pE格式就是对象文件(ohj文件)、可执行文件、动态链接库、驱动程序等共用的一种格式))、代码尺寸、数据尺寸、共享空间尺寸、符号表尺寸、程序入点和各种标志位。

16.5.7 文件访问

文件的访问类型只有两种:顺序访问和随机访问。

16.5.8 文件属性

对于不同的操作系统,文件的属性、种类和数量可以不同。但是每一种属性都有自己的用途常见的文件属性如图所示:

大部分语义直接明了,只有部分需要解释:

文件的属性可以被修改。而修改的方式有两种:一是直接在shell下用工具程序(utilities)来进行修改;二是在程序中使用系统调用(systemcall)来进行修改。

16.5.9 文件操作

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

16.6 地址独立的实现机制:文件夹

16.6.1 文件夹结构

文件夹的层次结构如下:

根目录是一个文件系统的总起点,它在操作系统启动的时候加载到内存。从根目录开始,该文件系统里的所有文件都可以找出来。由于根目录是整个文件系统的源点,如果根目录损坏,则整个文件系统都无法访问,也就说文件系统已经崩溃(当然,我们可以通过文件恢复和修复等手段来获得对部分文件的访问能力,但这不是操作系统要探讨的问题)。

16.6.2 相对路径和绝对路径

注意:相对路径与绝对路径相比,并不都是节省访问次数,即各有各的优势与缺陷。

16.6.3 共享与链接

链接:使文件的访问和文件的共享变得方便,而且实现的是即时共享(访问的就是你想要的文件,不是副本)

16.7 文件系统调用

从用户角度看,操作系统提供的文件系统界而就是文件系统调用。用户可以在程序中通过这些系统调用对文件系统进行读写操作。这些系统调用包括打开文件、关闭文件、读文件内容、写文件内容等。下面是一个例子,使用文件系统调用实现文件复制的简单程序,如图所示:

工作原理如下:

  1. 打开源文件和目标文件;
  2. 然后循环往复地将源文件的内容读到一个缓冲区;
  3. 将缓冲区的内容写到输出目标文件里。
  4. 当复制结束后,关闭源文件和目标文件。

那么上述程序有一个问题,正确性方面是没有问题,但在效率上却不太令人满意。这是因为该程序的系统调用次数太多,而系统调用需要陷人到内核。另外,每次系统调用都需要进行磁盘操作,而磁盘操作的效率远远低于内存操作的效率。解决这个问题可以将缓冲区设大,这样可以降低系统调用和磁盘访问的次数。但缓冲区越大,需要的内存就越大,将造成程序的可执行性下降。而且,就算缓冲区很大,文件还可以更大,还是不能从根本上解决效率低的问题。那么解决这个问题需要新的策略:内存映射的文件访问。

16.8 内存映射的文件访问

解决读写文件效率低下的中心思想就是把磁盘访问变成内存访问。实现这种访问转变的手段就是内存映射的文件访问。

标签:文件,操作系统,16,文件系统,哲学原理,访问,磁盘,数据
来源: https://blog.csdn.net/vviccc/article/details/116195938