操作系统专栏2-文件系统from小林coding

文件系统

  • 文件系统构成
  • 虚拟文件系统
  • 文件的使用
  • 文件的存储
    • 连续存储
    • 非连续空间存放方式
      • 链表方式
      • 索引方式
    • Linux文件的实现方式
  • 空闲分区的管理
  • 文件系统结构
    • 目录的存储
    • 软链接和硬链接

文件系统构成

Linux的设计哲学有一点很重要:一切皆文件,不仅仅是普通的文件和目录,就连块设备,管道,socket都属于文件的范畴
Linux会为每个文件分配两个数据结构:索引节点目录项

  • 索引节点:inode,记录文件的元信息,比如inode编号,文件大小,访问权限,创建时间,数据在磁盘中的位置,同样是文件的唯一标识,索引节点同样占据磁盘空间
  • 目录项:也就是dentry,记录文件名字,索引节点指针以及与其他目录项之间的层级关系,多个目录项关联起来,形成目录结构.与索引节点不同的是,目录项内核维护,不存放在磁盘,而是缓存在内存中

索引节点唯一标识文件,目录项记录文件的名字,实际上目录项与索引节点之间的关系是多对一的,硬链接的实现就是多个目录项中的索引节点指向同一个inode节点,目录不是目录项,目录是一个文件(inode),目录项的inode指针要么指向目录,要么指向文件
在这里插入图片描述
磁盘进行格式化时,会划分三个区域,分别是超级块,索引节点区和数据块区

  • 超级块:存储文件系统的详细信息,比如块大小,块个数以及空闲块
  • 索引节点区,存储索引节点
  • 数据块,存储文件或者目录数据

上述区进入内存的时机是不同的,全部放入的话内存压力过大,加载进内存的时机如下

  • 超级块:文件系统挂载时装载
  • 索引节点区:当文件访问时进入

虚拟文件系统

文件系统种类众多,操作系统希望对用户提供一个同一的接口,引入了虚拟文件系统这个中间层
VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的接口即可
在这里插入图片描述
linux提供的文件系统主要有以下三类

  • 磁盘文件系统 :直接把数据存储在磁盘中,比如ext2/3/4 等
  • 内存文件系统:文件系统的数据占用内存空间,代表有/proc,/sys(都是存放内核的统计数据和配置等信息),读写这类文件,实际上读取的是内核中的相关数据
  • 网络的文件系统:访问其他计算机的文件系统,比如NFS等

文件系统需要挂载之后才能使用,比如Linux启动时,会把文件系统挂载在根目录下

文件的使用

用户使用文件的方式如下
在这里插入图片描述
打开文件后,操作系统为每个进程维护一个打开文件表,文件表中的每一项为文件描述符,中间的内容如下

  • 文件指针:跟踪上次读写位置,对打开文件的某个进程来说是唯一的
  • 文件打开计数器:文件关闭时,操作系统必须重用打开文件条目(否则存储压力过大),多个进程打开同一个文件,因此需要记录最后一个关闭的进程,最后一个关闭才删除
  • 文件磁盘位置:文件操作修改数据,信息保存在内存中和,避免每个操作都是裸IO
  • 访问权限:每个进程打开文件都有一个访问模式,以便操作系统允许或者拒绝后续的IO请求

文件的存储

文件的存储有以下两种方案:连续存储和非连续存储

连续存储

文件存放在磁盘连续的空间中,指定起始块位置和长度即可存储和访问文件,缺点磁盘空间碎片(外部碎片)和文件长度不易扩展的缺点

非连续空间存放方式

链表方式

链表方式存放的是离散的文件块,这样存放可以消除磁盘碎片,同时文件的长度可以动态扩展,根据实现方式的不同,链表方式还可以分为隐式连接和显示连接两种

  • 隐式链接:文件头包含第一块和最后一块,每个文件快包含下一个文件块(很像自己实现的带头尾指针的链表)
  • 显示链接:将数据块指针显式的存放在内存的链表中,这样的表格称为FAT

索引方式

索引方式是为每个文件创建一个索引数据块,里面放的是指向文件数据块的指针列表在这里插入图片描述
当一个索引数据块存放不了索引时,有如下两种解决方式
在这里插入图片描述
在这里插入图片描述
上图的方式就是多级索引的雏形了,不过上面是二级索引

优点:

  • 文件创建,增大,缩小很方便
  • 不会有碎片问题
  • 支持顺序读写的随机读写

Linux文件的实现方式

在这里插入图片描述
根据文件的大小,存放的方式有所变化

  • 如果存放文件所需的数据块小于 10 块,则采用直接查找的方式
  • 如果存放文件所需的数据块超过 10 块,则采用一级间接索引方式
  • 如果前面两种方式都不够存放大文件,则采用二级间接索引方式
  • 如果二级间接索引也不够存放大文件,这采用三级间接索引方式

那个索引节点inode包含13个指针,10个直接指向数据块的,第11个指向一级索引的,第12个指向二级索引的,第13个指向三级索引的

空闲分区的管理

磁盘的空闲分区也需要进行管理,几种常见的管理方式如下

  • 空闲表法:为所有的空闲空间建立一张表,表内容为空闲区的第一个块号和空闲区块的个数,如果空闲区比较多的情况下,表的开销巨大
  • 空闲链表法:使用链表的方式管理空闲空间,每个空闲的块中有下一个指针指向空闲块
  • 位图法:位图利用二进制来表示磁盘中一个盘块的使用情况,值为0表示对应的盘块空闲,值为1表示对应的盘块已分配,linux系统即是采用位图的方式进行磁盘空间的管理,不仅是空闲磁盘空间的管理,还有inode空闲区间的管理

文件系统结构

Linux使用位图的方式管理空闲空间,用户创建新文件时,Linux通过inode的位图找到空闲可用的inode,进行分配,存储数据时,通过块的位图找到空闲的块并分配,一个页的位图最多能表示128Mb的数据,远远小于文件的大小,Linux提出了一个块组的概念
在这里插入图片描述

目录的存储

Linux将目录存储成了文件,甚至可以使用vim打开,普通的文件保存的是文件数据,目录文件保存的是目录中一项一项的文件信息
在这里插入图片描述

软链接和硬链接

硬链接和软链接用于提供文件共享使用功能,实现方式不相同
硬链接是多个文件目录项中的索引节点指向同一个inode,由于inode无法跨越文件系统,所以硬链接无法跨域文件系统,并且仅当所有硬链接和源文件被删除时,源文件才会被真正的删除
在这里插入图片描述
软链接相当于重新创建了一个文件,这个文件的inode独立,不过这个文件的内容是另一个文件的路径,因此软练可以跨越文件系统.
在这里插入图片描述

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

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

相关文章

六、代理模式

文章目录 一、代理模式1、代理模式的好处和缺点1.1 代理模式理解加深 一、代理模式 为什么要学习代理模式? 代理模式是Spring AOP 以及 Spring MVC 的底层!!并且还是 JAVA 的23种设计模式之一!! 代理模式的分类&#…

C++ | 哈希表的实现与unordered_set/unordered_map的封装

目录 前言 一、哈希 1、哈希的概念 2、哈希函数 (1)直接定址法 (2)除留余数法 (3)平方取中法(了解) (4)随机数法(了解) 3、哈…

Nginx解决文件服务器文件名显示不全的问题

Nginx可以搭建Http文件服务器,但默认的搭建会长文件名显示不全,比如如下: 问题:显示不全,出现...,需要进行解决 这里使用重新编绎nginx的方式,见此文: https://unix.stackexchange…

刷题笔记 day4

力扣 611 有效三角形的个数 首先需要知道如何判断 三个数是否能构成三角形。 假如 存在三个数 a < b < c&#xff0c;如果要构成三角形&#xff0c;需要满足&#xff1a; ab > c ; a c > b ; b c > a ; 任意两个数大于第三个数就可构成三角形。 其实不难…

网络编程 IO多路复用 [select版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 select函数 功能&#xff1a;阻塞函数&#xff0c;让内核去监测集合中的文件描述符是否准备就绪&#xff0c;若准备就绪则解除阻塞。 原型&#xff1a; #include <sys/select.…

Codeforces Round 889 (Div. 2)(视频讲解A——D)

文章目录 A Dalton the TeacherB Longest Divisors IntervalC2 Dual (hard Version)D Earn or Unlock Codeforces Round 889 (Div. 2)&#xff08;视频讲解A——D&#xff09; A Dalton the Teacher #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f us…

设计模式大白话——装饰者模式

装饰者模式 文章目录 装饰者模式一、概述二、应用场景三、代码示例四、小结 一、概述 ​ 装饰者模式&#xff0c;此模式最核心之处在于装饰二字&#xff0c;之所以需要装饰&#xff0c;是因为基础的功能无法满足需求&#xff0c;并且装饰是临时的&#xff0c;并不是永久的&…

idea调节文字大小、日志颜色、git改动信息

idea调节菜单栏文字大小&#xff1a; 调节代码文字大小&#xff1a; 按住ctrl滚动滑轮可以调节代码文字大小&#xff1a; 单击文件即可在主窗口上打开显示&#xff1a; idea在控制台对不同级别的日志打印不同颜色 &#xff1a; “grep console”插件 点击某一行的时候&#x…

二叉树(C语言)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

Java+SpringBoot+Mybaties-plus+Vue+ElementUI 基于协同过滤算法商品推荐系统

一.项目介绍 协同过滤算法商品推荐系统分为两类角色 普通用户以及超级管理员 普通用户&#xff1a; 查看推荐商品、加入购物车、收藏、评论、个人中心、查看订单状态、编辑收货地址 超级管理员&#xff1a; 维护个人信息、维护用户管理、维护商品类型管…

解决构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!!!

问题描述&#xff1a; 在使用spring进行构建项目时&#xff0c;出现下载依赖迟迟不成功&#xff0c;显示maven wrapper 下载失败的问题。 Maven wrapper Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/ap…

【Linux命令200例】patch 用于将补丁文件应用到源码中

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

如何用python画一朵花,用python画彩色六边形

大家好&#xff0c;小编为大家解答用python画彩色六边形的问题。很多人还不知道如何用python画一朵花&#xff0c;现在让我们一起来看看吧&#xff01;

linux 学成之路(基础篇)(二十三)MySQL服务(下)

目录 一、用户权限管理概述 二、用户权限类型 三、用户赋予权限 四、删除权限 五、删除用户 一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面&#xff0c;它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和…

【phaser微信抖音小游戏开发004】往画布上增加文本以及文本的操作

我们在states中创建st004.js的类&#xff0c;或者将states中的index.js直接重命名为st004.js&#xff0c;把里面的类名也修改为st004.如下图 在main.js中&#xff0c;引入st004,并设置启用的state为st004。如下图 接下来到states/st004里面&#xff0c;在create里面将文本修改一…

Rust ESP32C3开发

Rust ESP32C3开发 系统开发逐步使用Rust语言&#xff0c;在嵌入式领域Rust也逐步完善&#xff0c;本着学习Rust和ESP32的目的&#xff0c;搭建了ESP32C3的环境&#xff0c;过程中遇到了不少问题&#xff0c;予以记录。 ESP-IDF开发ESP32 这一部分可跳过&#xff0c;是使用C开…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计参考资料效果一览 基本介绍 1.MATLAB实现GRNN广义回归神经网络时间序列预测(完整源码和数据) …

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

【Python】Web学习笔记_flask(2)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境4

7、使用串口工具 &#xff08;1&#xff09;连接硬件 连接 Type C 线&#xff0c; 一端电脑一端开发板 查看设备是否已经正确识别&#xff1a; 在 Windows 下可以打开设备管理器来查看 如果没有发现设备&#xff0c; 需要确认有没有装驱动以及接触是否良好 &#xff08;2&a…