Linux基础IO【文件系统】

 

目录

1.磁盘文件

2.磁盘概念

2.1基本结构

2.2数据存储 

3磁盘信息

3.1块组信息 

4.文件操作 

4.1文件创建 

4.2文件访问

4.3对文件增删查改

4.4大文件存储 

 总结:



1.磁盘文件

在计算机中,没有被打开的文件都是静静的躺在外存(磁盘)中,当需要对文件进行操作时,会通过 inode对文件进行访问 

通过以下指令查看当前目录中文件的详细信息及 inode 值

ll -i

 如同 pid 与进程的唯一对应性一样,inode 与文件也是唯一对应的(未被硬链接的情况下),可以通过 inode 访问文件在磁盘中的详细信息

2.磁盘概念

 现在市面上的磁盘主要分为 机械硬盘 和 固态硬盘,前者读取速度慢,但便宜、稳定;后者读取速度快,但价格高昂且数据易损,两者各有其应用场景,本文主要介绍的是 机械硬盘

2.1基本结构

 

机械硬盘 的结构主要包括以下几种:

  • 盘片:一片两面,每一面都可以存储数据,有一摞盘片
  • 磁头:一面配备一个磁头,专门用于读取盘面中的数据
  • 主轴:用于控制整块盘的转动
  • 音圈马达:控制磁头的进退
  • 磁头臂:链接磁头与音圈马达
  • 伺服电路板:控制读取数据的流向及各种结构的运行

 

2.2数据存储 

 数据是以 0 和 1 的方式进行存储的,常见的存储介质有:强信号与弱信号高电平与低电平波峰与波谷南极与北极 等,而盘面上比较适合的是 南极与北极

机械硬盘 不能在其运行时随意移动,因为角度的偏转也有可能导致发生摩擦,造成数据丢失,更不能用力拍打 机械硬盘

 

在盘面设计上,一个盘面被切割若干个扇区,单个扇区大小为 512 字节(或者 4 kb),这些扇区用来存储数据,同一半径中的所有扇区组成扇面;而半径相同的扇区组成磁道(柱面)

我们可以先根据磁头(head)确定盘面,再根据半径定位磁道(柱面 cylinder),最后根据块号确定扇区(sector)

这种寻址方法称为 CHS 定位法,是机械设备查找具体扇区时的方法

 

虽然 CHS 定位法很妙,但它太依赖于具体硬件信息了,假设其中的硬件参数有所不同,那么 OS 就得使用另一套 CHS 定位法,于是为了做到 解耦OS 使用的并非 CHS 定位法进行文件定位,而是采用 LBA 逻辑地址块进行寻址

将磁道拉长,会得到一串线性空间(数组),其中的每个单位(扇区)为 512 字节(或者 4 kb

 

现在 OS 想访问具体的扇区时,只需通过 起始扇区的地址 + 偏移量 就可以获取 LBA 地址,然后通过特定手段转为 CHS 地址,交给外设进行访问即可 LBA和CHS转换

 

因此对于外设中文件的管理,经过 先描述,再组织 后,变成了对数组的管理,这个数据就是 task_struct 中的 struct block

最后我们就能理解为什么 IO 的基本单位是 4 kb 了,因为直接读取一个数据块(4 kb),这样可以提高 IO 效率(内存对齐)即使造成内存浪费也只会有最后一个内存浪费

3磁盘信息

系统在分区后,需要对区块进行格式化 

 

不同的文件系统在格式化时写入的数据是不同的,这里讨论的是 EXT 文件系统

  • 磁盘分区后,分组、填写系统属性是 OS 做的事

  • 为了使分区能被正常使用,需要对分区进行格式化

  • 分区格式化:OS 向分区写入文件系统的管理属性信息

  • 在具体分区内,还可以细分为 块组

 由 块组 构成的线性空间亦可称为 组线 (代表一个 分区

struct part
{struct part group[100];	//分为100个块组int lba_start;	//起始与结束位置int lba_end;//……
}

 

将现有资源再分配后,可以 最大化利用资源,避免造成浪费及拖慢效率

块组(Block Group)是本文的重点内容

3.1块组信息 

 块组 是由 分区 细分出的产物,它与分区的关系如图所示:

 

其中, Boot Block 是 启动块,大小固定为 1 kb,在每一条 组线 前都有此 块组,它用来 存储分区信息和系统启动,属于被保护的内容,不允许用户私自修改

至于其他 块组,它们有着统一的格式,具体内容如图所示:

 

其中一个文件对应一个 inode,而 inode 中存储了该文件的所有属性,包括所使用的数组块信息,因为文件很多,所以需要 先描述,再组织,即通过 inode Table 对 inode 进行管理 

 

注意:

  • inode 属性中并不包含文件名,文件名只是给用户用的
  • 目录文件也有 inode,目录中的数据块保存的是该目录下的 文件名 和 inode 编号对应的映射关系,而且在此目录内,文件名和 inode 互为 key 值
  • inode 确定分组,inode 值只在一个分区内有效,不能跨分区

 


4.文件操作 

4.1文件创建 

创建一个文件的步骤如下:

  1. 申请一个空闲的 inode,将文件信息记录至 inode 属性中
  2. 寻找空闲的数据块(Data block),将数据块信息填入 inode 中的磁盘分布区
  3. 添加文件名至当前目录文件的 Data block 中,同时将文件名和 inode 之中的属性链接起来

 注意: 每使用一个 inode 和一个 Data block,需要把它们对应位图中的信息改为已占用

4.2文件访问

 

文件创建后,如何根据 inode 访问文件呢?

  • 找到文件的 inode 编号,在目录分组中查找
  • 通过 inode 和 Data block 的映射关系,找到文件的数据块,并加载至内存中

这也就解释了为什么在 file 对象中会存在 inode 信息,因为它与 fd 一样重要

4.3对文件增删查改

 

文件创建后,如何删除?删除并不是真删除,而是将 inode Bitmap Block Bitmap 中位图信息进行修改即可(只要访问不到,就是删除)

根据文件名找到 inode 编号

再根据 inode 属性中的映射关系,设置 Block Bitmap 对应的比特位,设置为 0 (删内容)

最后根据 inode 编号设置 inode Bitmap 中对应的比特位为 0 (删属性)

将位图信息置为 0 后,创建新文件时,系统可以直接使用

至于文件的查找与修改,通过 inode 修改其内部属性即可

注意: inode 和 Data blcok 可能存在失衡的情况

一直创建空文件,导致 inode 满载,而 Data block 空余很多
不断往同一个文件中写入数据,导致 Data block 被占用,后续创建文件时,inode 无法再分配到 Data block

4.4大文件存储 

 

单个数据块大小有限(4 kb),如何做到一个数据块存储大量数据?

答案是 套娃Data block 中存储其他 Data block 信息,此时称为多级索引,可以做到一个数据块中存储大量数据

 

 总结:

文件部分复盘结束,这章确实很难理解,我第一遍稀里糊涂,第二遍马马虎虎,还是要多复盘,多整理。 

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

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

相关文章

C语言学习day16:二维数组

二维数组格式: 数据类型 数组名[行][列] { {值1,值2}, {值3,值4} } 代码: int arr[2][3] { {1,2,3},{4,5,6} }; 那么我们怎么找它的下标呢,我先上一副图: 假如我现在要找1,那么它…

Python函数(一)

目录 一、定义函数 (一)向函数传递信息 (二)实参和形参 二、传递实参 (一)位置实参 (二)关键字实参 (三)默认值 (四)等效的函…

App启动优化笔记

app大致的启动流程。有Launcher进程,system_server进程,zygote进程,APP进程。 Launcher进程:启动activity来启动应用 system_server进程:(ams是其中的一个binder):发送一个socket消息给Zygote。 zygote进程:收到消息后,fork新的进程,---》app进程启动 APP进程:…

是面试官放水,还是公司实在是太缺人?,字节原来这么容易进...

字节是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有19.5K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在华为…

若依项目改造

ctrlalt l 格式化项目 alt f6 修改包和import包名 替换com.ruoyi 为 com.cj 替换若依版本为自己的版本 将ruoyi改成自己项目的英文名 修改中文名字 修改文件包名 修改有ruoyi的类名 : 验证码生成器包名修改:

【电路笔记】-感抗

感抗 文章目录 感抗1、概述2、感抗示例13、通过 LR 串联电路的交流电源4、感抗示例25、交流电感器的功率三角形线圈的感抗取决于所施加电压的频率,因为电抗与频率成正比。 1、概述 感抗是电感线圈的一种特性,它抵抗通过它的交流电 (AC) 的变化,类似于电阻中对抗直流电 (DC)…

探索设计模式的魅力:掌握命令模式-解锁软件设计的‘遥控器’

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 引言:探索命令模式的奥秘 软件设计领域充满挑战与机遇,命令模式…

12.QT文件对话框 文件的弹窗选择-QFileDialog

目录 前言: 技能: 内容: 1. 界面 2.信号槽 3.其他函数 参考: 前言: 通过按钮实现文件弹窗选择以及关联的操作 效果图就和平时用电脑弹出的选文件对话框一样 技能: QString filename QFileDialog::ge…

MATLAB | 绘图复刻(十五) | 环形聚类树状图

本期复刻效果: 感觉出的聚类分析树状图绘制工具也不少了,未来可能会统一整理为一个工具包?(任重道远,道阻且长): 代码讲解 0 数据设置 写了比较多的注释应该比较易懂: clc; clear; close all% 样品起名s…

Linux------环境变量

目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…

芋道---实现可退回至申请人节点(附完整代码)

现有如下需求,审批人在退回申请时,想退回至申请人节点,但目前芋道并不支持退回至申请人节点,现做如下修改,实现该需求: 步骤一:设计流程模型 首先,我们在设计流程模型时&#xff0c…

0205-2-数据链路层

第 3 章 数据链路层 使用点对点信道的数据链路层 数据链路和帧 数据链路层使用的信道主要有以下两种类型: 点对点信道。这种信道使用一对一的点对点通信方式。广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多…

Linux——网络通信TCP通信常用的接口和tcp服务demo

文章目录 TCP通信所需要的套接字socket()bind()listen()acceptconnect() 封装TCP socket TCP通信所需要的套接字 socket() socket()函数主要作用是返回一个描述符,他的作用就是打开一个网络通讯端口,返回的这个描述符其实就可以理解为一个文件描述符&a…

c高级 函数+Makefile

一、作业 1.写一个函数,输出当前用户的uid和gid,并使用变量接收结果 #!/bin/bash function fun(){retid -uret1id -gecho $ret $ret1 } retfun echo $ret二、练习回顾 1.分文件编译(实现冒泡排序) 正确的:将数组的…

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时,考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面,就针对这三种思路具体看看有哪些优化…

【Java EE初阶十六】网络原理(一)

在网络原理中主要学习TCP/IP四层模型中的重点网络协议 1. 应用层 1.1 应用程序与协议 应用层是和程序员接触最密切的; 应用程序:在应用层这里,很多时候都是程序员自定义应用层协议(步骤:1、根据需求,明确…

log4net的使用步骤

log4net的使用步骤 Log4net是一个基于.NET平台的开源日志记录组件,它可以帮助开发人员在应用程序中添加日志记录功能,支持多种日志级别,如DEBUG、INFO、WARN、ERROR等,这使得开发人员可以根据需要灵活地控制日志的输出。下面是lo…

SPSSAU【文本分析】|我的词库

我的词库 文本分析时,可能涉及到一些新词,比如‘内卷’,这个词很可能在词典中并未出现过,词库也不认识它。但研究者自己认识它,此时可将该词纳入到新词词库中,让系统统计词频等信息时也对该词进行统计。当…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本:spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

小迪安全26WEB 攻防-通用漏洞SQL 注入 SqlmapOracleMongodbDB2 等

#知识点: 1、数据库注入-Oracle&Mongodb 2、数据库注入-DB2&SQLite&Sybase 3、SQL 注入神器-SQLMAP 安装使用拓展 数据库注入: 数据库注入-联合猜解-Oracle&Mongodb 1.Oracle数据库一般会在java上执行 参考:https://www.cnblog…