文件系统总结

逻辑文件面向用户,学习时应该掌握不同的逻辑文件之间的特点

目录文件时链接逻辑文件和物理文件的桥梁,学习时应该体会到目录文件时如何优化访问时间

物理文件是指文件的数据如何存储在磁盘等存储设备上,主要内容就是分配方式,掌握不同的分配方式特点

逻辑文件

逻辑文件是对用户而言,包括顺序文件,直接(随机)文件,索引文件

顺序文件

顺序文件是最常用的文件

优缺点 记录 访问方式 占空间 读取所需数据 应用场景
优点存储空间小,缺点访问效率差 每条不等长 顺序访问 最小 最大 大文件,对记录批量存取

直接文件

直接文件记录定长,支持随机访问和顺序访问,访问时间短,访问需要读入的数据最小,但是占空间大

优缺点 记录 访问方式 占空间 读取所需数据 应用场景
优点访问效率高,却缺点浪费存储空间 每条记录所占空间等长 直接访问 最大 最小 需要直接访问,要求访问速度的

索引文件

索引文件是添加了索引表的顺序文件,用额外的空间来实现顺序文件随机访问

索引表是经常提到的名词,注意辨析到底是索引文件的索引表还是索引分配的索引表

优缺点 记录 访问方式 占空间 读取所需数据 应用场景
优点存储空间和访问效率适中,缺点是索引表可能占很大空间 每条不等长,但索引表记录等长 顺序访问,直接访问 适中 适中 存储空间不足又需要直接访问,追求访问速度

逻辑文件的访问要求

顺序访问:访问第i条记录的时候要读入i-1条记录(符合物理分配中的隐式链接分配)

直接(随机)访问:访问第i条记录的时候无需多读入其它记录

目录文件

目录文件是链接逻辑文件和物理文件的桥梁

FCB(file control block)

操作系统将文件的信息都存储在FCB中,FCB相当于一个文件的身份证,其中还有文件在磁盘中的存储地址。

文件目录的每一项都是文件目录项,在大多数系统中文件目录项就是FCB。由于FCB文件可能很大,所以操作系统把文件主要信息存放在索引结点中,索引结点在文件目录项中只保留指向索引结点的指针,这样做目录可以存放的项数变多

目录文件是指存储当前目录下的FCB的文件

一般查找当前目录下的某个文件,先查找文件目录,再根据里面的FCB得到文件在磁盘中的首地址,然后再访问磁盘。题目中都会提到FCB在内存/磁盘中,根据FCB不同有不同的解决方式

目录结构

指的是操作系统的目录结构

常见的目录结构有单级目录,二级目录,树形目录,无环图目录

文件路径

分为绝对路径和相对路径。

绝对路径是指从根目录到当前文件的路径

相对路径是指当前打开目录到当前文件的路径

假设当前目录有n个文件,一个文件目录项占一个物理块,则访问一个文件的平均读取物理块数是(n+1)/2

应用

如果想要降低访问文件造成的读取物理块数,有以下:

  1. 设置当前目录
  2. 使用索引结点
  3. 在内存中设置打开文件表,里面直接存放着打开文件的文件指针
  4. 把目录(FCB)常驻内存,如果某个目录常驻内存,指的是该目录下所有文件信息都常驻内存,例如A目录下有a,b,c,d,那么读入a~d都不用访问磁盘块!

物理文件

物理文件指的就是文件在磁盘等存储设备上以什么样的方式进行存储。

常见的分配方式有连续分配,链接分配(隐式,显示),索引分配,Unix inode分配

连续分配

把磁盘块连续的存放在磁盘中,此时的FCB结构是(文件名,首块地址,长度)。

这是分配方式中唯一要求连续的存储空间

  • 优点:支持随机访问,访问速度快,
  • 缺点:浪费空间,文件不能动态增长,不利于文件的插入和删除
  • 应用:一次性写入的文件,要求随机访问的文件

链接分配

隐式:将存放文件的物理块离散存储,每个物理块有指针指向它下一个物理块。此时FCB结构是(文件名,首块地址指针,尾块地址指针

  • 优点:提高磁盘利用率,可以动态扩充文件大小,便于文件的插入和删除
  • 缺点:无法实现随机访问,访问文件速度慢,可靠性差

显式:建立一张FAT表,此时FCB格式是(文件名,FAT中的起始块号)

  • 优点:优点同上,还支持了随机访问(这里的随机访问是指先查一次FAT,命中了可以直接访问物理块)
  • 缺点:不适合大容量磁盘,FAT表为了表示所有地址,可能占很大的空间

索引分配

类似于内存管理中的分页和分段管理,用索引表来管理指针

索引分配为每个文件分配一个单独的索引表,此时FAT格式是(文件名,索引表的地址)

访问时先查FCB再找索引表,根据题目描述有不同的解题方法

假设一级索引表的指针是4B(32位,能表示\(0到2^{32}-1\)大小的地址),假设一个物理块大小是4KB,则能存储210个指针,即指向210个物理块,那么一级索引表最大能表示的文件大小是4*2^10KB=4MB

为了突破这一限制,可以为一个文件引入多张索引表,多张索引表可以用首尾相连的指针链接起来(不常用),也可以用顶级索引表管理所有索引表

  • 优点:数据可以离散存放,更高的空间利用率
  • 缺点:索引指针占空间,无论如何都要分配存放索引表的索引块

这里经常考的是索引分配下的最多/最少I/O次数

一般来说最少的情况永远在i级索引表里面读入第1块物理块,然后根据地址读入即可总共i+1次读入

最多的情况是i级索引表里面最后一个物理块,然后再读入文件。

Unix inode

混合索引,弄明白链接分配就能弄懂这个

应用题

磁盘I/O类型

这里一般考的是对文件的某个位置进行插入,删除,增加要进行多少次IO

解题流程

文件系统设计题

给你具有一些特点的文件,要求你设计一个较好的文件系统,是难度较高的简答题,题目可以要求从文件目录,逻辑文件类型,文件分配方式等角度设计。在设计时应该从文件的大小,文件的访问要求访问速度的要求,I/O磁盘块次数等方面入手

从文件组织方式入手:

流式/结构

从逻辑文件入手

文件记录是否等长?是的话优先考虑直接文件(记录已经等长了,你用索引文件反而会增加文件所占空间),不是的话再往下看

题目是否对空间有要求?没有要求则考虑顺序文件(占空间大,但访问效率最高),有的话考虑索引文件(折中的解决方案,没有其它两种逻辑文件那么极端)

从文件访问方式入手:

如图所示:

有存在索引表的分配方式就能进行直接访问(读取索引表即可,然后直接访问目标物理块)

辨析出文件分配后,接着就从里面选择一个最好的分配方式,比如大中小文件搭配上不同的访问方式,有不同的答案。(个人觉得,小文件可以用连续分配,大中文件可以用索引/链接分配,或者inode分配)

再从文件的目录入手:

如何减少文件目录的访问时间,前面已经提到过了

根据字节和不同分配方式来计算I/O次数

如果文件给了字节大小,把物理地址转化成逻辑地址和偏移量进行访存,如果没给具体数字,那就分析极端情况

OS | 文件系统总结的更多相关文章

  1. [python]OS文件系统

    1.getcwdd() 获得应用程序当前的工作目录 #getcwd() 获取应用程序当前的工作目录 import os print(os.getcwd()) 2.chdir(path) 改变当前工作目 ...

  2. 将文件系统数据库迁移到ASM中

    使用裸设备配置ASM实例 http://www.cnblogs.com/myrunning/p/4270849.html 1.查看我们创建的磁盘组 [oracle@std ~]$ export ORA ...

  3. 分布式文件系统FastDFS详解

    上一篇文章<一次FastDFS并发问题的排查经历>介绍了一次生产排查并发问题的经历,可能有些人对FastDFS不是特别的了解,因此计划写几篇文章完整的介绍一下这个软件. 为什么要使用分布式 ...

  4. FastDFS 分布式文件系统部署实战及基本使用

    FastDFS 分布式文件系统部署实战及基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. FastDFS是一个开源的高性能分布式文件系统.它的主要功能包括:文件存储,文件同步 ...

  5. [linux]如何为Virtualbox虚拟硬盘扩容(转载)

    前言 这个教程介绍如何为Virtualbox虚拟硬盘扩容,虚拟硬盘分为动态分配大小和固定虚拟硬盘,扩容的方法不一样: 如何为动态分配的Virtualbox虚拟硬盘扩容 如何为固定大小的Virtualb ...

  6. 大熊君大话NodeJS之------Connect中间件模块(第一季)

    一,开篇分析 截止到今天来说,NodeJS系列文章已经有将近十篇了,让我们回顾一下: (1),大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底) (2),大 ...

  7. connect & express简介

    Node.js[5] connect & express简介 Node.js[4] 第一个模块 Node.js[3] 俯瞰API (整理中) Node.js[2] Hello Node Nod ...

  8. mysqld服务器如何查看使用变量的值

    你能用这个命令得到mysqld服务器缺省缓冲区大小: shell> mysqld --help 这个命令生成一张所有mysqld选项和可配置变量的表.输出包括缺省值并且看上去象这样一些东西: P ...

  9. MySQL中部分系统变量介绍

      have_symlink                             DISABLED                                   YES 用以支持在表定义中指 ...

  10. JAVA 编码机制

    先看例子: public class Test { public static void main(String[] args) { char han = '永'; System.out.printl ...

随机推荐

  1. JSX、TSX 整体理解

    可以少去理解一些不必要的概念,而多去思考为什么会有这样的东西,它解决了什么问题,或者它的运行机制是什么? JS JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web, ...

  2. 2021-09 .NET 5.0.10 Update for x64 Client (KB5006192) 安装失败,错误代码:0x80070643

    上周五日常检查系统更新(强迫症晚期) 出现一项更新:2021-09 .NET 5.0.10 Update for x64 Client (KB5006192) details: https://www ...

  3. 七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置

    前言 在上一章节我们在后端框架中引入 SQLite-net ORM 并封装常用方法(SQLiteHelper),今天我们的任务是设计好班级管理相关的表.完善后端班级管理相关接口并对Swagger自定义 ...

  4. [NOI online2022普及A] 王国比赛

    题目描述 智慧之王 Kri 统治着一座王国. 这天 Kri 决定举行一场比赛,来检验自己大臣的智慧. 比赛由 \(n\) 道判断题组成,有 \(m\) 位大臣参加.现在你已经知道了所有大臣的答题情况, ...

  5. [USACO2007NOVS] Best Cow Line S

    题目描述 Farmer John 打算带领 \(N\)(\(1 \leq N \leq 2\,000\))头奶牛参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者必须让他 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (156)-- 算法导论12.3 3题

    三.用go语言,对于给定的 n 个数的集合,可以通过先构造包含这些数据的一棵二叉搜索树(反复使用TREE-INSERT 逐个插入这些数),然后按中序遍历输出这些数的方法,来对它们排序.这个排序算法的最 ...

  7. 华企盾DSC导致Solidworks无法导出xls文件

    将Solidworks进程和Excel进程的OLE控制和启用虚拟重定向都关闭

  8. pytest框架学习-测试用例发现机制以及用例执行命令

    pytest是什么 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. Pytest安装 安装命令: ...

  9. linux中iptables防火墙相关命令

    https://www.cnblogs.com/seven1979/p/4173927.html https://blog.csdn.net/shenjianxz/article/details/62 ...

  10. Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类

    目录 MySQLDBHelper MSSQLDBHelper MySQLDBHelper app.config中添加配置 <connectionStrings> <add name= ...