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.mzph.cn/web/8879.shtml

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

相关文章

数据仓库与数据挖掘实验练习3-4(实验二2024.5.8)

练习3 1.简单文件操作练习 import pandas as pd # 读取文件 pd.read_csv(pokemon.csv) # 读取 CSV 文件的函数调用,它将文件中的数据加载到 DataFrame 中,并指定了 Pokemon 列作为索引列。 pd.read_csv(pokemon.csv,index_colPokemon)#查看类型 type(p…

React:Router-2. createBrowserRouter函数式

参考文档:ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式,在react-router6.4.0及以上版本,提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件,使用createBrow…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题(难度系数 5,35 个计分点) 提示信息: 平均数:是指在一组数据中所有数据之和再除以这组数据的个数。 如:“1,2,3&#xf…

命令行方式将mysql数据库迁移到达梦数据库(全步骤)

因项目需求,需要将mysql数据库转换为国产达梦数据库,但由于安全问题,正式环境只能用命令行方式连接,下列是操作全步骤 目录 一、操作逻辑二、操作步骤1、本地安装达梦相关工具2、将服务器mysql导出到本地a) 服务器命令行导出mysql…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

音频录制软件有哪些?这2种推荐给你

音频在当今数字化世界中扮演着至关重要的角色。无论是音乐创作、语音记录、会议记录还是其他任何需要捕捉声音的场景,音频录制软件都是能为我们提供强大功能的工具。 那么到底哪一种软件才最适合您呢?下面小编将为您介绍2款音频录制软件。 方法一&#…

Ansys Mechanical|绳索仿真技术

绳索,俗称绳子,是通过扭或编等方式加强后,连成一定长度的纤维。其拉伸强度很好但没有压缩强度,可用来做连接、牵引的工具。绳索的用途数不胜数:从建筑中的材料固定、到岩土工程中的柔性锚索、汽车门窗的升降拉索、电缆…

在系统学习C语言之前所需要了解的知识

C语言常见概念 前言1. C语言是什么2. C语言的历史和辉煌3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点优点:缺点: 4. VS项目和源文件、头文件介绍5. 第⼀个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII…

Spring Cloud Kubernetes 本地开发环境调试

一、Spring Cloud Kubernetes 本地开发环境调试 上面文章使用 Spring Cloud Kubernetes 在 k8s 环境中实现了服务注册发现、服务动态配置,但是需要放在 k8s 环境中才能正常使用,在本地开发环境中可能没有 k8s 环境,如何本地开发调试呢&#…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

探索MySQL数学宝库:常用数学函数的秘密操作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探索MySQL数学宝库:常用数学函数的秘密操作 前言ABS函数(绝对值)ROUND函数(四舍五入)CEIL和FLOOR函数(向上取整和向下取整&#…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代,个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI,为消费者提供了精彩的内容推荐服务,更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好,能够快速识别其兴趣…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

透明桌面便签便笺怎么设置 透明的便签在哪

在繁忙的工作与生活中&#xff0c;我一直渴望找到一种能够轻松管理待办事项的方式。最近&#xff0c;我发现了一个让我爱不释手的工具。它不仅有着出色的提醒功能&#xff0c;更独特的是&#xff0c;它提供了透明便签的设计。 那么&#xff0c;透明便签的好处究竟有哪些呢&…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

EPSON推出可定制晶振技术支持

什么叫做定制晶振呢?定制晶振又可以称为订制&#xff0c;订做晶振&#xff0c;爱普生可编程晶振可在0.67MHz~166MHz频率范围内实现任意频率烧录订制。定制频率晶振是基于PLL技术的一次频率烧录的振荡器&#xff0c;在没有温补的情况下也能够产生稳定的频率输出。单CMOS频率输出…

什么才是正确的领域驱动实现架构?

作为一种系统建模方法&#xff0c;DDD同样涉及系统的体系架构设计。区别于分布式、事件驱动、消息总线等架构设计方法&#xff0c;DDD中的架构设计关注前面各章所介绍的聚合、实体、值对象、领域事件、应用服务以及资源库之间的交互方式和风格&#xff0c;并在设计思想上有其独…

基于Go编写一个人员管理系统案例

代码结构 人员结构体 package entity// 结构体&#xff1a;人 type Person struct {Id intName stringSex stringAge int }// 构造函数 func NewPerson(id int, name, sex string, age int) *Person {return &Person{Id: id,Name: name,Sex: sex,Age: age,} }人员…