文件系统总结

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

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

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

逻辑文件

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

顺序文件

顺序文件是最常用的文件

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

直接文件

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

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

索引文件

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

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

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

逻辑文件的访问要求

顺序访问:访问第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. CSS 尺寸单位概述

    在本文中,我们将探讨 CSS 尺寸单位的四大类别.我们将了解这些尺寸单位的用途.它们的最佳工作原理,以及如何在每种情况下选择最佳尺寸单位,从而在各种媒体和设备尺寸下优化我们的布局. 关于 CSS 尺寸 ...

  2. 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 数据库

    C++ 是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库.以下是一些示例代码,演示如何使用 C++ 连接 SQL Server.MySQL.Oracle.ACCESS.SQLite 和 ...

  3. 【web实验报告】实验二

    一.实验目的 通过一个小型网站的开发,掌握JSP基础知识,加深对session,request,response,cookie等对象的理解,掌握其使用方法,进一步深入掌握HTML.CSS和JavaSc ...

  4. 大白话说Python+Flask入门(六)Flask SQLAlchemy操作mysql数据库

    写在前面 这篇文章被搁置真的太久了,不知不觉拖到了周三了,当然,也算跟falsk系列说再见的时候,真没什么好神秘的,就是个数据库操作,就大家都知道的CRUD吧. Flask SQLAlchemy的使用 ...

  5. C++ 邮件槽ShellCode跨进程传输

    在计算机安全领域,进程间通信(IPC)一直是一个备受关注的话题.在本文中,我们将探讨如何使用Windows邮件槽(Mailslot)实现ShellCode的跨进程传输.邮件槽提供了一种简单而有效的单向 ...

  6. MCube动态化与原生工程结合最佳实践

    跨端动态化开发方案重要性日益凸显,本文对我们团队MCube动态化实践做了总结,为大家提供经验和借鉴. 接入背景 随着我们工程的需求迭代,暴露出了业务需求量大,分端开发和发版更新成本高等痛点,使用H5页 ...

  7. RV1126 分区教程

    一.前言 期初我是想弄一个分区存放自己的 APP 程序,如果需要更改应用的时候,只需要烧写独立的分区即可,就不需要重新烧写 rootfs.这是一个简单的操作,为啥还需要记录了,因为我在里面遇到了一些坑 ...

  8. Intellij IDE 对接SVN

    1.安装SVN(SVN安装包见附件) 注意安装时需要选择第二个选项进行安装 2.安装SVN中文包(见附件) 安装完成后随便找个文件夹右键确认SVN安装是否生效 3.Intellij IDE得Setti ...

  9. 网安区过年-Log4j2

    Log4j2-2021 漏洞原理 Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛.在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通 ...

  10. JavaImprove--Lesson04--LocalDateTime,ZoneId,Instant,DateTimeFormatter

    一.LocalDateTime LocalDateTime是JDK8的新时间特性,它解决了Date类和Calender类的很多不足,如使用不方便,线程不安全,以及获取时间戳只能拿到毫秒而不能拿到纳秒等 ...