码农知识堂 - 1000bd
Python
PHP
JS/TS
JAVA
C/C++
C#
GO
Kotlin
Swift
文件系统相关
文件系统
部分的大纲要求:
文件系统的全局结构:文件系统在外存中的结构,文件系统在内存中的结构
外存空闲空间管理办法
虚拟文件系统
文件系统挂载
一、文件系统的层次结构
可分为三个层次:最低层是对象及其属性,
中间层
是对对象进行操纵和管理的软件集合,最高层是文件系统(提供给用户的)接口
对象及其属性:文件系统管理三类对象
文件
目录
磁盘(磁带)存储空间
对对象进行操纵和管理的软件集合:是文件系统的核心部分。一般将与文件系统有关的软件分为4个层次:
I/O控制层:是文件系统的最低层,主要由磁盘驱动程序等组成,也可称为设备驱动程序层
基本文件系统:主要用于实现内存与磁盘之间数据块的交换
文件组织模块:也称为基本I/O管理程序,该层负责完成与磁盘I/O有关的事务,如将文件逻辑块号变为物理块号、管理磁盘中的空闲盘块、指定I/O缓冲等
逻辑文件系统:用于处理并记录同文件相关的操作,如允许用户和应用程序使用符号文件名访问文件和记录、保护文件和记录等。
文件系统接口:文件系统以接口的形式提供了一组对文件和记录进行操作的方法和手段。常用的两类接口是:
命令接口:终端命令
程序接口:系统调用
二、文件系统布局
一个磁盘从出厂->物理格式化->逻辑格式化这个过程中,文件系统在外存中是如何被建立的
物理格式化:磁盘刚被生产出来的时候没有划分扇区,此时要进行物理格式化(也称低级格式化),即划分扇区、检测坏扇区,并用备用扇区替换坏扇区。坏扇区的存在对操作系统来说是透明的(即OS意识不到坏扇区的存在)
逻辑格式化:即磁盘分区(分卷),完成各分区的文件系统初始化。逻辑格式化后,灰色部分就有数据了,白色部分还没有数据
文件系统在磁盘中的结构:
整体:多个磁盘划分为一个或多个分区,每个分区有一个独立的文件系统。文件系统包含:启动操作系统的方式、总块数、空闲块数量和位置、目录结构、各个具体文件等
下图是一个可能的文件系统布局,对其中一些部分的解释如下(前五个是在逻辑格式化后就有了实际数据,见上一个序号):
主引导记录MBR:位于磁盘的0号扇区,后面就是分区表,该表给出每个分区的起始和结束地址。当计算机启动时,BIOS读入并执行MBR,MBR做的第一件事就是确定活动分区,读入它的第一块,即引导块
引导块:引导块中的程序负责启动该分区中的操作系统。
超级块:包含文件系统的所有关键信息(如分区的块数量、块大小、空闲块的数量和指针、空闲的FCB数量、FCB指针等)。计算机启动时或在该文件系统首次使用时,超级块会被读入内存。有了超级块就可以迅速找到这个磁盘分区里面所有的空闲块。用于新建一个文件时迅速分配多个磁盘块
文件系统中空闲块的信息,可使用位示图或指针链接的形式给出。位示图可以迅速的判断某一个特定的磁盘块是否空闲(超级块的作用是迅速找到若干个空闲盘块)。
位示图、超级块这两个数据结构在功能上有一定重合性(都可以标记哪些盘块空闲),但在实际使用中侧重点会有一些区别
索引节点在i节点区连续存放,且大小相同,因此可以通过一个索引节点的下标迅速定位到一个指定的索引节点
根目录
文件系统在内存中的结构
如下图,用户区有“文件描述符fd”;内核区有当前打开目录的缓存、系统打开文件表、进程(用户)打开文件表
三、外存空闲空间管理
四、虚拟文件系统VFS
各种文件系统存在的问题
不同的文件系统(UFS/NTFS/FAT),其函数名和参数不同(如UFS是open(参数a, b);NTFS是fopen(参数x);FAT是openf(参数p, q)),用户使用文件系统时没有统一接口
不同的文件系统都使用同一VFS,新添加一个文件系统或修改一个文件系统的代码就去修改内核区VFS的代码显然不现实
不同的文件系统,表示文件的数据结构也不相同。打开文件后,其在内存中的表示也不同(如UFS的目录项和inode、FAT的目录项)
为解决上述问题,VFS的特点/作用:
向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求
每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统
综上,如下图:
五、文件系统挂载
文件系统挂载要做的事:
在VFS中注册新挂载的文件系统:内存中的挂载表包含每个文件系统的相关信息(文件系统类型、容量大小等)
新挂载的文件系统,要向VFS提供一个函数地址列表(如上图中的黄色小表。这样才能让VFS能够调用新挂载的文件系统所提供的功能函数)
将新文件系统加到挂载点,也就是将新文件系统挂载在某个父目录下
相关阅读:
MySQL基础---SQL语句2(WHERE、AND、OR、ORDER BY、COUNT)
关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一
【相机方案(2)】V4L2 支持相机图像直接进入GPU内存吗?DeepStream 确实可以将图像数据高效地放入GPU内存进行处理!
WEB自动化测试(6)—— 命令行运行Cypress
如何本地搭建Plex私人影音云盘教程,实现Plex家庭影音中心,打造超级多媒体中心
java毕业设计体育馆预定管理平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw
从入局到破局:商家怎样挖掘视频号的新增量?
UE4 绑定事件到点击时(不用射线检测)
C# 迭代器
CSS技巧专栏:一日一例 3.纯CSS实现炫酷多彩按钮特效
原文地址:https://blog.csdn.net/qq_43527718/article/details/133973885
最新文章
攻防演习之三天拿下官网站群
数据安全治理学习——前期安全规划和安全管理体系建设
企业安全 | 企业内一次钓鱼演练准备过程
内网渗透测试 | Kerberos协议及其部分攻击手法
0day的产生 | 不懂代码的"代码审计"
安装scrcpy-client模块av模块异常,环境问题解决方案
leetcode hot100【LeetCode 279. 完全平方数】java实现
OpenWrt下安装Mosquitto
AnatoMask论文汇总
【AI日记】24.11.01 LangChain、openai api和github copilot
热门文章
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
奉劝各位学弟学妹们,该打造你的技术影响力了!
五年了,我在 CSDN 的两个一百万。
Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
面试官都震惊,你这网络基础可以啊!
你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
心情不好的时候,用 Python 画棵樱花树送给自己吧
通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
13 万字 C 语言从入门到精通保姆级教程2021 年版
10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系
2656653265@qq.com
京ICP备2022015340号-1
正则表达式工具
cron表达式工具
密码生成工具
京公网安备 11010502049817号