Linux——基础IO2

引入

之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件

那些未被打开的文件呢?

大部分的文件都是没有被打开的文件,这些文件在哪保存?磁盘(SSD)

OS要不要管理磁盘上的文件?(如何让OS快速定位一个文件)

要(通过路径快速定位文件)

1.磁盘的了解

1.1机械构成

那个像铁片一样的叫盘片(数据是写在这里面的)

盘片可以理解为一种特殊的光盘,不过光盘是只读的(一旦进行光学拷贝,写一次下次就不能写了)   而盘片可以读取和写入,可以重复写

大部分桌面级磁盘只有一片(两面) 盘片,而企业级的磁盘(云盘)拆开是一摞的

盘片中心是一个高速旋转的马达,旁边有一个磁头(像针一样),关机时磁头会收起

背板(后面的电路板)上面是硬件电路->伺服系统

计算机中的0、1在不同的硬件上的表现不同,在磁盘上,可以把盘片上面存放大量的磁铁,而0、1就对应着磁铁的南、北极

1.2磁盘的物理存储 

盘片可以看成无数个 同心圆构成,划分成了一个个区域,这些区域叫磁道(柱面)

磁道中的某一部分称为扇区

扇区(512字节,4KB):是磁盘IO的基本单位(注意:不一定是系统和磁盘IO的基本单位)

磁头、盘面都有唯一的编号,而磁道、扇区也有唯一的编号

 如果我想访问磁盘中的一个扇区:

选择磁头==选择盘面

通过磁头定位:磁道/柱面

使用哪个磁头、哪一个扇区 CHS定位法

磁头    ->    磁道    ->    扇区

head        cylinder         sector

那么任何文件,不就是多个扇区承载的数据吗

为什么磁盘要高速旋转?寻址指定磁道上的扇区

为什么磁头要快速摆动呢?定位磁道/柱面的

上面两个回答都是机械运动(慢)且是外设

1.3磁盘的逻辑存储

磁带见过吧,里面是黑色的带子,这条很长的带子卷起来是圆形的,扯开就是直的带子(线性)

现在抽象一下啊,把磁盘中盘面也(展开)看成这样的线性空间,然后下一个盘面往后接上

假设有一个800G的磁盘

 

sector array[1677721600]

对磁盘的管理就变成了对数组的增删查改

注意:

不同操作系统IO基本单位可能不同但大部分操作系统都是4KB。

OS认为,一次和磁盘IO一个扇区(512字节)单位太小了,访问效率太慢了,所以操作系统将连续8个扇区作为一个基本数据块,即4KB, 所以这4KB就是IO的基本单位

 每8个扇区合成一个新的数据块,从而得到一个新的数组

通过数组的下标,该下标被称为LBA(logic block address)也就是逻辑块地址,我们只要知道 每个磁道上的扇区数 每个盘面上的扇区总数,就可以通过计算得到对应的扇区位置

sector / 单盘扇区的个数 = 0->H

sector % 单盘扇区的个数 = temp

temp / 一个磁道上的扇区个数 = 我在哪个磁道 ->C

temp % 一个磁道上的扇区个数 = 结果,我是特定一个磁道的一个扇区->S

线性地址   ->(磁盘自己转化)    CHS

4KB / 512字节 = 8

若要访问下标为 1 的地址块写入扇区

1*8 + [0,1,2,3,4,5,6,7] 起始扇区+8个下标的偏移量  

下标为2则         2*8 + 偏移量

2.文件系统

2.1认识inode

Linux磁盘文件的特性:                       文件 = 内容 + 属性

内容和属性分开存储的

内容的大小不确定,而属性的大小是固定的

因为文件属性的类别都是一样的,只不过不同文件中对应类别存储内容不同

所以设计出了一个结构体用来描述文件属性,该结构体即为inode,大小一般为128字节,每个文件都有自己的inode和对应的inode编号,该inode编号在所处分区内唯一

所以系统中标识一个文件,用的不是文件名,而是inode编号。

struct inode
{//类型//大小//权限//。。。//inode编号(每个分区唯一)
}

 2.2inode table

i节点表:存放文件属性 如:文件大小、所有者、最近修改时间等 inode table

2.3inode 位图

怎么知道哪些inode被使用、哪些没?

inode BitMap(inode 位图):每个bit表示一个inode是否可用

比特位的位置:inode Table中第几个inode
比特位的内容:标识该inode是否被使用

2.4Date block

Date block(数据区):存放文件内容

2.5Block BitMap

Block BitMap(块位图):Block BitMap其中记录着Date block中哪个数据块已经被占用,哪个数据块没被占用

比特位的位置:Date block中第几个数据块
比特位的内容:标识该数据块是否被使用

怎么找到一个文件? 

找到一个文件,得找到它的属性和内容,但不是一上来就找inode 、Date block,而是先找到文件在哪个组里

每个组都有起始编号和inode的个数

inode是在分区中唯一的,在组中起始位置和终止位置比较看inode属于哪个组,然后在inode BitMap中找bit确认这个文件是存在的

inode Table里面找到 Date block中的文件内容

 起始编号+inode bitmap 中为空的bit(偏移量)

编号 - 偏移量 = 我在inode BitMap 的第几个bitmap

进而能找inode Table  -> 进而能找到Date blocks

注意:数据块的大小仅有4KB,但文件可不止,即一个文件可能会占用多个数据块,所以inode结构体中还会有这样的一个设计:

struct inode
{//类型//大小//权限//。。。//inode编号(每个分区唯一)int block[15];//找多个块中的文件}

inode表中        block[15]只有15位,只能记15个,每个4KB,难道每个文件最多只能记60KB吗?

其实不然15个下标[0,14]

其中[0,11]是直接映射 

[12,13]指向的数据块不直接存数据,而是存后续此文件数据块的编号(这最多也就存8MB)

,二级索引

下标14指向的数据块,里面存到是其它数据块的编号,而其它数据块存的才是后续文件数据块的编号(三级索引)

2.6Group Descriptor Table

Group Descriptor Table(GDT):对一个块组进行管理的数据结构,统计了这个分组的使用情况

2.7Super Block

Super Block:用来管理整个分区,会在Block group 0中存在,还会在零星的Block group(为防止防止文件系统结构被破坏无处覆盖)

分盘(D、E、F等)格式化:向指定分区,写入文件系统

2.8文件名

在Linux中我们一直没有用inode,访问文件用的是文件名

目录是不是文件?是,inode+目录内容

目录内容是啥?文件名:inode编号的映射关系

既然目录也是文件,那么目录也有自己的inode,打开这个目录之前也要找到此目录的inode,这样一直往前找,找到找到根目录(根目录的inode是确定的)

如果目录没有r、w、x权限,无’w'就没法向文件写入所要创建文件的文件名与inode编号的映射关系,自然也就无法创建文件

OS也要对目录做管理 struct dentry

文件的增删查改,对一个文件进行增删查改,都和文件所处的目录有关系

查找一个文件,在内核中,都要逆向的递归般得到 / ,从根目录进行路径解析

inode只在分区内有效,那么上面的内容就有一个大前提,我所要的文件究竟在哪个分区?

一个被写入文件系统的分区,要被Linux使用,必须要先把这个具有文件系统的分区进行"挂载"

既然有多个分区,每个分区都有文件系统,OS自然要对文件系统做管理(先描述,再组织)

挂载:将一个文件系统所对应的分区,挂载在对应的目录中

df -h可以查看分区挂载到哪个目录中        mount命令挂载分区到指定目录中

分区的访问都是通过所挂载的路径访问的

OS对文件系统目录都做管理,文件系统和目录都有对应的数据结构

挂载的本质就是让这两种数据结构产生关系

前缀路径根分区挂载的路径进行匹配就能得出此文件是哪个分区的

3.软硬链接

3.1软链接

观察现象

我们可以通过命令:ln -s 文件名 软链接名 创建软链接

link.soft -> test.txt                         link.soft本质是文件(有inode) 

软链接本质就是一个独立的文件,内容存放的是目标文件所在的路径信息,类似于windows系统的  快捷方式 

3.2硬链接

也可以用ln 创建硬链接

硬链接本质不是一个独立的文件,其inode与链接的文件相同

若把链接文件删了,硬链接还存在,还能访问链接文件的内容

 优点像重命名,硬链接其实是新的文件名和目标文件inode的映射关系

硬链接本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数++

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

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

相关文章

华为数据之道第二部分导读

目录 导读 第二部分 第4章 面向“业务交易”的信息架构建设 信息架构的四个组件 数据资产目录 数据标准 数据模型 数据分布 信息架构原则:建立企业层面的共同行为准则 信息架构建设核心要素:基于业务对象进行设计和落地 按业务对象进行架构设…

CSS3新增特性

新增属性选择器 <style>/* 必须是input但是同时具有value这个属性选择这个元素 [] */input[value] {color: red;}input[typetel] {color: blue;}/* 选择首先是div然后具有cLass属性并且属性值必须是 icon开头的这些元素 ^ */div[class^icon] {color: pink;}section[c…

113721-87-2,7-AMCANHS活化酯可用于蛋白质印迹和免疫测定

一、产品概述 7-AMCA NHS ester是一种重要的荧光标记试剂&#xff0c;广泛应用于生物分子研究、细胞成像以及蛋白质标记等领域。 结构式如图所示 中文名称&#xff1a;7-AMCA NHS 活化酯 英文名称&#xff1a;7-AMCA NHS ester&#xff0c;AMCA-OSu CAS号&#xff1a;11372…

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…

汽车软件研发工具链丨怿星科技新产品重磅发布

“创新引领未来”聚焦汽车软件新基建&#xff0c;4月27日下午&#xff0c;怿星科技2024新产品发布会在北京圆满举行&#xff01;智能汽车领域的企业代表、知名大企业负责人、投资机构代表、研究机构代表齐聚现场&#xff0c;线上直播同步开启&#xff0c;共同见证怿星科技从单点…

MySql表的增删查改(CRUD)

对表中的数据操作分为4大类&#xff0c;增加数据&#xff0c;删除数据&#xff0c;查找数据&#xff0c;修改数据。对表中的数据进行增删查改操作简称为CRUD。Create(增),Retrieve(查找),Updata(修改&#xff09;,Delete(删除)CRUD的操作是对表中的数据进行操作的&#xff0c;是…

MinimogWP WordPress 主题下载——优雅至上,功能无限

无论你是个人博客写手、创意工作者还是企业站点的管理员&#xff0c;MinimogWP 都将成为你在 WordPress 平台上的理想之选。以其优雅、灵活和功能丰富而闻名&#xff0c;MinimogWP 不仅提供了令人惊叹的外观&#xff0c;还为你的网站带来了无限的创作和定制可能性。 无与伦比的…

分类任务的基础学习

1.什么是分类&#xff1f; 2.局限性&#xff1a; 当样本量逐渐变大的时候&#xff0c;准确率会下降——>因为线性回归曲线距离我们的原点越远&#xff0c;预测就会开始不准确&#xff0c;因为 x前面的倍数就会越来越小&#xff0c;这就导致了样本量变大&#xff0c;但是那些…

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…

vue 语法2

【5】条件渲染和列表渲染 &#xff08;1&#xff09;条件渲染v-if v-else-if v-else 条件渲染根据表达式的真假值来渲染不同的元素或组件。 v-if&#xff1a;当表达式的值为真时&#xff0c;渲染该元素或组件。 v-else-if&#xff1a;当前面的 v-if 或 v-else-if 的表达式为假…

基于springboot实现公交线路查询系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现公交线路查询系统演示 摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

JavaScript数字分隔符

● 如果现在我们用一个很大的数字&#xff0c;例如2300000000&#xff0c;这样真的不便于我们进行阅读&#xff0c;我们希望用千位分隔符来隔开它&#xff0c;例如230,000,000; ● 下面我们使用_当作分隔符来尝试一下 const diameter 287_266_000_000; console.log(diameter)…

网络层协议之 IP 协议

IP 协议格式 4 位版本&#xff1a;此处的取值只有两个&#xff0c;4&#xff08;IPv4&#xff09;和 6&#xff08;IPv6&#xff09;&#xff0c;即指定 IP 协议的版本。 4 位首部长度&#xff1a;描述了 IP 报头多长&#xff0c;IP 报头是变长的&#xff0c;因为报头中的选项部…

“人工智能+”推进新质生产力发展论坛暨工作室实践实训基地授牌仪式圆满结束

4月27日&#xff0c;由江西财经大学现代经济管理学院主办的“人工智能”推进新质生产力发展论坛暨“江财现经管泰迪数智技术”校企工作室实践实训基地授牌仪式在江西财经大学现代经济管理学院共青城校区举行&#xff0c;学院院长王金海&#xff0c;副院长丁美东&#xff0c;副院…

Day2 | Java基础 | 2 数据类型

Day1 | Java基础 | 2 数据类型 基础版staticstatic的用法static修饰内部类static修饰方法static修饰变量static修饰代码块 深入分析static小结 问题回答版参数传递形参和实参的区别是什么&#xff1f;Java是值传递还是引用传递&#xff1f;值传递和引用传递的区别是什么&#x…

引用数据类型 栈内存 堆内存

let m { a: 10, b: 20 }; let n m; n.a 15; console.log(m.a) // 15 原因&#xff1a;基本数据类型存储在栈内存中&#xff0c;引用数据类型存储在堆内存中 &#xff0c;引用数据类型存储在堆内存中会在栈内存中创建一个指针&#xff0c;栈内存中的这个指针指向堆内存中的地…

Blender材质,纹理,UV

1.材质Material&#xff0c;用于描述物体的表面性质&#xff0c;包含以下基本属性 -基础色 -金属/非金属 -粗糙度 -透光度 -凹凸细节 添加材质步骤&#xff1a; 1&#xff09;切换到材质预览模式 2&#xff09;打开材质面板 3&#xff09;添加一个材质&#xff0c;包括材…

Windows 10 中使用 Montreal-Forced-Aligner (MFA) 实现音频和文本强制对齐

文章目录 一、实现目标二、安装 Montreal-Forced-Aligner1、使用 Anaconda 虚拟环境2、修改默认下载路径3、安装 montreal-forced-aligner 及相关第三方包4、验证是否安装成功 三、下载声学模型和发音词典1、命令行方式下载2、手动方式下载 四、强制对齐1、准备音频及对应文本2…

[嵌入式系统-72]:RT-Thread-组件:单元测试框架utest

目录 utest 测试框架 ​编辑 测试用例定义 测试单元定义 utest 应用框图 2. utest API assert 宏 测试单元函数运行宏 测试用例导出宏 测试用例 LOG 输出接口 3. 配置使能 4. 应用范式 5. 测试用例运行要求 6. 运行测试用例 测试结果分析 7. 测试用例运行流程 …

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器&#xff0c;用来存放Java对象。 集合在存放对象的时候&#xff0c;不同的容器&#xff0c;存放的方法实现是不一样的&#xff0c; Java中将这些不同实现的容器&#xff0c;往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…