什么?你还不懂文件系统和软硬链接?

文章目录

  • 序言
  • 认识磁盘
  • 磁盘在系统中的管理
    • 熟悉磁盘各个分区
  • 软硬链接
    • 软链接
    • 硬链接

序言

首先熟悉一下一些专有名词(了解即可,但必须有一个概念认识)
固态:SSD,笔记本中常装的,台式机中也可以装,常见的对应接口M.2和SATA接口
磁盘:90年代常用的数据存储设备,或是现在企业级数据存放的重要设备

认识磁盘

在这里插入图片描述
磁盘中的数据存储

按0,1的充放电来改变磁盘表面的0,1状态,修改数据

磁盘的物理存储
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

磁盘在系统中的管理

一个盘面有很多的同心磁道,这些磁道之间有很小的间距

一个磁道有很多的扇形扇区

磁盘的存储单元最小是512byte(主要)或者是4kb-----单只想改变1byte,但还是要加载512byte

在这里插入图片描述
在这里插入图片描述

熟悉磁盘各个分区

在这里插入图片描述

1-100000 第一面                       100001-200000第二面1-10000 第一磁道10001-20000 第二磁道......

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

手绘一个图来理解这个分区的具体情况

在这里插入图片描述
在这里插入图片描述
ls- li
会多一列数据
在这里插入图片描述

这是iNode编号,一般情况下,一个文件一个iNode编号,每个文件都有
在整个分区都有唯一性,不同的分区可能有相同的iNode
在Linux中识别文件根据iNode编号

在这里插入图片描述针对上述这个表进行详细的说明一下:
i节点表:

存放文件的文件属性 如:大小,所有者,最近修改时间
保存文件属性是通过inode保存的
struct inode
{

文件大小属性,等…
int blocks[N]
int ref_count;
}

这个一个inode大小固定为128字节 ,每一个inode的大小都是固定的
这个i节点表就是struct inode inode_table{N}

在每个分区之前都有一个struct inode_number
要找某个inode对应的组内的位置只要inode - inode_number就能找到

Data blocks
在这里插入图片描述

根据inode编号 -------> 找到inode区间 -----> 然后找到对应的组

inode Bitmap

位图:标识每一个bit的inode编号,标识文件是否被使用,内容(0/1)

block bitmap

bit位的位置表示block的编号,标识这个block是否被使用

group Descriptor tabl:

块组描述符:inode,一共有多少inode,有多少被使用,分组多大,
保存整个块的管理信息

每一个块都有这五个字段(group descriptor table,)

super block

简称sb,这个超级块不属于这一个分组,可能有100个块,7 8个块组跟
super有关,里面放的是整个块的主要信息
当super block出现错误就在相当于整个磁盘都会报废
所以一般这个super block会多副本的形式保存在其他块区内
这样等super出错后,系统就能自己进行拷贝完成修复

新建,删除:知道iNode,怎么删除?

根据inode编号找到对应的位置将这个位置的数据由1----->0
找到对应的block改位图就能删除
这个删除表示文件的block 不可用

误删了怎么办?

知道inode编号,找到对应的块组,将位图的将0改为1
找到对应的inode数组,对应对的data block从0->1改回来
linux中会将删除的文件的inode保存下来
不做恢复处理(要知道原理)

super block

简称sb,这个超级块不属于这一个分组,可能有100个块,7 8个块组跟
super有关,里面放的是整个块的主要信息

当super block出现错误就在相当于整个磁盘都会报废
所以一般这个super block会多副本的形式保存在其他块区内
这样等super出错后,系统就能自己进行拷贝完成修复

补充细节:

ib中,这个block[N]的大小是15
0-12对应的数据直接映射
13往后间接映射 保存其他数据块的信息
14三级映射 保存更多其他块的信息
类似于一颗多叉树
134kb+4kb/44kb+1000*4kb…
以这样的计算得到文件的大小,这样的文件的大小很大,足够满足用户使用

当文件很大时,一般是占据索引映射的文件都沾满了,会在上层进行必要的分开…
这样的文件都是ext2文件系统,其他的ext3,4都是在此基础上添加了日志等信息

从上层来看,系统一直使用inode,用户一直使用文件名称,如何对应起来?
将文件名转化为inode文件映射(OS处理).

在这里插入图片描述

目录文件的数据块内容存的是什么?

存的是自己目录内部保存的文件的文件名 和 inode与文件名称的映射关系,所以同一个目录下不允许存在同名文件(文件名称被当做key来使用,inode要不同,这俩相互监视)
这样根据inode就能找到对应的db的数据

so,我想在一个目录下想新建,修改,删除文件时,需要的是该目录的w权限!!!

在linux中文件名不属于文件属性,文件名存在于目录文件中

怎么找到test.c文件

首先要找到这个文件,要找到目录,并打开目录文件,这样就得到了文件名和inode的映射关系
有了这个关系就能根据inode找到在哪个分区下,在哪个分区的分组里面,
再根据inode在inode table中找到存放该inode信息的那个表,那么文件的所有属性就能找到
然后根据用户输入的指令,例如ls,就会将信息转化为字符串输出到界面
又如:cat test.c
一直到找到inode编号,根据inode在data blocks中,将数据导入到内存,再输出出来
这个找,从根目录开始找

在这里插入图片描述

可以通过vim查看这个目录文件的信息(仅做演示)

在这里插入图片描述

每个文件在哪,都是从路径中找到,这些路径都被记录下来(这些由一个进程启动时,进程会记录路径)

当一次进程启动,这个进程的所有路径信息会被缓存在内存中

系统中存在struct dentry{},在启动时将路径各个记录在这里面,以一种多叉树的形式

在这里插入图片描述

一个磁盘被分区格式化之后,linux要中使用这个分区,要把这个分区进行挂载mount(运维相关,不多做介绍)

在这里插入图片描述

FILE* fp = fopen("./log.txt","w"); 

执行这条语句,操作系统干了什么事?

首先确定的是是进程打开这个文件,进程有自己的CWD
根据进程的cwd和传入的路径,定位到该路径在磁盘的哪一个分区,哪一个分组.
找到上级目录的inode和文件内容,映射关系找到.这个文件的inode找到,属性加载到内存中,
在内存中构建struct FILE结构体,这个结构体指向这个inode,文件属性就这样出现了;
然后根据inode将数据块预加载到文件中,缓冲区就有了,此时再读将数据从缓冲区拷贝到应用层,这样这条语句就执行完成

软硬链接

软硬链接:
linux:软链接
硬链接

软链接

软链接:(是独立文件,有自己的inode编号) 功能像快捷方式,内部内容是指向目标文件的内容

ln -s log log.soft.link

在这里插入图片描述

软链接:windows的快捷方式
在这里插入图片描述
linux下的场景跟win差不多
在多层深入的文件中打开不方便,建立连接快速打开
原文件路径
在这里插入图片描述
建立连接
在这里插入图片描述

执行:

在这里插入图片描述

硬链接

硬链接: (不是独立文件)

ln hello hello.skft.link(

在这里插入图片描述
硬链接本质就是在指定目录内部的一组映射关系: 文件名<->inode的映射关系
文件硬链接删除,可以使用rm,但是更推荐unlink
先使用rm删除看结果:

在这里插入图片描述
在删除这个hello之后,这个数字减小了

一个文件真正被删除是指文件名和inode没有映射关系,
在系统层次目标文件怎么知道文件名指向了我? inode内的引用计数,表明有几个文件映射关系(默认为1)
硬链接后进行++
文件名在目录里具有唯一性,文件名->"指针"

int ref_count;//引用计数

硬链接数,哪些文件指向对应的inode

普通文件硬链接数是1,文件系统的硬链接数为2,因为文件系统内的 . 文件也包括在内

在这里插入图片描述此时,在里面创建一个 dir文件
在这里插入图片描述

退回mydir的目录

在这里插入图片描述

发现这个硬链接数变成3,
在新建的dir里面他的. . 文件与mydir又有相同的inode编号,所以这个也是硬链接创建的文件,这也是…能回退上级的原因(应用场景)

在这里插入图片描述

区别:
软链接就是新文件
硬链接是文件名和inode的一组映射关系

关于本次就到此结束,喜欢请三连,任何问题可以评论留言~~

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

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

相关文章

IPv4 NAT(含Cisco配置)

IPv4 NAT&#xff08;含Cisco配置&#xff09; IPv4私有空间地址 类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16 这些私有地址可在企业或站点内使用&#xff0c…

从零开始的软件测试学习之旅(四)web项目工作流程介绍

WEB手工项目 项目介绍项目技术分析项目学习准备工作如何快速熟悉项目举例熟悉TPshop项目 总体系统项目介绍项目与数据库测试流程什么是软件需求需求评审 测试计划测试方案测试计划和测试方案的区别 项目介绍 满足经典三层架构:前端 后端 数据库 前端:运行在用户端的浏览器和客…

同仁堂医养拟赴港上市,养老产业的盈利难题有了答案?

提及银发经济&#xff0c;大众可能最先想到的就是养老产业&#xff0c;在市场需求推动下&#xff0c;这一细分赛道的增长已势不可挡。单从入局者的积极性就可以把握到赛道前景之广阔。 天眼查专业版数据显示&#xff0c;截至目前&#xff0c;我国拥有养老相关企业36.2万家&…

线上办理离婚快速离婚,无需双方见面异地可办

现在离婚有两种方式 一种是协议离婚&#xff0c;双方都同意的情况下&#xff0c;可以去民政局协议离婚&#xff0c;有30天冷静期&#xff0c;冷静期过后需要双方再次去民政局办理离婚手续。 另一种是诉讼离婚&#xff0c;一方不同意离婚&#xff0c;可以选择诉讼离婚。可以全…

【PPT设计】颜色对比、渐变填充、简化框线、放大镜效果、渐变形状配图、线条的使用

目录 图表颜色对比、渐变填充、简化框线放大镜效果渐变形状配图 线条的使用区分标题与说明信息区分标题与正文,区分不同含义的内容**聚焦****引导****注解****装饰** 图表 颜色对比、渐变填充、简化框线 小米汽车正式亮相&#xff01;你们都在讨论价格&#xff0c;我全程只关…

jackson.dataformat.xml 反序列化 对象中包含泛型

重点&#xff1a; JacksonXmlProperty localName 指定本地名称 JacksonXmlRootElement localName 指定root的根路径的名称&#xff0c;默认值为类名 JsonIgnoreProperties(ignoreUnknown true) 这个注解写在类上&#xff0c;用来忽略在xml中有的属性但是在类中没有的情况 Jack…

python_django农产品物流信息服务系统6m344

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框…

Eclipse C++ 无法debug 问题

环境&#xff1a; ubuntu20.04 Eclipse CDT&#xff08;x86_64) 工程&#xff0c;使用的是默认的CMake Project 现象&#xff1a; 1. 使用Eclipse&#xff0c; 加了断点后&#xff0c;debug 无法停在断点&#xff1b;step over 执行后是从main 直接执行到exit &#xff…

poi-tl自定义渲染策略学习

文章目录 实现逻辑参考代码注意点 实现逻辑 自定义渲染策略实现逻辑&#xff1a; 找到模板中的表格标签render方法接收java中对应模板表格标签的所有list数据执行自定义渲染逻辑 参考代码 word模板如下&#xff1a; 实体类&#xff1a; Data public class GksxRowData {/…

Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式&#xff0c;它们可以直接访问同一块内存区域&#xff0c;因此比使用管道或消息队列等通信机制更高效。在多进程程序中&#xff0c;共享内存通常与信号量一起使用&#xff0c;以确保对共享内存的访问是线程安全的。 一、打开/创建…

07_for循环返回值while循环

文章目录 1.循环返回值2.yield接收for返回值3.scala调用yield方法创建线程对象4.scala中的while循环5.scala中的流程控制 1.循环返回值 for循环返回值是Unit 原因是防止产生歧义&#xff1b; 2.yield接收for返回值 // 2.yield关键字打破循环&#xff0c;可以使for循环输出…

webpack面试题(持续汇总ing。。。)

webpack的编译过程 初始化 此阶段&#xff0c;webpack会将CLI参数、配置文件、默认配置进行融合&#xff0c;形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备目前&#xff0c;…

LLaMA 3:大模型之战的新序幕

作者 | 符尧 OneFlow编译 翻译&#xff5c;杨婷、宛子琳、张雪聃 本文要点概览&#xff1a; 文本数据的扩展可能已经达到了极限&#xff0c;因为易于获取的网络文本资源&#xff08;如Common Crawl、GitHub、ArXiv等&#xff09;已基本被充分利用。 尽管如此&#xff0c;通过更…

数据结构 - C/C++ - 数组

目录 结构特性 内存布局 结构样式 结构拓展 数据初始 元素访问 插入元素 删除元素 查找元素 修改元素 结构设计 成员变量 构造函数 功能函数 示例代码 结构特性 长度固定&#xff1a;数组的长度在创建时已经被确定&#xff0c;如果需要动态改变数组的长度&#…

C++面向对象程序设计 - 多继承,以及基类与派生类转换

单继承是一个类是从另一个基类派生类而来的&#xff0c;多继承则是一个派生类是同两个或多个基类&#xff0c;派生类从两人或多个基类中继承所需的属性。 声明多重继承的方法&#xff1a; class D: public A, private B, protected C { 类D新增加的成员 } 一、多重继承派生类的…

Vue---组件

Vue—组件 目录 Vue---组件定义组件全局组件局部组件 组件通讯***重点***父子通信之父传子&#xff08;props&#xff09;父子通信之子传父&#xff08;$emit&#xff09;ref属性&#xff08;$refs&#xff09; 动态组件插槽命名插槽 定义组件 全局组件 vue2中template只能传…

浏览器渲染机制:重排(Reflow)与重绘(Repaint)以及Vue优化策略

浏览器渲染机制是一个复杂但有序的过程&#xff0c;其目的是将HTML、CSS和JavaScript代码转化为用户可以看到和交互的视觉界面。重排&#xff08;Reflow&#xff09;与重绘&#xff08;Repaint&#xff09;是浏览器渲染过程中对页面元素进行更新的两个重要步骤&#xff0c;理解…

ubuntu22.04安装TensorRT(过程记录)

重要说明&#xff1a;此贴经过多次修改。第一次安装的的为trt8.6.1版本。第二次安装的10.0.0.6版本。有些地方可能没改过来&#xff0c;比如链接向导&#xff0c;我懒得改了&#xff0c;但是流程是对的。 cuda和cudnn版本对应关系 tensorRT历史发行版本 CUDA历史发行版本 cudn…

ENVI不同版本个人使用对比

ENVI不同版本个人使用对比 文章目录 ENVI不同版本个人使用对比前言对比5.3学习版5.6学习版6.0试用版 总结 前言 目前来看&#xff0c;流传较广的可供大家免费获取的ENVI版本主要是5.3学习版 5.6学习版 6.0学习版这三个版本&#xff0c;不同的版本有不同特色&#xff0c;在此做…

C#基础|StringBuilder字符串如何高效处理。

哈喽&#xff0c;你好&#xff0c;我是雷工。 字符串处理在C#程序开发中是使用频率比较高的&#xff0c;但常规的字符串处理方式对内存占用比较多&#xff0c;为了优化内存&#xff0c;减少不必要的内存浪费&#xff0c;引入了StringBuilder类。 下面学习下StringBuilder类的使…