上海营销型网站标准,拟采用建站技术,百度推广点击软件,WordPress表情包插件这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点#xff1a;多级索引… 这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点多级索引 比较对空闲空间管理空闲链表法位图法 一.文件系统的基本组成
文件系统是操作系统中负责管理持久数据的子系统说简单点就是负责把用户的文件存到磁盘硬件中因为即使计算机断电了磁盘里的数据并不会丢失所以可以持久化的保存文件。
文件系统的基本数据单位是文件它的目的是对磁盘上的文件进行组织管理那组织的方式不同就会形成不同的文件系统。Linux中一切皆是文件普通目录文件块设备管道socket,等都是文件系统管理LInux会给每个文件分配两个数据结构索引节点和目录项目
索引节点
也就是 inode用来记录文件的元信息比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识它们之间一一对应也同样都会被存储在硬盘中所以索引节点同样占用磁盘空间。一个文件可以有多个别字。比如硬链接的实现就是多个目录项中的索引节点指向同一个文件。通常为了加快读取速度当文件被访问时会把索引节点加载到内存中去
目录项
也就是 dentry用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来就会形成目录结构但它与索引节点不同的是目录项是由内核维护的一个数据结构不存放于磁盘而是缓存在内存。目录也是文件也是用索引节点唯一标识和普通文件不同的是普通文件在磁盘里面保存的是文件数据而目录文件在磁盘里面保存子目录或文件。录是个文件持久化存储在磁盘而目录项是内核一个数据结构缓存在内存。存在目的如果查询目录频繁从磁盘读效率会很低所以内核会把已经读过的目录用目录项这个数据结构缓存在内存下次再次读到相同的目录时只需从内存读就可以大大提高了文件系统的效率。
文件数据的存储
扇区
磁盘读写的最小单位是扇区扇区大小是512字节为了增加读取速度文件系统把8个扇区组合成一个逻辑块4kb提高了读写速率.
三个存储区域
超级块用来存储文件系统的详细信息比如块个数、块大小、空闲块等等当文件系统被挂载时加载进内存。索引节点区用来存储索引节点。数据块区用来存储文件或目录数据
二.虚拟文件系统
文件系统种类众多为了统一接口。在用户层和文件系统引入了中间层这个中间层称为虚拟文件系统 VFS 定义了一组所有文件系统都支持的数据结构和标准接口这样程序员不需要了解文件系统的工作原理只需要了解 VFS 提供的统一接口即可
文件系统分类
磁盘的文件系统他是直接把数据存储在磁盘中比如Ext 2/3/4,XFS等都是这类文件系统内存的文件系统这类文件系统的数据是存储在内存空间的比如常见的/proc和/sys,实际上是读写内核中的相关数据网络的文件系统用来访问其他主机上的文件系统。
进程文件表 每一个进程都有个文件表文件表里的每一项代表「文件描述符」文件指针系统跟踪上次读写位置作为当前文件位置指针这种指针对打开文件的某个进程来说是唯一的文件打开计数器文件关闭时操作系统必须重用其打开文件表条目否则表内空间不够用。因为多个进程可能打开同一个文件所以系统在删除打开文件条目之前必须等待最后一个进程关闭文件该计数器跟踪打开和关闭的数量当该计数为 0 时系统关闭文件删除该条目文件磁盘位置绝大多数文件操作都要求系统修改文件数据该信息保存在内存中以免每个操作都从磁盘中读取访问权限每个进程打开文件都需要有一个访问模式创建、只读、读写、添加等该信息保存在进程的打开文件表中以便操作系统能允许或拒绝之后的 I/O 请求
读写过程
当用户进程从文件读取 1 个字节大小的数据时文件系统则需要获取字节所在的数据块再返回数据块对应的用户进程所需的数据部分。当用户进程把 1 个字节大小的数据写进文件时文件系统则找到需要写入数据的数据块的位置然后修改数据块中对应的部分最后再把数据块写回磁盘。文件系统的基本操作单位是数据块
三.文件的存储
文件的数据是要存储在硬盘上面的数据在磁盘上的存放方式就像程序在内存中存放的方式那样有以下两种
连续空间存放方式非连续空间存放方式
连续空间存放方式
连续空间存放方式就是把文件存放在连续的物理空间中这种情况文件数据紧密读取速率高磁盘一次寻道就可以读出整个文件。使用连续存放的一个前提是必须知道一个文件的大小这样才能找到相应大小的空间分配给文件文件头里面需要指定的起始块位置和长度有这两个信息就可以很好的表示存放
缺点
存在大量的磁盘碎片空间文件长度不易扩展的缺陷
非连续空间存放方式
非连续空间存放方式分为「链表方式」和「索引方式」
链表方式
链表的方式是离散的不需要连续于是就可以消除磁盘碎片可以大大提高磁盘的利用率同时可以支持文件长度动态扩展。 根据实现的方式的不同链表可分为「隐式链表」和「显式链接」两种形式
隐式链表
文件要以「隐式链表」的方式存放的话实现的方式是文件头要包含「第一块」和「最后一块」的位置并且每个数据块里面留出一个指针空间用来存放下一个数据块的位置这样一个数据块连着一个数据块从链头开是就可以顺着指针找到所有的数据块所以存放的方式可以是不连续的。
缺点
在于无法直接访问数据块只能通过指针顺序访问文件以及数据块指针消耗了一定的存储空间。隐式链接分配的稳定性较差系统在运行过程中由于软件或者硬件错误导致链表中的指针丢失或损坏会导致文件数据的丢失
显示链接
如果取出每个磁盘块的指针把它放在内存的一个表中就可以解决上述隐式链表的两个不足。那么这种实现方式是「显式链接」它指把用于链接文件各数据块的指针显式地存放在内存的一张链接表中该表在整个磁盘仅设置一张每个表项中存放链接指针指向下一个数据块号对于显式链接的工作方式我们举个例子文件 A 依次使用了磁盘块 4、7、2、10 和 12 文件 B 依次使用了磁盘块 6、3、11 和 14 。利用下图中的表可以从第 4 块开始顺着链走到最后找到文件 A 的全部磁盘块。同样从第 6 块开始顺着链走到最后也能够找出文件 B 的全部磁盘块。最后这两个链都以一个不属于有效磁盘编号的特殊标记如 -1 结束。内存中的这样一个表格称为文件分配表File Allocation TableFAT。
缺点是不适合大磁盘磁盘太大导致表太大
索引数据库
索引的实现是为每个文件创建一个「索引数据块」里面存放的是指向文件数据块的指针列表说白了就像书的目录一样要找哪个章节的内容看目录查就可以文件头需要包含指向「索引数据块」的指针这样就可以通过文件头知道索引数据块的位置再通过索引数据块里的索引信息找到对应的数据块创建文件时索引块的所有指针都设为空。当首次写入第 i 块时先从空闲空间中取得一个块再将其地址写到索引块的第 i 个条目
缺陷
就是存储索引带来的开销。 索引数据块如果空间不够可以使用索引链表
索引的方式优点
文件的创建、增大、缩小很方便不会有碎片的问题支持顺序读写和随机读写
多级索引 它是根据文件的大小存放的方式会有所变化 如果存放文件所需的数据块小于 10 块则采用直接查找的方式如果存放文件所需的数据块超过 10 块则采用一级间接索引方式如果前面两种方式都不够存放大文件则采用二级间接索引方式如果二级间接索引也不够存放大文件这采用三级间接索引方式 那么文件头Inode就需要包含 13 个指针 10 个指向数据块的指针 第 11 个指向索引块的指针 第 12 个指向二级索引块的指针 第 13 个指向三级索引块的指针 所以这种方式能很灵活地支持小文件和大文件的存放 对于小文件使用直接查找的方式可减少索引数据块的开销 对于大文件则以多级索引的方式来支持所以大文件在访问数据块时需要大量查询 这个方案就用在了 Linux Ext 2/3 文件系统里虽然解决大文件的存储但是对于大文件的访问需要大量的查询效率比较低。
比较 对空闲空间管理
空闲链表法
使用链表对空间进行管理每一个空闲块里有一个指针指向下一个空闲块这样也能很方便的找到空闲块并管理起来
位图法
位图是利用二进制的一位来表示磁盘中一个盘块的使用情况磁盘上所有的盘块都有一个二进制位与之对应。 当值为 0 时表示对应的盘块空闲值为 1 时表示对应的盘块已分配。它形式如下 1111110011111110001110110111111100111 … 在 Linux 文件系统就采用了位图的方式来管理空闲空间不仅用于数据空闲块的管理还用于 inode 空闲块的管理因为 inode 也是存储在磁盘的自然也要有对其管理。