<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=645&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / OS之存储管理---文件系统的基本内容]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=645</link>
		<description><![CDATA[OS之存储管理---文件系统的基本内容 最近发表的帖子。]]></description>
		<lastBuildDate>Sun, 01 Jan 2023 15:35:37 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[OS之存储管理---文件系统的基本内容]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=692#p692</link>
			<description><![CDATA[<p>什么是文件</p><p>操作系统对存储设备的物理属性加以抽象，从而定义逻辑存储单位，即文件。文件由操作系统映射到物理设备上，这些存储设备是非易失的。文件是记录在外存上的相关信息的命名组合。从用户角度来看，文件是逻辑外存的最小分配单元，也就是说，数据只有通过文件才能存储到外存。文件的类型有很多，比如文本文件为按行组着的字符序列、源文件为函数序列，每个函数包括声明和可执行语句、可执行文件为一系列代码段，以供加载程序调入内存并执行。<br />文件属性</p><p>为了标示文件的各种特定信息，需要文件属性来存储文件的特定信息。文件属性因操作系统而异。但是通常包括：</p><p>&#160; &#160; 名称：符号文件名是以人类可读形式来保存的唯一信息<br />&#160; &#160; 标识符：这种唯一标记标示文件系统的文件，是文件的非人类可读名称<br />&#160; &#160; 类型：支持不同类型文件的系统需要这种信息<br />&#160; &#160; 位置：该信息为指向设备与设备上文件位置的指针<br />&#160; &#160; 尺寸：该属性包括文件的当前大小（以字节、字、块为单位）以及可能允许的最大尺寸<br />&#160; &#160; 保护：访问控制信息确定谁能进行读取、写入、执行等<br />&#160; &#160; 时间、日期和用户标识：文件创建、最后修改、最后使用的相关信息可以保存。这些数据用户保护、安全和使用监控。</p><p>有些文件系统还支持扩展文件属性，包括文件的字符编码和安全功能，如文件的校检和。所有的文件的信息保存在目录结构中，该目录结构保存在外存中。<br />文件操作</p><p>为了正确的定义文件，操作系统可以提供系统调用，来对文件进行：创建、写入、读取、重新定位、删除、截断文件等操作。</p><p>&#160; &#160; 创建文件：创建文件需要两个步骤：<br />&#160; &#160; １、必须在文件系统中为文件找到空闲空间。<br />&#160; &#160; ２、必须在目录中创建新文件的条目<br />&#160; &#160; 写文件：使用一个系统调用指定文件名称和要写入的信息。系统搜索目录查找文件的位置。系统应保留写指针用于指向需要进行下次写操作的文件位置。<br />&#160; &#160; 读文件：指明文件名称和需要文件的下一块该放在哪里（在内存中）。系统需要保留一个读指针指向要进行下一次读取操作的文件位置。当前操作位置可以作为进程的当前文件位置指针。读和写操作都是用相同的指针，可节省空间并降低系统复杂度。<br />&#160; &#160; 重新定位文件：搜索目录以寻找适当的条目，并且将当前文件位置指针重新定位到给定值<br />&#160; &#160; 删除文件：释放文件的所有文件空间，并删除指定的目录条目<br />&#160; &#160; 截断文件：让文件重置为零，并释放它的文件空间，但是允许所有属性保持不变（除了文件长度）</p><p>在首次使用文件之前进行系统调用open()，操作系统有一个打开文件表用来维护所有打开文件的信息，open()根据文件名搜索目录，将目录条目复制到打开文件表。当文件不在使用的时候，进程关闭该文件，操作系统从打开文件表中删除它的条目。<br />当多个进程可以同时打开文件的环境，这可能会发生操作系统采用两级的内部表：每个进程表和整个系统表。每个进程表跟它打开的所有文件，该表存储的是进程对文件的使用信息。<br />单个进程表的每个条目相应的指向整个系统的打开文件表。系统表包含与进程无关的信息。系统打开文件表为每个文件关联一个打开计数，用来表示多少进程打开了这个文件。当打开计数为0时，可以从系统打开文件表中删除这个文件条目。<br />每个打开文爱你具有如下的关联信息：</p><p>&#160; &#160; 文件指针：该指针对操作系统的每个进程是唯一的，因此必须和磁盘文件属性分开保存<br />&#160; &#160; 文件打开计数<br />&#160; &#160; 文件的磁盘位置<br />&#160; &#160; 访问权限：该信息保存在进程的打开文件表中</p><p>有的操作系统提供文件锁，用于一个继承锁定文件，防止其他进程访问它。<br />文件锁一般有联众类型：</p><p>&#160; &#160; 共享锁：类似读者锁，便于多个进程可以并发获取它<br />&#160; &#160; 独占锁：类似写者锁，一次只有一个进程可以获得这样的锁</p><p>有的操作系统还提供强制和建议文件锁定机制。如果锁定方案是强制性的，那么操作系统确保锁定完整性；如果锁是建议的，软件开发人员应该确保适当的获取和释放锁，比如Windows采用强制锁定，而UNIX采用建议锁定。<br />文件类型</p><p>设计文件系统时，需要考虑系统是否应该识别和支持文件类型。如果系统识别文件的类型，则它就能按合理的方式来操作文件。一般文件名分为两部分，即名称和扩展。<br />UNIX系统采用位于某些文件开始部分的幻数，大致表明文件类型，不是所有问阿金都有幻数，所以系统特征不能仅仅基于这种信息。UNIX也不记录创建程序的名称。UNIX允许文件名扩展提示，但是操作系统不强制也不依赖这些扩展名；这些扩展名主要帮助用户确定吧文件内容的类型。<br />文件结构</p><p>文件类型也可用于指示文件的内部结构。但是操作系统支持多个文件结构会带来一个缺点：操作系统会变得太复杂。有写操作系统强加（并支持）最小数量的文件结构。UNIX认为每个文件为8位字节序列，而操作系统不必对这些位做出解释。<br />内部文件结构</p><p>磁盘系统通常具有明确定义的块大小，这是由扇区大小决定的。所有的磁盘I/O按块（物理记录）为单位执行，所有的块的大小相同。物理记录大小不太可能刚好匹配期望的逻辑记录的长度，逻辑记录的长度甚至可能不同。解决方法是，将多个逻辑记录包装到一个物理块中。<br />访问方法</p><p>&#160; &#160; 顺序访问<br />&#160; &#160; 文件的信息按顺序（即一个记录接着一个记录的）加以处理，这种访问模式是目前最常见的，比如编辑器和编译器通常以这种方式进行访问文件。<br />&#160; &#160; 顺序访问基于文件的磁带模型，不但适用于顺序访问设备，也适用于随机访问设备。<br />&#160; &#160; 直接访问<br />&#160; &#160; 直接访问也称为相对访问，文件是由固定长度的逻辑记录组成的，以允许程序按任意顺序进行快速读取和写入记录。直接访问方法基于文件的磁盘模型，因为磁盘允许对任何文件块的随机访问。<br />&#160; &#160; 对于直接访问方法，必须修改文件操作以便包括块号作为参数，read(n)，其中的n就是块号。<br />&#160; &#160; 用户提供给操作系统的块号，通常为相对块号，相对块号是相对于文件开头的索引。</p><p>目录和磁盘的结构</p><p>一个存储设备可以按整体来用于文件系统，也可以进行细分来提供更细粒度的控制。比如，一个磁盘可以划分为四个分区，每个分区可以有单独的文件系统。存储设备还可以组成RAID集，一起提供保护以免受到单个磁盘故障。包含文件系统的分区通常称为卷。卷可以是设备的一部分，或整个设备，或由多个设备组成的RAID集。包含文件西荣的每个卷也应包含有关系统内的文件信息，这些信息保存在设备目录或卷目录表中<br />存储结构</p><p>通用计算机系统有多个存储设备，这些存储设备可以分成保存文件系统的卷，计算机系统可能没有文件系统，也可能有多个文件系统，而且文件系统的类型可以不同。<br />在这里插入图片描述<br />一些常见的文件系统类型：</p><p>&#160; &#160; tmpfs：“临时”文件系统，是在易失性内存中创建的，当系统重启或崩溃的时候，它的内容会被擦除<br />&#160; &#160; objfs：“虚拟”文件系统。本质上这是一个内核接口，但是看起来像一个文件系统；它让调试器访问内核符号<br />&#160; &#160; ctfs：维护“合同”信息的虚拟文件系统，以管理哪些进程在系统引导时启动并且运行时必须继续运行。<br />&#160; &#160; lofs：“环回”文件系统，允许一个文件系统代替另一个来被访问<br />&#160; &#160; procfs：虚拟文件系统，将所有进程信息作为文件系统来呈现<br />&#160; &#160; ufs, zfs：通用文件系统</p><p>目录概述</p><p>目录可视为符号表，可将文件名称转成目录条目。常见考虑特定的目录结构的时候，需要对目录执行的操作如下：</p><p>&#160; &#160; 搜索文件<br />&#160; &#160; 创建文件<br />&#160; &#160; 删除文件<br />&#160; &#160; 遍历目录<br />&#160; &#160; 重命名文件<br />&#160; &#160; 遍历文件系统</p><p>单级目录</p><p>最容易实现的就是单级目录，所有文件都包含在同一目录中。但是当文件数量增加或系统有多个用户的时候，单级目录有重要的限制。<br />两级目录</p><p>为每个用户创建一个单独的目录(UFD)。同时系统有一个主文件目录(MFD)，通过用户名或账户可以索引MFD，每个条目指向该用户的UFD。当用户引用特定文件时，只搜索自己的UFD。这种数据结构将一个用户和其他用户相隔离，但是当用户需要在某个任务上进行合作并且访问彼此文件时，隔离确是个缺点。<br />树形目录</p><p>树形目录是最常见的目录结构，有一个根目录，系统内每个文件都有唯一的路径名。目录包括一组文件和子目录，目录只不过是一个文件，但是他是按照特殊方式处理的，每个目录条目都有一位来将条目定义为文件或子目录。<br />无环图目录</p><p>树结构截止共享文件或目录。无环图(就是没有循环的图)允许目录共享子目录和文件。同一文件或子目录可出现在两个不同的目录中。无环图是树形目录方案的自然扩展。<br />在这里插入图片描述<br />实现共享文件和目录的方法有多个：</p><p>&#160; &#160; 使用链接技术<br />&#160; &#160; 在两个共享目录中复制有关他们的所有信息<br />&#160; &#160; 两个条目因为复制其实是相同且相等，但是有一个问题即使在修改文件呢时要维护一致性。</p><p>实现共享目录和文件时会涉及到删除，即共享文件的分配空间何时可以被释放和重用：</p><p>&#160; &#160; 当用户删除时就删除，但是这种操作可能留下悬挂指针，以指向不存在的文件<br />&#160; &#160; 另一种删除方法是保留文件，直到它的所有引用都被删除，这时需要一种机制来确定文件的最后一个引用被删除。</p><p>在UNIX和Linux中的硬链接采用的就是第二种方法，而软链接采用的是第一种方法。<br />通用图目录</p><p>无环图目录保证了结构中不存在环，如果允许目录中有环，则无论从正确性和性能角度来说，同样需要避免多次搜索同一部分。如果存在环时，即使不再坑你引用一个目录或文件时，引用计数也可能不为0，这种情况下通常需要垃圾收集方案，确定何时最后引用已被删除并重新分配磁盘空间</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Sun, 01 Jan 2023 15:35:37 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=692#p692</guid>
		</item>
	</channel>
</rss>
