公告

Gentoo交流群:87709706 欢迎您的加入

#1 2023-01-02 00:35:37

batsom
管理团队
注册时间: 2022-08-03
帖子: 574
个人网站

OS之存储管理---文件系统的基本内容

什么是文件

操作系统对存储设备的物理属性加以抽象,从而定义逻辑存储单位,即文件。文件由操作系统映射到物理设备上,这些存储设备是非易失的。文件是记录在外存上的相关信息的命名组合。从用户角度来看,文件是逻辑外存的最小分配单元,也就是说,数据只有通过文件才能存储到外存。文件的类型有很多,比如文本文件为按行组着的字符序列、源文件为函数序列,每个函数包括声明和可执行语句、可执行文件为一系列代码段,以供加载程序调入内存并执行。
文件属性

为了标示文件的各种特定信息,需要文件属性来存储文件的特定信息。文件属性因操作系统而异。但是通常包括:

    名称:符号文件名是以人类可读形式来保存的唯一信息
    标识符:这种唯一标记标示文件系统的文件,是文件的非人类可读名称
    类型:支持不同类型文件的系统需要这种信息
    位置:该信息为指向设备与设备上文件位置的指针
    尺寸:该属性包括文件的当前大小(以字节、字、块为单位)以及可能允许的最大尺寸
    保护:访问控制信息确定谁能进行读取、写入、执行等
    时间、日期和用户标识:文件创建、最后修改、最后使用的相关信息可以保存。这些数据用户保护、安全和使用监控。

有些文件系统还支持扩展文件属性,包括文件的字符编码和安全功能,如文件的校检和。所有的文件的信息保存在目录结构中,该目录结构保存在外存中。
文件操作

为了正确的定义文件,操作系统可以提供系统调用,来对文件进行:创建、写入、读取、重新定位、删除、截断文件等操作。

    创建文件:创建文件需要两个步骤:
    1、必须在文件系统中为文件找到空闲空间。
    2、必须在目录中创建新文件的条目
    写文件:使用一个系统调用指定文件名称和要写入的信息。系统搜索目录查找文件的位置。系统应保留写指针用于指向需要进行下次写操作的文件位置。
    读文件:指明文件名称和需要文件的下一块该放在哪里(在内存中)。系统需要保留一个读指针指向要进行下一次读取操作的文件位置。当前操作位置可以作为进程的当前文件位置指针。读和写操作都是用相同的指针,可节省空间并降低系统复杂度。
    重新定位文件:搜索目录以寻找适当的条目,并且将当前文件位置指针重新定位到给定值
    删除文件:释放文件的所有文件空间,并删除指定的目录条目
    截断文件:让文件重置为零,并释放它的文件空间,但是允许所有属性保持不变(除了文件长度)

在首次使用文件之前进行系统调用open(),操作系统有一个打开文件表用来维护所有打开文件的信息,open()根据文件名搜索目录,将目录条目复制到打开文件表。当文件不在使用的时候,进程关闭该文件,操作系统从打开文件表中删除它的条目。
当多个进程可以同时打开文件的环境,这可能会发生操作系统采用两级的内部表:每个进程表和整个系统表。每个进程表跟它打开的所有文件,该表存储的是进程对文件的使用信息。
单个进程表的每个条目相应的指向整个系统的打开文件表。系统表包含与进程无关的信息。系统打开文件表为每个文件关联一个打开计数,用来表示多少进程打开了这个文件。当打开计数为0时,可以从系统打开文件表中删除这个文件条目。
每个打开文爱你具有如下的关联信息:

    文件指针:该指针对操作系统的每个进程是唯一的,因此必须和磁盘文件属性分开保存
    文件打开计数
    文件的磁盘位置
    访问权限:该信息保存在进程的打开文件表中

有的操作系统提供文件锁,用于一个继承锁定文件,防止其他进程访问它。
文件锁一般有联众类型:

    共享锁:类似读者锁,便于多个进程可以并发获取它
    独占锁:类似写者锁,一次只有一个进程可以获得这样的锁

有的操作系统还提供强制和建议文件锁定机制。如果锁定方案是强制性的,那么操作系统确保锁定完整性;如果锁是建议的,软件开发人员应该确保适当的获取和释放锁,比如Windows采用强制锁定,而UNIX采用建议锁定。
文件类型

设计文件系统时,需要考虑系统是否应该识别和支持文件类型。如果系统识别文件的类型,则它就能按合理的方式来操作文件。一般文件名分为两部分,即名称和扩展。
UNIX系统采用位于某些文件开始部分的幻数,大致表明文件类型,不是所有问阿金都有幻数,所以系统特征不能仅仅基于这种信息。UNIX也不记录创建程序的名称。UNIX允许文件名扩展提示,但是操作系统不强制也不依赖这些扩展名;这些扩展名主要帮助用户确定吧文件内容的类型。
文件结构

文件类型也可用于指示文件的内部结构。但是操作系统支持多个文件结构会带来一个缺点:操作系统会变得太复杂。有写操作系统强加(并支持)最小数量的文件结构。UNIX认为每个文件为8位字节序列,而操作系统不必对这些位做出解释。
内部文件结构

磁盘系统通常具有明确定义的块大小,这是由扇区大小决定的。所有的磁盘I/O按块(物理记录)为单位执行,所有的块的大小相同。物理记录大小不太可能刚好匹配期望的逻辑记录的长度,逻辑记录的长度甚至可能不同。解决方法是,将多个逻辑记录包装到一个物理块中。
访问方法

    顺序访问
    文件的信息按顺序(即一个记录接着一个记录的)加以处理,这种访问模式是目前最常见的,比如编辑器和编译器通常以这种方式进行访问文件。
    顺序访问基于文件的磁带模型,不但适用于顺序访问设备,也适用于随机访问设备。
    直接访问
    直接访问也称为相对访问,文件是由固定长度的逻辑记录组成的,以允许程序按任意顺序进行快速读取和写入记录。直接访问方法基于文件的磁盘模型,因为磁盘允许对任何文件块的随机访问。
    对于直接访问方法,必须修改文件操作以便包括块号作为参数,read(n),其中的n就是块号。
    用户提供给操作系统的块号,通常为相对块号,相对块号是相对于文件开头的索引。

目录和磁盘的结构

一个存储设备可以按整体来用于文件系统,也可以进行细分来提供更细粒度的控制。比如,一个磁盘可以划分为四个分区,每个分区可以有单独的文件系统。存储设备还可以组成RAID集,一起提供保护以免受到单个磁盘故障。包含文件系统的分区通常称为卷。卷可以是设备的一部分,或整个设备,或由多个设备组成的RAID集。包含文件西荣的每个卷也应包含有关系统内的文件信息,这些信息保存在设备目录或卷目录表中
存储结构

通用计算机系统有多个存储设备,这些存储设备可以分成保存文件系统的卷,计算机系统可能没有文件系统,也可能有多个文件系统,而且文件系统的类型可以不同。
在这里插入图片描述
一些常见的文件系统类型:

    tmpfs:“临时”文件系统,是在易失性内存中创建的,当系统重启或崩溃的时候,它的内容会被擦除
    objfs:“虚拟”文件系统。本质上这是一个内核接口,但是看起来像一个文件系统;它让调试器访问内核符号
    ctfs:维护“合同”信息的虚拟文件系统,以管理哪些进程在系统引导时启动并且运行时必须继续运行。
    lofs:“环回”文件系统,允许一个文件系统代替另一个来被访问
    procfs:虚拟文件系统,将所有进程信息作为文件系统来呈现
    ufs, zfs:通用文件系统

目录概述

目录可视为符号表,可将文件名称转成目录条目。常见考虑特定的目录结构的时候,需要对目录执行的操作如下:

    搜索文件
    创建文件
    删除文件
    遍历目录
    重命名文件
    遍历文件系统

单级目录

最容易实现的就是单级目录,所有文件都包含在同一目录中。但是当文件数量增加或系统有多个用户的时候,单级目录有重要的限制。
两级目录

为每个用户创建一个单独的目录(UFD)。同时系统有一个主文件目录(MFD),通过用户名或账户可以索引MFD,每个条目指向该用户的UFD。当用户引用特定文件时,只搜索自己的UFD。这种数据结构将一个用户和其他用户相隔离,但是当用户需要在某个任务上进行合作并且访问彼此文件时,隔离确是个缺点。
树形目录

树形目录是最常见的目录结构,有一个根目录,系统内每个文件都有唯一的路径名。目录包括一组文件和子目录,目录只不过是一个文件,但是他是按照特殊方式处理的,每个目录条目都有一位来将条目定义为文件或子目录。
无环图目录

树结构截止共享文件或目录。无环图(就是没有循环的图)允许目录共享子目录和文件。同一文件或子目录可出现在两个不同的目录中。无环图是树形目录方案的自然扩展。
在这里插入图片描述
实现共享文件和目录的方法有多个:

    使用链接技术
    在两个共享目录中复制有关他们的所有信息
    两个条目因为复制其实是相同且相等,但是有一个问题即使在修改文件呢时要维护一致性。

实现共享目录和文件时会涉及到删除,即共享文件的分配空间何时可以被释放和重用:

    当用户删除时就删除,但是这种操作可能留下悬挂指针,以指向不存在的文件
    另一种删除方法是保留文件,直到它的所有引用都被删除,这时需要一种机制来确定文件的最后一个引用被删除。

在UNIX和Linux中的硬链接采用的就是第二种方法,而软链接采用的是第一种方法。
通用图目录

无环图目录保证了结构中不存在环,如果允许目录中有环,则无论从正确性和性能角度来说,同样需要避免多次搜索同一部分。如果存在环时,即使不再坑你引用一个目录或文件时,引用计数也可能不为0,这种情况下通常需要垃圾收集方案,确定何时最后引用已被删除并重新分配磁盘空间

离线

页脚

Powered by FluxBB