当前位置: 首页 > news >正文

磁盘就是一个超大的Byte数组,操作系统是如何管理的?

磁盘在操作系统的维度看,就是一个“超大的Byte数组”。

那么操作系统是如何对这块“超大的Byte数组”做管理的呢?

我们知道在逻辑上,上帝说是用“文件”的概念来进行管理的。于是,便有了“文件系统”。那么,文件系统底层又是怎么设计的呢?下面我来说两句。

首先,我直接给一张架构图。
在这里插入图片描述
对磁盘进行管理,抽象上,是分为两步。

一、分区
将磁盘划分分区,其实就是把一个物理的硬盘划分为逻辑上几个虚拟的硬盘,称为分区。
每个分区上可以装有自己的文件系统。基本装电脑大家都不会陌生。这里可以理解为就是把那个“超大的byte数据分为一段一段分开管理”。

二、装文件系统
将其中的一段byte数组,按结构化格式为一个文件系统的数据存储结构。
从上面图中可以看到,他们把这段byte数组大体上分为4小段,每段提供一些作用,存储一些信息,目的就是可以利用这些存储空间来对磁盘自身来做管理。重点看i节点表数据块

每个文件对应i节点表中的一条记录,文件的内容被碎片化的存储到数据块中。碎片化,举一个具体的例子,比如说1KB的文件,分为两个小的数据块,一个512B,分别存储到数据块区域的两个不连续的位置。

那么最重点的实现,就是这个i节点表中的i节点的实现。因为这个实现决定了文件真正在磁盘中的样子。

在每个i节点里,又被分为了15个小段,其中

  • 第1段存储了文件一些基本信息。
  • 第2段到第12段,存了指针。这个指针指向上述说的数据块区域里面的一个数据块,这些就是文件的内容
  • 第12段,存了指针。这个指针指向上述说的数据块区域里面的一个数据块,注意,这个数据块中记录的还是指针,而数据块中的这些指针还是指向数据块区域里面的数据块,我们称为间接指针,通过这样的方式,我们可以记录的文件内容可以翻256倍(原来只能指向一个数据块,现在可以指向256个)。
  • 第13段,存了指针。但是是二重间接指针。原理同上,不说。
  • 第14段,三重间接指针

优雅的数据结构,具备了几个优点

  • 碎片化的存储文件数据
  • i节点结构固定,但是可以支持任意大小的文件
  • 可支持文件空洞。即文件中间几个数据块不存在数据
  • 最大支持4TB文件

综上,我们整体知道了操作系统大致是如何管理磁盘的,不得不说一个好的数据结构的伟大。
不仅如此,这个思想我认为还可以借鉴到我们实际的开发中,即对一个超大byte数组存储的管理,如Go中的对象数据管理等等,值得好好回味把玩。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • javascripr如何设计弹出输入框并在网页内输出输入内容
  • Golang语法规范和风格指南(一)——简单指南
  • 【折腾手机】一加6T刷机postmarketOS经历和体验
  • android iconfont带图标的图文并茂的一种实现
  • Node.js-path 模块
  • 智能与伦理:Kimi与学术道德的和谐共舞
  • 流批一体计算引擎-13-[Flink]RuntimeExecutionMode和水印策略Watermark Strategy
  • 直播预告|飞思实验室暑期公益培训7月10日正式开启,报名从速!
  • Vue的学习之数据与方法
  • githup开了代理push不上去
  • leetcode力扣_排序问题
  • Symfony框架:优雅构建PHP应用的强有力工具
  • FFmpeg视频处理工具安装使用
  • Docker学习笔记(二)镜像、容器、仓库相关命令操作
  • uni-app x 跨平台开发框架
  • [case10]使用RSQL实现端到端的动态查询
  • Apache Zeppelin在Apache Trafodion上的可视化
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Django 博客开发教程 16 - 统计文章阅读量
  • MySQL-事务管理(基础)
  • Octave 入门
  • oldjun 检测网站的经验
  • PV统计优化设计
  • React-flux杂记
  • SpringBoot几种定时任务的实现方式
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 关于Android全面屏虚拟导航栏的适配总结
  • #git 撤消对文件的更改
  • #ifdef 的技巧用法
  • #pragma once与条件编译
  • $NOIp2018$劝退记
  • (1)无线电失控保护(二)
  • (C语言)fgets与fputs函数详解
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)React组件、useState、组件样式
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转) Face-Resources
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)setTimeout 和 setInterval 的区别
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Reactor简单使用教程
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET中 MVC 工厂模式浅析
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @ResponseBody
  • @Transactional 详解
  • [ACM] hdu 1201 18岁生日
  • [AIGC] CompletableFuture的重要方法有哪些?
  • [Android]How to use FFmpeg to decode Android f...
  • [AX]AX2012开发新特性-禁止表或者表字段