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的引用计数++

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

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

相关文章

设计模式之拦截过滤器模式

想象一下,在你的Java应用里,每个请求就像一场冒险旅程,途中需要经过层层安检和特殊处理。这时候,拦截过滤器模式就化身为你最可靠的特工团队,悄无声息地为每一个请求保驾护航,确保它们安全、高效地到达目的…

Endnote X9 20 21如何把中文引用的et al 换(变)成 等

描述 随着毕业的临近,我在写论文时可能会遇到在引用的中文参考文献中出现“et al”字样。有的学校事比较多,非让改成等等,这就麻烦了。 本身人家endnote都是老美的软件,人家本身就是针对英文文献,你现在让改成等等&a…

JavaScript的操作符运算符

前言: JavaScript的运算符与C/C一致 算数运算符: 算数运算符说明加-减*乘%除/取余 递增递减运算符: 运算符说明递增1-- 递减1 补充: 令a1,b1 运算a b ab12ab22ab--10a--b00 比较(关系)运算符: 运算…

【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录 1. 介绍2. 使用方法2.1 安装 Tampermonkey2.2 安装脚本2.3 使用 3. 配置3.1 时间格式3.2 时间位置3.3 高级配置(1) 生命周期钩子函数(2) 示例 4. 反馈5. 未来计划6. 开源协议7. 供给开发者自定义修改脚本的文档7.1 项目组织架构7.2 定义新的 Component(1) 定义一个新的…

提示找不到msvcr110.dll怎么办,分享多种靠谱的解决方法

当用户在操作计算机时遇到系统提示“找不到msvcr110.dll,无法继续执行代码”这一错误信息,这个问题会导致软件无法启动运行。本文将介绍计算机找不到msvcr110.dll的5种详细的解决方法,帮助读者解决这个问题。 一,关于msvcr110.dll…

《十六》QT TCP协议工作原理和实战

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QTcpSocket组件实现基于TCP的网络通信…

论文| Where Is Your Place, Visual Place Recognition?

论文| Where Is Your Place, Visual Place Recognition?

1.pytorch加载收数据(B站小土堆)

数据的加载主要有两个函数: 1.dataset整体收集数据:提供一种方法去获取数据及其label,告诉我们一共有多少数据(就是自开始把要的数据和标签都收进来) 2.dataloader,后面传入模型时候,每次录入数…

某站戴师兄——Excel学习笔记

1、拿到源数据第一件事——备份工作表,隐藏 Ctrlshift键L打开筛选 UV (Unique visitor)去重 是指通过互联网访问、浏览这个网页的自然人。访问网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。一天内同个访客多次访问仅计算一个UV。 PV …

【C++】详解STL的容器之一:list

目录 简介 初识list 模型 list容器的优缺点 list的迭代器 常用接口介绍 获取迭代器 begin end empty size front back insert push_front pop_front push_back pop_back clear 源代码思路 节点设计 迭代器的设计 list的设计 begin() end() 空构造 ins…

【编程题-错题集】chika 和蜜柑(排序 / topK)

牛客对于题目链接&#xff1a;chika和蜜柑 (nowcoder.com) 一、分析题目 排序 &#xff1a;将每个橘⼦按照甜度由高到低排序&#xff0c;相同甜度的橘子按照酸度由低到高排序&#xff0c; 然后提取排序后的前 k 个橘子就好了。 二、代码 1、看题解之前AC的代码 #include <…

企业计算机服务器中了halo勒索病毒怎么处理,halo勒索病毒解密流程

随着网络技术的不断发展&#xff0c;网络在企业生产运营过程中发挥着重大作用&#xff0c;很多企业利用网络开展各项工作业务&#xff0c;网络也大大提高了企业的生产效率&#xff0c;但随之而来的网络数据安全问题成为众多企业关心的主要话题。近日&#xff0c;云天数据恢复中…

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

1. 前言 对于工业机械臂而言&#xff0c;运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础&#xff0c;全称为Denavit-Hartenberg建模方法&#xff0c;是一种广泛应用于机器人运动学中的建模技术。该方法通…

Python爬虫:XPath解析爬取豆瓣电影Top250示例

一、示例的函数说明&#xff1a; 函数processing()&#xff1a;用于处理字符串中的空白字符&#xff0c;并拼接字符串。 主函数程序入口&#xff1a;每页显示25部影片&#xff0c;实现循环&#xff0c;共10页。通过format方法替换切换的页码的url地址。然后调用实现爬虫程序的…

Unity Animation--动画剪辑

Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画&#xff0c;并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括&#xff1a; 人形动画 运动捕捉…

[力扣]——387.字符串中的第一个唯一字符

. - 力扣&#xff08;LeetCode&#xff09; class Solution {public int firstUniqChar(String s) {int[] count new int[256];// 统计每个字符出现的次数for(int i 0; i < s.length(); i){count[s.charAt(i)];}// 找第一个只出现一次的字符for(int i 0; i < s.lengt…

几个容器网络问题实战解析

容器云平台和容器网络紧密结合&#xff0c;共同构建了容器化应用程序的网络基础设施&#xff0c;实现了容器之间的通信、隔离和安全性。文中容器云平台采用的容器网络组件是calico&#xff0c;这个是业界普遍采用的一种方案&#xff0c;性能及安全性在同类产品中都是比较好的。…

linux下载安装JDK

查看系统是否自带 jdk java -version 一、jdk下载安装 jdk11下载 上传到 linux 以下说明已下载 解压 tar -xzvf jdk-11.0.23_linux-x64_bin.tar.gz 查看是否安装成功 二、linux配置JDK环境 sudo vim /etc/profile JAVA_HOME/may2024/jdk-11.0.23 JRE_HOME$JAVA_HOME/…

苍穹外卖项目

Day01 收获 补习git Git学习之路-CSDN博客 nginx 作用&#xff1a;反向代理和负载均衡 swagger Swagger 与 Yapi Swagger&#xff1a; 可以自动的帮助开发人员生成接口文档&#xff0c;并对接口进行测试。 项目接口文档网址&#xff1a; ​​​​​​​http://localhost:808…

LLVM Instruction Selection 笔记

Instruction Selection 所处阶段 注&#xff1a;上图来源于 Welcome to the back-end: The LLVM machine representation 可以看到 SelectionDAG 架在 LLVM IR 和 LLVM MIR 之间&#xff0c;在此之前 machine independent optimization 已经完成。之后基本上就进入了 machine …