操作系统:浅谈文件系统

目录

1.理解文件系统

1.1.从磁盘开始的抽象存储结构

​编辑

1.2.操作系统下的文件管理

1.2.1.知识储备

1.2.2.存储文件的属性

1.2.3.存储文件的内容

1.2.4.如何新建文件

1.2.5.如何理解目录 

1.2.6.如何找到某一个文件

1.3.操作系统如何打开文件 

2.软硬链接


我们知道文件可以分为:已被打开文件(被进程加载) 和 未被打开文件(在磁盘中保存)这两种文件,而我们对文件的学习也不能只局限于 对被进程打开的文件,因为大部分文件都不是被打开的,而是在磁盘中。这就引申到了操作系统是如何管理未被打开文件,并如何将他们从磁盘中加载到内存,并被进程调用的呢?这就是我们接下来要讲的文件系统的知识了

1.理解文件系统

我们知道文件未被打开时是存储在磁盘这个硬件中,当我们研究文件在磁盘中存储的问题,再结合操作系统的本质就是不断地抽象出数据结构,再连接这些结构。我们学习的核心就是了解操作系统是如何在磁盘中对文件进行增删查改的!

1.1.从磁盘开始的抽象存储结构

如图为磁盘的物理结构和俯视图

从这里我们能够知道:

  • 磁盘俯视来看就是一个圆,而这个圆中会截取一定宽度的圆环称为一个磁道,而这个磁道再均分成一块一块的扇区
  • 磁盘存储时是以“块”为单位的(从扇区体现),扇区是磁盘进行IO读写的最小基本单元,一般是512字节
  • 对于磁盘来说,通过转换“南北极”来实现数据0,1的写入

接着我们来谈谈磁盘是如何定位数据到文件的呢

这里我们就知道了,后续操作系统进行软硬件连接时需要考虑CHS这三个数据!!!

值得说的是:我们通过读写 磁头的编号 就能找到对应的磁盘,再通过 磁头的位置 找到磁道,再结合 磁盘转到的位置 我们就能够定位到任何一个扇区

讲完宏观的结构,接下来我们抽象出一段圆环

接着我们对于这个块的研究等价于对这个圆环(磁盘的一段磁道,若干个扇区)的研究,同时这个抽象图又和我们平常使用的数组这个结构十分类似,那么最终对磁盘的研究就可以从数组这个数据结构作为载体出发了。

做一道数学题

这个也就是CHS定位法的核心,这样子我们通过计算就验证了可以通过数组这个结构在磁盘中抽象出这么一个文件存储的载体。有兴趣可以写一下这个查找程序,so easy的

1.2.操作系统下的文件管理

1.2.1.知识储备

操作系统按照扇区为单位进行存取,也可以基于文件系统按照文件块为单位进行存取,因为一个扇区的大小为512个字节,由于大小依然很小,可能会存在多次的IO调用,浪费系统资源,实际上操作系统定义一个文件块为8个扇区,大小为4096字节,略大于4kb(后面我们统一认为大小为4kb)

实际使用时,我们通过LBA转化成CHS地址,进而定位写入磁盘,在底层对磁盘的写入,变成了在操作系统层面上对一个一个 文件块 的数组的增删查改

注意:磁盘中一个块对应一个扇区,操作系统中一个文件块对应8个扇区 


介绍完了一些基本知识,我们来看看操作系统是如何进行文件管理的!!!

如图:操作系统为了便于管理,在自己内部将对应磁盘大小分为若干个区,再把区划分为组,加下来通过抽象组这个载体来管理文件块这个基本单位。

接下来我们开始学习如何进行 块组 的管理!

先介绍一下概念

  • Boot Block:启动块,作为分区的头,包含磁盘的信息,和操作系统的启动信息
  • Block group:作为管理文件块的载体

  • Super Block:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了

不一定每个块组都有,一般是若干个块组共用一个,管理整个分区,作为操作系统对分区的管理描述的结构体对象,一个分区多个保存防止系统丢失数据


  • inode Table:存放文件属性 如 文件大小,所有者,最近修改时间等

实际上就是存放inode的结构体数组

  • inode Bitmap:每个bit表示一个inode编号是否空闲可用。

用比特位的0、1表示某一个inode编号是否被使用,一个文件块4096字节,而存放32000个inode编号的一个位图大小4KB(4000字节),所以一个文件块能通过位图表示inode编号。

  • Block Bitmap:记录Data Block中哪个数据块已经被占用,哪个数据块没 有被占用

  • Group Descriptor Table:块组描述符,描述块组属性信息,管理一个块组
  • Data Block:存放文件内容

我们知道 文件 = 内容 + 属性,在我们写入文件内容前,需要先写入文件管理数据给磁盘,例如磁盘进行分区后,需要记录这个分区的相关数据再进行文件的内容的写入。也就是块组的引入本质上是为了解决文件内容和属性存储问题。

文件的内容和属性一般是分开存储的,存在块组的不同区域


1.2.2.存储文件的属性

往Linux系统中输入指令 ls -li 我们发现 最前面会有一个数字,这个数字叫做 inode 编号

  • 一般情况下,一个文件只有一个inode,基本上每个文件都有一个inode。
  • 在不同的分区中,inode的数据是唯一的,识别文件只与inode有关
  • inode是用来保存文件的属性,本质上是一个结构体
  • inode中存储的文件属性的种类是固定的

 注意inode不等于inode编号,并且大小固定为128字节

struct inode
{
    // 文件大小 权限 拥有者...

    // inode编号
    // Block block[15]
}

在inode Table中,inode编号便于通过相对位置来找到文件,本质上就是一个存储inode的数据结构

struct inode inode_table[N]    // 可以视为inode结构体数组

1.2.3.存储文件的内容

Data Block是一个以4KB为单位的一块巨大的文件内容存储区,存放整个块组所有文件的内容,在这个区域中我们也是通过编号来进行访问的。存储规则是:通过Block Bitmap查找哪一个数据块没有被占用,然后存储数据进去,接着通过inode结构体中的block数组中存放索引下标(映射),并向这些数组中存放文件内容。

实际操作系统中,0-12下标的数据块是直接映射进数据库保存文件的内容,13间接映射,里面保存更多的 块列表 来进行二次索引,三次索引.......这样实现大文件存放在若干个4KB中保存 

当一个文件特别大时,会在多个块组中存储,实现跨组访问,inode编号在分区里不变即可

1.2.4.如何新建文件

核心就是查询两个位图,找到两个数据,进而实现文件的搭建

  • 先查inode Bitmap查询位图,找到最近的一个没有被使用的比特位由0置为1,然后查询遍历位图时的偏移量,加载进inode,设置文件属性和编号
  • 接着从block Bitmap里面找到一个位置,同理0置为1,记录偏移量,然后从inode中的Block block找到对应的block然后写入文件的内容

那我们如何删除呢?

我们在新建文件时,就已经知道文件的inode编号,我们可以找到对应的位图中的比特位,由1改为0,同理把占用的块也由1置0,未被释放的资源后续可能被其他文件覆盖。

1.2.5.如何理解目录 

实际使用计算机时,面向用户的是文件名而不是inode,也就是inode是实现内核与文件的映射,又因为Linux中一切皆文件。那么我们知道 目录 本质上也是文件,也有自己的inode结构体,那么目录的块存放的数据是什么呢?

目录的块中存放着 文件名 和 inode的映射关系(k-v关系),也就是我们通过文件名可以找到目录下文件的inode进而连接整个文件管理体系,所以同一个目录下不允许存在同名文件。又inode在该分区中独一无二,所以文件名和inode互为k-v关系。

讲到这里,顺便提一下:文件名不是inode结构体的内容,而是目录的内容。

1.2.6.如何找到某一个文件

  1. 找到文件的上一级目录,在通过访问文件的block存储的数据找到文件名和inode的映射关系这样就能找到 inode和inode编号
  2. 接着通过inode编号找到哪个组,进而访问到哪个块,然后获取文件的属性、内容

那么如何找到上一级的目录呢(也就是找到他的inode)?那上一级的目录的目录如何找到呢?也就是回归到 我们需要找到根目录的inode。找到文件需要从根目录开始逐层查找到该文件的上一级文件。查找时我们也是借助进程,那么就会有cwd,进行会记录当前的路径


关于查找不同分区下的文件,因为Linux在进行磁盘格式化分区后,会进行挂载,并且可以通过文件的路径来找到挂载对应的分区,也就是我们可以通过文件路径来确定在哪个分区。

1.3.操作系统如何打开文件 

  • 未被打开前,文件存在于磁盘,打开时,操作系统创建进程来打开这个文件
  • 进程拥有自己的cwd通过路径来定位在磁盘的哪一个分区,接着顺着路径向下找
  • 找到创建inode结构体,实现了文件属性的写入
  • 接着通过inode编号找到Data Block,就可以写入文件的内容
  • 将缓冲区的内容拷贝进文件的对应Block block数组对应的数据块

2.软硬链接

建立软连接的指令

ln -s 待链接文件名 软连接文件名
// 例如
ln -s log.txt log.sort.link

创建软连接时,log.sort.link具有自己的inode,也就是创建的软连接是一个新文件 

建立硬链接的指令

ln 待链接文件名 硬链接文件名
// 例如
ln file.txt file.hard.link

file.hard.link没有自己的inode(和源文件一致),也就是硬链接不是独立的文件

 我们可以通过 ls -li查看inode、权限、硬链接数、拥有者....... 

注意:可以给目录建立软连接,不允许给目录建立硬链接。

 


软连接

在Windows中软连接的体现就是:文件的快捷方式,软连接的本质就是指向源文件的一个副本文件。

软连接形成一个副本文件便于用户使用,也防止对源文件进行非法的操作


硬链接

硬链接不是一个独立的文件,本质是指定目录内部的一组关于 文件名 和 inode 的映射关系!

我们知道文件被删除的本质:没有了当前文件名和inode的映射关系,在文件系统层面,inode结构体中定义了一个引用计数变量,标明有几个文件名的映射关系,也就是有几个硬链接

当我们分别创建一个新文件和新的目录时我们发现,硬链接数分别为1和2,因为普通文件只有一组文件名和inode的映射关系,目录文件有两组映射关系。

因为我们创建目录时,目录内会自动创建两个文件 . 和 .. 文件,其中 . 文件为指向这个目录的映射,而目录名本身跟自己的inode也有一组映射关系,所以是两个,那么假如我们在这个目录下在创建一个目录后原目录下的硬链接数变为几了呢?(可以通过ls -lia指令查看)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外贸技巧:热衷开发却不精于追踪!这个误区害惨了外贸人...

很多外贸业务员热衷于开发客户,可对于后续的追踪却不能给予足够的重视。结果是开发的很辛苦,但后期却屡屡因为跟踪不积极,造成订单机会莫名其妙的就悄悄溜走了。 俗话说的好,一鸟在手胜过二鸟在林,而外贸业务员也需要…

Matlab进阶绘图第48期—带等高线的三维特征渲染散点图

带等高线的三维特征渲染散点图是等高线图与特征渲染三维散点图的组合。 其中,等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于等高线图无遮挡但不直观,特征渲染的三维散点图直观但有遮挡,而将二者组合,可以实现…

风险与收益

风险与收益 影响资产需求的主要因素财富总量预期收益率资产的流动性影响流动性的主要因素 风险 如何降低风险系统风险和非系统风险机会集合与有效集合资产组合理论 影响资产需求的主要因素 影响资产需求的主要因素包括:财富总量、预期收益率、资产的流动性和风险。…

免费SSL证书怎么申请?

在数字化时代,网络安全已成为企业与个人无法忽视的重要议题。其中,SSL(Secure Sockets Layer)证书作为保障在线信息传输安全的关键工具,已广泛应用于各类网站。更令人欣喜的是,如今市场上存在众多免费SSL证…

DOTS:Burst

目录 一:简介 1.1 Getting started 1.2 C# language support 1.2.1 HPC# overview 1.2.1.1 Exception expressions 1.2.1.2 Foreach and While 1.2.1.3 Unsupported C# features in HPC# 1.2.2 Static read-only fields and static constructor support 1.…

【Linux】查看某个进程的tcp全连接队列长度

TCP三次握手成功后,会把连接放到全连接队列里,等待服务器端accept后移除。 如下图所示,图片转自:https://zhuanlan.zhihu.com/p/547279481 下图转自博客:https://zhuanlan.zhihu.com/p/340016138 TCP三次握手过程中,第一次握手server收到client的syn后,内核会把该连接存…

多功能知识付费源码下载-实现流量互导多渠道变现(带详细安装教程)

资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线…

缺陷检测项目 | 基于深度学习的钢管焊缝缺陷检测

项目应用场景 面向钢管焊缝缺陷检测场景,使用深度学习算法来实现,提供钢管焊缝缺陷检测数据集,数据集已经标注整理好,包括 YOLO 和 PASCAL VOC 数据格式,项目检出效果好。 训练数据集展示 项目效果 项目细节 > 具体…

oracle19c安装-aarch64

建议 参考oracle官方文档提供的软硬件要求 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-checklist-for-oracle-database-installation-on-linux.html#GUID-E5C0A90E-7750-45D9-A8BC-C7319ED934F0 建议使用OracleLinux8.6及以上操作…

一个页面实现两个滚动条【前端】

一个页面实现两个滚动条【前端】 前言版权推荐一个页面实现两个滚动条最后 前言 2024-4-2 12:54:46 以下内容源自《【前端】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net …

TIA博途V17开启仿真后软件卡顿的解决办法

TIA博途V17开启仿真后软件卡顿的解决办法 如下图所示,打开TIA博途V17软件,同时打开任务管理器,监控CPU和内存的使用情况,由于我的内存是32G的,而且没有打开其他的任何软件,所以这里可以暂时不考虑内存的影响, 如下图所示,我们在性能中选中CPU,右键选择“将图形更改为—…

电脑常见故障检测方法与对应问题分析说明

电脑常见故障检测方法与对应问题分析说明 前言说明1、机器无法开机故障2、屏幕无法显示3、无法联网4、能开机但是无法进入系统,提示not boot5、USB接口无法识别U盘 前言说明 本文为小白向,许多内容属于经验学而非科学,还望大佬们轻喷。 如上…

快速入门Linux,Linux岗位有哪些?(一)

文章目录 Linux与Linux运维操作系统?操作系统图解 认识LinuxLinux受欢迎的原因什么是Linux运维Linux运维岗位Linux运维岗位职责Linux运维架构师岗位职责Linux运维职业发展路线计算机硬件分类运维人员的三大核心职责 运维人员工作(服务器)什么…

网页录制视频技巧大揭秘,让你快速成为录制高手

在信息化快速发展的今天,网页录制视频已经成为一种常见的信息获取、传播和保存方式。无论是在线教育、会议记录还是产品展示,视频录制都能以直观生动的方式传达信息。本文将详细介绍三种常见的网页录制视频方法,通过分步骤详细讲解&#xff0…

键盘输入与屏幕输出——getchar()之深入分析

使用getchar()输入字符时的怪象 以回车符 \n 结束字符的输入 输入的字符(包括回车符)都放在输入缓冲区中 怪象背后的原因 行缓冲(Line-buffer)输入方式 *将输入字符先放入输入缓冲队列中,再…

25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。 t1线程获得A对象锁,接下来想获取B对象的锁。 t2线程获得B对象锁,接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

递归遍历目录结构和树状展现

在D盘下创建文件夹“电影”,在文件夹“电影”下创建“华语”、“好莱坞”,在文件夹“华语”下创建文件“人民的名义.mp4”、“天安门传奇.mp4”、“程序员统治世界.mp4”,在文件夹“好莱坞”下创建文件“国王的演讲.mp4”、“速度与激情8.mp4…

QUndoCommand的使用

目录 引言基本实现主要组成命令(QUndoCommand)命令栈(QUndoStack) 优化技巧组合命令合并命令 完整代码 引言 实现撤销重做(Undo/Redo)是编辑器的必备功能,诸如文本编辑器、电子表格、图像编辑器…

Nginx 日志输出配置json格式

nginx日志输出配置json格式 nginx服务器日志相关指令主要有两条: (1) 一条是log_format,用来设置日志格式 (2) 另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。 log_format指令用来设置日志的记录格式,它的语…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日,Go语言正式成为开源编程语言家庭的一员。 Go语言(或称Golang)是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率,Go语言专门针对多处理器系统应用程序的编…