22 文件系统

了解了被打开的文件,肯定还有没被打开的文件,就是磁盘上的文件。先从磁盘开始认识

磁盘

概念

内存是掉电易失存储介质,磁盘是永久性存储介质
磁盘的种类有SSD,U盘,flash卡,光盘,磁带。磁盘是外设,机械设备,访问慢,os也有提速的方式

磁盘物理结构

在这里插入图片描述

磁盘上面有盘片,伺服,磁头,音圈马达等
盘面上会存储数据,计算机只认识二进制,南极和北极,向磁盘写入数据本质就是改变磁盘上的正负极,磁头可以读取内容

磁盘的存储结构

在这里插入图片描述

在这里插入图片描述

磁盘有一个一个圈,每一个平看是一个盘面,一个盘面上每一圈圆叫磁道,将磁道分为了8份,每一份磁道就是扇区。磁道相同的盘面合在一起是一个柱面

磁盘寻道

磁盘怎么找到数据在哪里
在电脑中运行的时候,磁盘是在高速旋转,高速旋转让磁头悬浮在盘面上方,电脑找到地址后发送给磁头,驱动磁头臂精确寻道,找到数据存放的位置。读取数据时,磁头会移动到盘面上读取数据,读取完会回到起始位置。磁盘怎么确定数据在哪个扇区?

CHS寻址

要找到一个扇区,先确定在哪个面(对应哪个磁头),然后确定哪个磁道,最后确定在哪个扇区。
磁盘结构的抽象
在这里插入图片描述

磁带里面的塑料带就像磁盘的盘片,播放时会将磁带从一边卷到另一边。虽然是圆形的,但可以将磁带抽出来,就成了线性结构,里面分为很多部分。磁盘虽然是圆形的,也可以拉开抽象为线性结构,每一块就像一个扇区,访问一个扇区只需要知道下标,就像给每一个扇区编了号,这种寻址方式是LBA寻址。将LBA寻址转换为CHS寻址,就可以找到数据扇区

在这里插入图片描述

磁盘管理

将数据存储到磁盘变为存储到数组,找到扇区变为找到数组特定位置,这样对磁盘的管理变为对数组的管理,就方便了很多
在这里插入图片描述

一整个磁盘不好管理,可以将磁盘分为几个区,就可以转换为小分区的管理。 橙色部分是分区的信息,电脑启动的信息,不只存一份,还有几个备份,当启动出问题就可以拷贝过来恢复

在这里插入图片描述

上面的橙色部分就是BootBlock,一个分区还是大,可以划分为很多个快,其中每个块的结构如上图。

块组

在这里插入图片描述

虽然磁盘的基本单位是扇区,512字节,但是操作系统(文件系统)和磁盘进行IO的基本单位是:4KB(8*512byte),一个block块的大小,所以磁盘也叫块设备

为什么不以512字节为单位

1.如果给的太小,需要多次IO,效率会低
2.如果操作系统和磁盘一样的大小,万一磁盘基本大小编了,Os的源代码要不要改,硬件和软件(os)进行解藕

linux ext2文件系统,上图是磁盘文件系统图(内核内存映像有所不同),磁盘是典型的快设备,硬盘分区被划分一个个的block。一个block的大小是格式化的时候确定的,并且不可以更改,例如mke2fs的-b选项可以设定bloc大小为1024、2048或4096字节。而上图中启动快

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息,Super Block的信息被损坏,可以说整个文件系统结构就被破坏了
  • GDT,Group Descriptor Tbale:块组描述符,描述块组属性信息,包含每个块组的总体信息,如数据位图的块号、索引节点位图的块号、索引节点表的起始块号、空闲数据块和 inode 的个数等。
  • 块位图(Block Bitmap):假设有1000+个blocks,就有1000+个比特位,和block一一对应,每个bit表示一个哪个数据块被占用,哪个没被占
  • inode位图(inode Bitmap):同上,表示inode是否空闲可用
  • inode节点表:一个大小128字节的空间,所有文件inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号。一般一个文件,一个inode,一个inode编号。存放文件属性和大小,所有者,最近修改时间等
  • data blocks:存放文件内容,多个4kb(扇区*8)大小的集合,保存的都是特定文件的内容

在上面的区分后,linux在存储文件时,内容和属性是分开存储的。文件=内容+属性,属性存在inode,内容存在data里。这样可以让一个文件的信息可追溯,可管理

在每个块组内写入相关的管理数据,整个分区就被写入了文件系统信息,这就是格式化

文件查找

找到文件,只要找到对应的inode编号,就能找到该文件的inode属性合集。那么文件的内容怎么知道,哪些块是这个文件的?

inode中存了文件的属性和同一个块组的编号
在这里插入图片描述

如果一个文件特别大,block数据块里不只可以放内容,也可以放其他块的编号,这样类似多叉树的机构,节点就会存在大量的数据块,就可以表示一个大文件

inode

在这里插入图片描述
文件属性第一串数字就是inode

找到inode编号,就能找到分区里特定的bg,然后有了inode属性和内容,怎么知道一个文件的inode编号 。在linux里,想找一个文件,首先知道的是文件名,但文件inode属性里并没有文件名,文件名是在哪里?

在linux目录下,有很多文件,但是同一个目录里没有重复的文件名。目录其实也是文件,有自己的inode,也有data block,data里就存文件名以及文件名和inode的映射关系,这两个互为key值。正因为目录也是文件,所以也有自己的权限,x就是进入目录,w创建文件,需要写入文件名,r显示文件名和属性,读取文件属性和内容

寻找inode编号,依托的是目录结构,所以相对路径和绝对路径的关键在于定位目录,才能读取目录里的文件。关于目录名怎么找到自己的inode,在linxu里有目录树结构,保存了目录之间的关系和目录名与inode的映射关系

创建文件
先找到目录所在的分区,然后找到块组,在inode bitmap找到没有被占用的编号,置为1,然后将文件的属性写入,比如权限,所属组,时间等,将datablock映射关系建立,block位图置为1。有了inode编号,还需要在目录block里写入文件名,编号和文件名映射关系。

删除文件
以文件名为key,找到对应文件的inode,将inode bitmap和block bitmap的内容修改为0,无占用。再将映射关系删掉就行了。有时候删部分文件只需要修改文件大小。所以删除文件比拷贝快的多,所以文件删除也是可以恢复,只需要找到inode,将inode bitmap恢复,将映射的数据块恢复。但是,如果这个inode和data block被再次占用覆盖了,就找不到了

查看文件
ls找到目录,显示目录的对应的文件名和文件属性
cat根据文件名找到文件inode,显示文件内容

磁盘空间或者块组还有空间,但文件创建失败

inode和block是固定的,如果一个申请不下来,就会出现这种情况

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

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

相关文章

WPF中DataGrid主从数据(父子数据)展示

在wpf中可以使用DataGrid控件,进行主从数据展示,也称父子数据展示。下面展示纯原生控件编码实现功能(样式自己可以根据需求进行修改)。 效果如下: 点击图标,展开和收缩可以自由的切换,也可以自己重新写一个样式,比如+,-或者类似图标的样式,都是可以的。 1.首先创建一…

2024年nodejs调用小红书最新关注(粉丝)follow接口,api接口分析2004-04-16

一、打开chrome按f12,点击右上角的“关注”按钮,抓包位置如下: (图1 follow接口) 二、follow接口分析 1、请求地址 https://edith.xiaohongshu.com/api/sns/web/v1/user/follow 2、请求方法: POST 3、请求头: :authority: edith…

IO流高级流

前言 缓冲区能够提升输入输出的效率 虽然FileReader和FileWriter中也有缓冲区 但是BufferedReader和BufferWriter有两个非常好用的方法. 缓冲流 字节缓冲流 import java.io.*;public class BufferedStreamDemo {public static void main(String[] args) throws IOExceptio…

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…

LC 206.反转链表

# 206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入: head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入: head [1,2] 输出:[2,1] 示例…

工作流引擎项目解析

API 编辑 在Camunda中,API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系: ProcessEngineServices 接口: RepositoryService: 负责管理流程定义和部署。 RuntimeService: 负责管…

《大话数据结构》01

1. 什么是数据 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。 比如我们现…

Java --- 类与对象

上篇内容给大家带来了Java的语句与数组的相关内容,那么本期内容比较重要,需要读者们掌握Java面向对象编程的根本,通过这篇博客来让读者浅入理解Java类的一些基本操作。 目录 一.特点: 二.成员变量: 三.访问修饰符&a…

Chatgpt掘金之旅—有爱AI商业实战篇|构建SaaS业务|(二十)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、程序员如何搞副业构建 SAAS 业务? 程序员不仅拥有将抽象概念转化为实际应用的能力,还通常具备强大的逻辑思维和问题解决能力。然而,许…

读书笔记之《如何精心设计提示词来精通ChatGPT》

《如何精心设计提示词来精通ChatGPT》这本书英文标题为:《The Art of Prompt Engineering with chatGPT》,于2023年出版。作者是Nathan Hunter 。 Nathan Hunter简介:ChatGPT培训的创始人。作为一名资深培训师和教学设计师,我在过…

【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式

一、前言 使用ORACLE作为数据库的应用软件中,偶尔会遇到使用游标作为出参的存储过程,这种存储过程迁移到MogDB并不需要进行改造,但是在开发这样的存储过程时,开发人员偶尔会想要在数据库中测试执行一下,看看游标中的数…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件…

MongoDB的go SDK使用集锦

在上一章解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用介绍了如何使用mongo shell操作mongo数据库,接下来介绍如何使用sdk来操作数据库,这里以go语言为例,其他语言请查看源文档mongo docs Quick Start 内置数据结构 MongoDB是存…

记第一次踩坑Gradle

今天有个项目只能使用Gradle编译,没办法了,尝试吧。 先去下载了最新版本的Gradle,然后配置好了环境变量,可以在命令行使用gradle命令了。 然后打开项目开始操作一番,但是上来就傻眼了。 我白下载了,又重新下…

每日两题2

不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m1, vector<int>(n1,0));//创建dp表dp[0][1] 1;//初始化//填表for(int i 1; i < m; i){for(int j 1; j < n; j){dp[i][j] dp[i-1][j] dp[i][j-1];}}ret…

飞书API(4):筛选数据的三种思路

截止到上一篇&#xff0c;终于通过飞书 API 完整获取到飞书多维表的数据。但是&#xff0c;有些场景&#xff0c;比如数据源会出现脏数据&#xff0c;毕竟如果是运营过程多人协作维护的数据&#xff0c;要想保持数据完美简直是天方夜谭&#xff01;再比如我们不需要完整的数据&…

JavaFX项目环境配置

Java版本 JDK15 JavaFX版本 JavaFX SDK 17 sdk下载地址https://gluonhq.com/products/javafx/ https://gluonhq.com/products/javafx/ Java FX sdk 版本不要选择22版本 与 jdk15版本不合 编辑器 配置Eclipse JDK15环境 点击Add 第二步新建一个javafx项目 点击next 勾选Ja…

Aurora 协议学习理解与应用——Aurora 8B10B协议学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Aurora 8B10B协议学习之一&#xff0c;理解协议 概述8B10B数据发送和接收Symbol-Pairs传输调度用户PDU传输过程用户PDU接收过程 流控自然流量控制操作自然流量控制延迟自然流…

微信人脉扩张!多号批量自动加好友,你get到了吗?

微信是我们在拓展社交圈和寻找商业机会时&#xff0c;与更多的人建立联系的重要渠道。但是&#xff0c;手动一个个添加好友显然费时费力&#xff0c;这时候&#xff0c;微信管理系统的批量自动加好友功能就成为了微信人脉扩张的神器。 通过微信管理系统&#xff0c;我们可以轻…

JavaScript 高性能编程 —— 加载和运行

JavaScript 在浏览器中的性能,可认为是开发者所要面对的最重要的可用性问题。此问题因 JavaScript 的阻塞特征而复杂,也就是说,当 JavaScript 运行时其他的事情不能被浏览器处理。 事实上,大多数浏览 器使用单进程处理 UI 更新和 JavaScript 运行等多个任务,而同一时间只能…