操作系统学习(十)——文件系统

article/2025/8/4 5:42:28

一、文件系统

在操作系统中,文件系统是用于管理存储设备上数据组织与存取的一种机制。
它是操作系统的重要组成部分,承担着对文件的创建、读写、组织、存储、访问控制等管理任务。

功能:

  1. 文件的创建与删除
  2. 文件的读写与访问
  3. 目录管理
  4. 访问控制与权限管理
  5. 空间管理(分配与回收)
  6. 文件共享与保护
  7. 挂载与卸载文件系统

文件系统的关键内容:

  • 文件(File):用户数据和程序的逻辑单位,如文本、图像、音频、可执行程序等。
  • 目录(Directory):用于组织和管理文件的结构化机制。
  • 路径(Path):标识文件位置的字符串,如 /home/user/file.txt
  • 卷(Volume):操作系统逻辑上的存储单位,一个卷可以是整个磁盘或其中的一部分。
  • 文件控制块(FCB):用于描述文件属性的数据结构,如文件名、大小、创建时间、权限、指向数据块的指针等。

二、文件的实现

参考书——现代操作系统(第3版)。

1. 连续分配(Contiguous Allocation)

  • 所有文件内容存储在连续的物理块中。
  • 优点:访问速度快。
  • 缺点:容易造成碎片,不易扩展。

连续分配示意图:
在这里插入图片描述

2. 链式分配(Linked Allocation)

  • 每个文件由多个块组成,块之间通过指针链接
  • 优点:无外部碎片,易于扩展
  • 缺点随机访问慢,可靠性差(指针损坏)。

链式分配示意图:
在这里插入图片描述

3. 索引分配(Indexed Allocation)

  • 每个文件有一个索引块,索引块中存放文件所有块的地址。
  • 优点:支持快速随机访问,灵活。
  • 缺点:索引块可能较大,占用额外空间。

4. i节点(index-node)

  • i节点(Index Node) 是文件在磁盘上的元信息结构,不包含文件名,但包含文件的所有属性和数据块索引信息
  • 每个文件都有一个 i节点,系统通过目录项找到 inode 来访问文件内容。
  • i节点是 Unix 和类 Unix 系统(如 Linux)中文件的核心数据结构,是文件控制块(FCB)的一种实现方式。

i节点包含信息:

项目描述
文件类型普通文件、目录、符号链接等
文件权限rwx 属性(用户、组、其他)
所有者信息UID(用户ID)、GID(组ID)
时间信息创建时间(ctime)、访问时间(atime)、修改时间(mtime)
链接计数表示有多少目录项引用此 inode
文件大小字节为单位
数据块指针指向实际数据块的指针:直接块、间接块等

文件访问中i节点:

[文件名] → [目录项] → [inode编号] → [inode结构] → [数据块指针] → [磁盘块]
  • 用户层通过文件名访问,内核则始终是“通过 inode 访问内容”。

碎片问题

  • 内部碎片:文件未填满一个块,浪费部分空间。
  • 外部碎片:磁盘上存在零散的空闲块,不能合并使用。

处理方法:

  • 周期性磁盘整理(defragmentation);
  • 使用索引分配或日志文件系统避免外部碎片;
  • 文件系统设计支持空间复用与预分配

四、目录的实现

1. 目录的结构

单级目录结构:

  • 所有文件放在一个目录下,简单但不支持组织管理。

两级目录结构:

  • 每个用户一个独立目录,支持多用户。

树型目录结构(层次结构):

  • 支持嵌套子目录,是现代文件系统的主流结构(如 Linux、Windows)。

图型目录结构(带链接):

  • 支持硬链接与符号链接,实现多个路径访问同一文件。

2. 目录的实现方式

(1)线性表结构:

  • 所有目录项依次存放
  • 查找效率低:O(n);
  • 简单实现,适合小目录

(2)哈希表:

  • 提高文件名查找效率;
  • 增加实现复杂度;
  • NTFS、某些嵌入式文件系统使用。

(3)B+树/红黑树等平衡树:

  • 快速查找/插入/删除
  • ext4NTFS中使用(ext4使用 HTree/B-tree)。

五、空闲空间的管理策略

1. 位图法(Bitmap)

  • 用一个位图表示磁盘块的占用情况:1=已占用,0=空闲。

优点

  • 查找连续空闲块快;
  • 节省空间(1位表示1块)。

缺点

  • 对大磁盘位图也会很大。

2. 链表法(Free List)

  • 所有空闲块用链表链接

优点

  • 实现简单;
  • 插入删除效率高。

缺点

  • 不易查找连续空闲块。

3. 分组法(Grouping)

  • 空闲块分组,每组记录若干空闲块的位置。

优点

  • 减少读取空闲块的次数;
  • 提高分配速度。

4. 计数法(Counting)

  • 记录空闲块的起始块号和连续块数

优点

  • 适用于大块连续空闲空间;
  • 表示效率高。

六、文件系统的实现结构

  1. 应用层接口(API):如 open(), read(), write(), close() 等。
  2. 逻辑文件系统(LFS):处理文件描述、权限控制等。
  3. 文件组织模块(FOM):处理目录和文件结构。
  4. 基本文件系统(BFS):处理块分配、缓冲管理等。
  5. I/O 控制层(IOCS):驱动硬件与设备控制器。

七、常见的文件系统类型

文件系统支持平台特点
FAT32Windows简单、兼容性强,但不支持大文件(>4GB)
NTFSWindows支持权限、加密、压缩、日志
ext3/ext4Linux稳定可靠,支持日志、多用户管理
XFSLinux高性能、适合大文件
APFSmacOSApple 专用,支持快照与加密

八、现代特性(高级功能)

  • 日志文件系统(Journaling):记录操作日志,提高容错能力。
  • 配额管理:限制用户使用磁盘空间。
  • 快照(Snapshot):保存文件系统某个时间点状态
  • 加密与压缩:提高数据安全性与存储效率
  • RAID 支持:将多个物理磁盘组合成一个逻辑磁盘来实现数据冗余、性能提升或二者兼顾。

http://www.hkcw.cn/article/ojtFMquvJP.shtml

相关文章

【Linux】shell的条件判断

目录 一.使用逻辑运算符判定命令执行结果 二.条件判断方法 三.判断表达式 3.1文件判断表达式 3.2字符串测试表达式 3.3整数测试表达式 3.4逻辑操作符 一.使用逻辑运算符判定命令执行结果 && 在命令执行后如果没有任何报错时会执行符号后面的动作|| 在命令执行后…

Codeforces Round 1028 (Div. 2)(ABC)

A. Gellyfish and Tricolor Pansy 翻译: 水母和小花在玩一个叫 “决斗 ”的游戏。 水母有 a HP,花花有 b HP。 它们各有一个骑士。水母的骑士有 c HP,而花花的骑士有 d HP。 他们将进行一轮游戏,直到其中一方获胜。对于 k1、2、.…

智能化程度越高,算法“越狱”也会越来越多

前两天,有关美国人工智能(AI)公司OpenAI旗下推理大模型o3首次出现“不听人类指挥,拒绝关闭”的消息引发高度关注。这种现象应该不算技术性“错误”,而是算法(无意识性)“失误”——“算法越狱”…

Redis最佳实践——性能优化技巧之Pipeline 批量操作

Redis Pipeline批量操作在电商应用中的性能优化技巧 一、Pipeline核心原理与性能优势 1. 工作机制对比: sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis--&g…

机器人学基础——正运动学(理论推导及c++实现)

机器人正运动学 机器人正运动学一般是指从机器人的关节位置到基于参考坐标系下末端执行器的位置。 平移变换和旋转变换 平移变换 假设我们有两个坐标系A和B,坐标系A与B的方位相同,xyz轴的指向都是一致的,即没有旋转变换。有一点p&#xf…

玉渊谭天:中方香会行动的三个细节 现场观察与国际反响

在第22届香格里拉对话会上,观察到了几个细节,这些细节揭示了中方在这次对话会上的行动。在第一场全体会议上,国防大学的张弛教授提问美国国防部长如何处理美国联盟与东盟国家之间的关系。柬埔寨等东盟国家代表向张弛表示感谢,认为他的提问触及了关键问题,反映了东盟国家的…

Python-13(永久存储)

创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…

linux驱动开发(1)-内核模块

内核模块 模块最大的好处是可以动态扩展应用程序的功能而无须重新编译链接生成新的应用程序镜像,在微软的Windows系统上动态链接库DLL(Dynamic Link Library),Linux系统上的共享库so(shared object)文件的…

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正

在数字成像领域,图像信号处理器(ISP)如同幕后英雄,默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正,作为ISP预处理流程中的关键一环,直接影响着最终图像的质量。今天,我们就通过Pyth…

【数据结构】顺序表和链表详解(上)

前言:上期我们介绍了算法的复杂度,知道的算法的重要性同时也了解到了评判一个算法的好与坏就去看他的复杂度(主要看时间复杂度),这一期我们就从顺序表和链表开始讲起。 文章目录 一,顺序表1,线性表2,顺序表…

【笔记】在 MSYS2(MINGW64)中安装 Python 工具链的记录

#工作记录 📌 安装背景 操作系统:MSYS2 MINGW64当前时间:2025年6月1日Python 版本:3.12(默认通过 pacman 安装)目标工具链: pipxnumpypipsetuptoolswheel 🛠️ 安装过程与结果记录…

sqli-labs靶场32-37关(宽字节注入)

目录 前言 less32(宽字节注入) less33(宽字节注入) less34(POST型宽字节注入) less35(数字型闭合宽字节) less36(宽字节注入) less37(POST…

SRE 基础知识:在站点可靠性工程中可以期待什么

作者:来自 Elastic Elastic Observability Team 在过去的 20 年里,大多数领先企业已经采用云计算和分布式系统来开发它们的应用程序。一个意想不到的后果是:传统的 IT 运维( IT operations - ITOps )常常难以应对日益增…

day16 leetcode-hot100-31(链表10)

25. K 个一组翻转链表 - 力扣(LeetCode) 1.模拟法 思路 将这个过程拆解为两个步骤,第一步将单分组的节点反转,第二步将反转后的链表加入原链表。 针对节点反转很容易,参考之前的206. 反转链表 - 力扣(Le…

黑马Java面试笔记之Redis篇(使用场景)

1.面试题 我看你做的项目中,都用到了redis,你在最近的项目中那些场景使用了redis呢 2.提问的底层逻辑 面试官提问你这个问题一是想验证你的项目场景的真实性,二是为了作为深入发问的切入点 3.延伸出来的知识点 3.1 缓存 缓存三兄弟&#x…

PyTorch -TensorBoard的使用 (一)

设置环境 新建python文件 .py 安装Tensorboard 在终端进行安装 显示安装成功 两个logs,出现这种情况怎么解决 所有的logs文件删掉delete,重新运行 add_image 不满足要求 Opencv-numpy 安装Opencv add_image 用法示例 (500,375&am…

解决Ubuntu20.04上Qt串口通信 QSerialPort 打开失败的问题

运行Qt串口通信 open(QIODevice::ReadWrite) 时,总是失败。 1、打印失败原因 QString QSerialHelper::openSerail() {if(this->open(QIODevice::ReadWrite) true){return this->portName();}else{return "打开失败";//return this->errorStri…

[yolov11改进系列]基于yolov11引入迭代注意力特征融合iAFF的python源码+训练源码

【iAFF介绍】 1. IAFF(迭代注意力特征融合) iAFF通过引入多尺度通道注意力模块和迭代融合,更好的整合不同尺度和语义不一致的特征,有效解决特征融合问题,提高目标检测的精度。 特征融合,即不同层或分支的…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端,需要在controller类上加注解:ResponseBody; 这个注解其实在前面已经使用过,RestController其实就包含两个注解: Controller ResponseBody 返回值如果是实体对象/集合,将会转换为j…

idea中springboot2.7(由于步入另一个线程,已跳过 xxx 处的断点)

idea springboot2.7 debug 问题 springboot 2.7 debug 模式时引入 spring-boot-devtools 卡在代码中不往下执行&#xff0c;提示&#xff1a;由于步入另一个线程&#xff0c;已跳过 xxx 处的断点。 原因 springboot 2.7 引入 spring-boot-devtools <!-- debug时不推荐开…