操作系统:文件系统的实现

news2024/11/25 10:27:06

一、文件系统结构

磁盘的逻辑单元为块,内存和磁盘之间的I/O传输以块为单位执行。

磁盘的特点

  1. 1可以原地重写,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置
  2. 可以直接访问磁盘上的任意一块。因此,可以方便地按顺序或随机访问文件

文件系统需要提供高效快捷磁盘访问,以便轻松存储、定位、提取数据。即存储文件、访问文件

文件系统有两个不同的设计问题

  1. 访问问题:如何定义文件系统对用户的接口
  2. 存储问题:创建数据结构和算法,把逻辑文件系统映射到物理外存设备

文件系统本身通常由许多不同层组成。每层实际利用更低层功能,创建新的功能,以用于更高层的服务。

 设备驱动程序可以作为翻译器,他的输入作为高级指令,输出由底层的、硬件特定指令组成。

基础文件系统只需向适当设备驱动程序发送命令。

逻辑文件系统通过文件控制块维护文件结构。

文件控制块(FCB)包含有关文件的信息,包括所有者、权限、文件内容的位置等。

大多数操作系统支持多种不同的文件系统,举例:

  • CD-ROM ISO9660 文件格式
  • Unix 文件系统(Unix File System)
  • Windows文件系统:FAT(File Allocation Table),FAT32, FAT64,NTFS(Windows NT File System)
  • Linux 文件系统:可扩展文件系统(Extended file system),分布式文件系统(Distributed File System)

相关视频推荐

用spdk实现一个自己的文件系统(200行代码)

3个linux内核的秘密,让你彻底搞懂文件系统

剖析Linux内核虚拟文件系统(VFS)架构

免费学习地址:c/c++ linux服务器开发/后台架构师

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

二、文件系统实现

1.概述

在磁盘上,文件系统包括的信息有

  1. 如何启动存储在那里操作系统
  2. 总的块数
  3. 空闲块的数目和位置
  4. 目录结构
  5. 各个具体文件 等

上述许多结构会在之后详细讲述。这里简述如下:

  • 引导控制块(每个卷):可以包含从该卷引导操作系统的所需信息。如果磁盘不包括操作系统,则这块的内容为空。UFS称为引导块(boot block),NFS称为分区引导扇区(partition boot sector)
  • 卷控制块(每个卷):包括卷的详细信息(分区的块数、块的大小、空闲块的数量和指针、空闲
  • FCB 的数量和指针等)。UFS称为超级块儿(super block),NTFS主控文件表(master boot sector)
  • 每个文件的FCB包含该文件的许多详细信息。他有一个唯一的标识号,以便与目录条目相关联
  • 每个文件系统的目录结构用于组织文件

内存中的信息用于管理文件系统并通过缓存来提高性能,这些数据在安装文件装系统时被加载,在文件系统操作期间被更新,在卸载是被卸载。这些结构类型包括:

  1. 每个进程的打开文件表:包括一个指向系统的打开文件表中合适条目的指针和其他信息
  2. 整个系统的打开文件表:包括每个打开文件的FCB副本和其他信息

创建一个新文件

  1. 应用程序调用逻辑文件系统。逻辑文件系统指导目录结构的格式,它会分配一个新的FCB
  2. 系统将相应的目录信息读入内存
  3. 更新目录结构和FCB
  4. 将结果写回磁盘

一旦文件被创建,就能用于I/O,不过,首先他要被打开。系统调用open()将文件名传到逻辑文件系统,系统调用open():

  1. 首先搜索整个系统的打开文件表,查看是否已经被打开,如果是,则在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。
  2. 否则,根据文件名搜索目录结构
  3. 找到后,它的FCB会复制到内存的整个系统的开放文件表中(该表还存放着打开该文件的进程数量) ,接下来,在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。

Open() 返回值:文件描述符是一个非负整数。它是一进程打开文件表的索引值,指向系统范围内打开文件表相应条目

 

 

2.虚拟文件系统

操作系统如何才能将多个类型的文件系统集成到目录结构中?用户如何在访问文件系统空间时,可以无缝地在文件系统类型间迁移?大多数操作系统采用面向对象的技术来简化、组织、模块化实现。

数据结构和程序用于隔离基本的操作系统调用的功能与实现细节。因此,文件系统的实现有三个主要层构成。

第一层为文件系统接口。

第二层为虚拟文件系统(VFS),把文件系统的通用操作和具体实现分开,虚拟文件系统提供了在唯一标识一个文件的机制。VFS基于vnode 的文件表示结构,它包含了一个数值标识符来唯一表示网络上的一个文件。

  1. VFS能区分不同本地文件系统
  2. VFS能区分本地文件系统和远程文件系统

 

 

三、目录实现

1.线性列表

采用文件名称和数据块指针的线性列表

  • 优点:编程简单
  • 缺点:因为需要搜索,运行较为费时

2.哈希表

哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针

  • 优点:减少目录搜索时间
  • 缺点:两个文件名哈希到相同的位置时可能发生冲突;因哈希表固定大小,创建文件需要哈希表重建时,比较麻烦。

四、磁盘空间的分配方法

1.连续分配

每个文件在磁盘上占有一组连续的块。 文件的连续分配可以用文件第一块的磁盘地址和连续块的数量(即长度)来定义

 连续分配支持顺序访问和直接访问

问题:当文件需要扩展,文件大小变大时会无法扩展

解决:找更大的连续空间,复制过去

基于扩展的连续分配方案 用以下参数来定义文件

  1. 开始地址
  2. 块儿数
  3. 指向下一个扩展块儿的指针(扩展块儿可以是多个)

定义格式:

文件【开始地址,块儿数,指向下一个扩展块的指针】

2.链接分配

每个文件是磁盘块儿的链表,磁盘块分布在磁盘的任何地方,文件有起始块和结束块来定义

定义格式:【起始块,结束块】

同时,每个磁盘块都有指向下一个磁盘块的地址。

 优点:没有磁盘空间浪费

缺点:

  1. 不支持文件的直接访问
  2. 需要更多的磁盘空间(来记录指针)

链接分配的一个重要变种是文件分配表

每个卷的开始部分用于存储文件分配表(File Allocation Table),表中每个磁盘块都有一个FAT条目,并可通过块号索引。(未使用的块为0,使用的块包含下一个块儿号)

 目录条目含有文件首块号码,通过这个块号索引的FAT条目包含文件下一块的号码,这个链会继续下去,直到最后一块,最后一块的表条目值为文件结束值。

 

3.索引分配

通过将所有指针放在一起,即索引块

文件用索引块来定义, 每个文件有其索引块。

这里有一个问题,索引块应为多大? 

每个文件必须有一个索引块,因此索引块应尽可能小,然而不能太小,否则放不下足够多的指针,为处理这个问题,有如下一些机制:

  1. 链接方案:为了处理大文件,可以将多个索引块链接起来
  2. 多层次索引:用第一层索引块指向一组第二层的索引块,第二层索引块再指向文件块
  3. 组合方案:用于基于UNIX的文件系统,将索引块的前15个指针存储在文件的i-node中。其中,前12个指针指向直接块,剩下3个指针指向间接块

 

五、磁盘空闲空间的管理

1.位向量

空闲空间表实现为位图, 或位向量,每块用一位(bit)表示。1表示块空闲;0表示块已分配

2.链表

所有空闲块用链表链接起来,并将指向第一个空闲块儿的指针保存在特殊位置,同时缓存在内存。

每个块儿含有下一个块儿的指针

3.组

将n个空闲块的地址保存在第一个空闲块中。

这些空闲块中的前n-1个为空,而最后一块包含另外n个空闲块的地址。

比链表好的是空闲块的地址可以很快找到,而且可以明确一段连续空闲块空间

例:n=3

 

4.计数

基于以下事实:

通常有多个连续块需要同时分配或释放,尤其是在使用连续分配时。因此记录

  • 记录第一块的地址和紧跟第一块的连续的空闲块的数量。
  • 空闲空间表的每个条目包括磁盘地址和数量

例:

 

六、文件系统的性能和效率

磁盘空间的有效使用(效率),取决于

  • 磁盘分配和目录管理算法
  • 保留在文件目录条目中的数据类型

改善性能的方法:缓存

  1. 缓冲区缓存:一块独立内存,位于其中的块是马上需要使用的
  2. 页面缓存:将文件数据作为页而不是块来缓存。页面缓存使用虚拟内存技术,将文件数据作为页来缓存,比采用物理磁盘块来缓存更高效
  3. 板载高速缓存

 如果没有统一缓存,则会由下图情况发生:

 系统调用read()和write()会通过缓冲区缓存,然而,内存映射调用需要使用两个缓存,即页面缓存和缓冲区缓存。内存映射先从文件系统中读入磁盘块,并放入缓冲区缓存,由于虚拟内存系统没有缓冲区缓存接口,缓冲缓存内的文件必须复制到页面缓存中。

采用统一缓冲缓存

统一缓冲缓存:统一使用缓冲器缓存来缓存进程页和文件数据。

无论是缓存块还是页面都有置换问题,

文件的读入或写出一般是按顺序进行。所以,不适合采用LRU算法,因为最近使用的页面最后才会用甚至根本不会再用。

顺序访问可以通过马上释放和预先读取来加以优化

  1. 马上释放(free-behind):请求下一页时,马上释放上一页
  2. 预先读取(read-ahead):请求页之后的下一个页也一起读入

七、文件系统的恢复

目录信息一般事先保存在内存中以加快访问,有时会导致目录结构中的数据和磁盘块中的数据不一致。

解决:

  1. 一致性检查:比较目录结构中的数据和磁盘块中的数据,尝试着去修正不一致
  2. 备份&恢复: I. 备份(backup):利用系统程序来备份数据到其他的存储设备。软盘,磁带 II. 恢复(recovery):通过从备份来恢复丢失的文件或磁盘

基于日志结构的文件系统

  • 文件创建涉及到目录结构修改,FCB分配,数据块分配等
  • 所有元数据(meta data)的变化写入日志上,一旦这些修改写到日志,就认为已经提交了。
  • 提交了的事务,并不一定马上完成操作
  • 当整个提交的事务已经完成时,就从日志中删除事务条目
  • 如果系统崩溃,日志文件可能还存在事务,它包含的任何事务虽然已经由操作系统提交了,但还没有完成到文件系统,必须重新执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析SCSI协议(2)命令模型

SCSI命令模型 SCSI协议对链路传输没有进行严格的限制,但约束了SCSI的命令模型。协议允许使用SAS、FC以及以太网等不同的链路实现,但对所有的SCSI传输层实现而言,都必须遵循统一的SCSI命令模型。SCSI命令模型约束了SCSI命令执行过程、命令请求…

《底层逻辑:看清这个世界的底牌》读后感

书名《底层逻辑:看清这个世界的底牌》作者刘润简介如果只教给你各行各业的“干货”(方法论),那只是“授人以鱼”,一旦环境出现任何变化,“干货”就不再适用。但如果教给你的是底层逻辑,那就是“…

初入测试如何编写测试用例?从3个方面带你写一个合格的测试用例

前言 作为一个测试新人,刚开始接触测试,对于怎么写测试用例很头疼,无法接触需求,只能根据站在用户的角度去做测试,但是这样情况会导致不能全方位的测试APP,这种情况就需要一份测试用例了,但是不…

亿级高并发电商项目-- 实战篇 --万达商城项目 七(品牌模块、商品类型模块等开发)

专栏:高并发---分布式 在管理商品时,除了商品名、价格、商品介绍等基本参数外。还需 要给商品添加品牌、商品类型、商品规格等参数。比如Iphone13的 品牌是苹果。商品类型属于手机通讯>手机>手机。规格有机身颜色: 星光色、版本:128G。品牌、商品…

暗网与深网:5 个主要区别

在互联网上,深网不会被网络爬虫索引,而暗网是故意隐藏的。 文章目录前言一、暗网与深网二、什么是暗网?什么是深网?暗网和深网之间的 5 个主要区别1. 范围和操作暗网深网2. 尺寸暗网:深网:3. 访问暗网深网4…

数据的分组聚合

1:分组 t.groupby #coding:utf-8 import pandas as pd import numpy as np file_path./starbucks_store_worldwide.csv dfpd.read_csv(file_path) #print(df.head(1)) #print(df.info()) groupeddf.groupby(byCountry) print(grouped) #DataFrameGroupBy #可以遍历…

1.2配置OSPF包文分析和验证

1.2.2实验2:配置OSPF包文分析和验证 [1] 实验目的通过抓包分析OSPF的包文实现OSPF区域认证的配置实验拓扑实验拓扑图如图1-3所示。 图1-3 配置OSPF包文分析和验证 实验步骤 IP地址的配置、运行OSPF的步骤与实验1相同,此处略。[2] 在R1的g0/0/0抓包

Redis 集群搭建及集群管理工具

目录一、简介二、架构图三、搭建集群3.1、下载3.2、编译安装3.3、配置文件修改3.4、创建集群四、集群管理工具redis-cli4.1、查看集群信息4.2、检查集群4.3、修复槽错误4.4、重分片4.5、负载均衡4.6、添加节点4.7、删除节点4.8、设置超时4.9、导入数据4.10、重建集群一、简介 本…

【JavaWeb】网络编程概念 + Socket套接字 + UDP/TCP编程

目录 网络编程基础概念 发送端与接受端 请求与响应 客户端与服务器 常见的客户端服务器模型 Socket套接字 回显(echo)程序 UDP版的回显程序 服务器代码 客户端代码 结果 TCP版的回显程序 服务器代码 客户端代码 结果 网络编程基础概念 网络编程,指网…

2.5|物联网应用系统设计|复习提纲|提问背诵

基础概念总结掌握Linux常用的基本命令功能、语法结构,用法等。具体命令参考实验指导书、相关PPT等资料内容。什么是操作系统(OS)?操作系统是用以控制和管理计算机系统资源,方便用户使用的程序和数据结构的集合。在所有…

零基础学习Python的一点建议

Python语言的火爆程度,真的是超过了任何一门计算机语言,当然火爆程度里面含有赶上了人工智能这个领域的风口,但是大部分的原因是Python易学,语法对小白非常友好,总结一句话,Python语言能做很多事情&#xf…

亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块)

专栏:高并发---前后端分布式 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信…

使用nvm管理node

nvm介紹 node的版本管理器,可以方便地安装&切换不同版本的node 我们在工作中,可以会有老版本的node的项目需要维护,也可能有新版本的node的项目需要开发,如果只有一个node版本的话将会很麻烦,nvm可以解决我们的难点…

node 拉取github开源漏洞

我们可以通过github的open api 来拉取一些信息。这里主要是拉取 github 开源漏洞中的漏洞信息 Github Explorer github Explorer 是一个在线工具,登录之后,我们可以在左侧输入GraphQL 查询语句,之后就可以查询相关的信息。例如:…

B树和B+树,红黑树作为索引的区别

索引是一种数据结构,帮助我们在mysql表中更高效获取数据的数据结构 常用作为索引的数据结构:二叉树,红黑树,Hash表,B树,B树 下面的数据表中有两个字段,第一个字段是col1,第二个字段…

如何在Qt中设置背景图片,且不覆盖其它控件

正常情况,我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况,比如下面操作: 首先右击空白处,点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀,也就是我们…

使用 Three.js 后处理的粗略铅笔画效果

本文使用Three.js的后处理创建粗略的铅笔画效果。我们将完成创建自定义后处理渲染通道、在 WebGL中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。翻译自Codrops,有改动。 Three.js 中的后处理 Three.js中的后处理是一…

1.9 实践项目——爬取学生信息

1. 项目简介设计一个 Web 服务器 server.py,它读取 students.txt 文件中的学生数据,以表格的形式呈现在网页上,其中 students.txt 的格式如下:No,Name,Gender,Age1001,张三,男,201002,李四,女,191003,王五,男,21设计一个客户端的爬…

【Junit5】就这篇,带你从入门到进阶

目录 前言 1.前置工作 2、注解 2、断言(Assertions类) 2.1、断言 匹配/不匹配 2.2、断言结果 为真/为假 2.3、断言结果 为空/不为空 3、用例的执行顺序 3.1、用例执行顺序是怎样的? 3.2、通过order注解来排序 4、参数化 4.1、单…

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接:https://sysin.org/blog/chrome-firefox-download/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 天下只剩三种(主流&am…