MIT 6.S081 文件系统的基本结构 (Lab10:File system)

目录

文件系统

文件系统层次

底层物理层的实现

buffer cache(块缓存) VS icache(inode缓存)

块的分布情况

inode

目录

XV6文件系统的实践

实验Lab

Large files 

实验总结


文件系统

文件系统层次

从宏观上而言,文件系统的分布如下图所示,最底层是实际的物理disk以及其驱动程序,上方是buf cache,缓存区缓存,用于对物理块的缓存,再上方是日志logging,之后是icache,将最近使用的inode信息缓存到内存中,提升文件系统的效率,也方便对同一物理块的不同inode节点统一写回,在上方就是inode数据结构,和文件一一对应,在上方就是应用层的文件名和文件描述符。

底层物理层的实现

如下图所示,底层存储设备包括SSD(机械硬盘)和HDD(固态硬盘),这些设备连接在主板上,通过总线和CPU,内存等联通,通过PCI或PCIe协议进行通信。在物理设备上的最小单位通常称为扇区,常见的扇区大小为512B,但在操作系统或文件系统中最小使用单位为块,一个块通常为几个扇区(例如XV6中块大小为1024B,为2个扇区)。CPU和磁盘的通信也是根据块编号进行读写通信的。

buffer cache(块缓存) VS icache(inode缓存)

日志记录不必多说,接下来是两个缓存,块缓存是对物理硬盘上的块(无论是数据块还是inode所在的索引块)进行缓存,inode缓存是对实实在在的inode进行缓存。两者位于不同的层次,inode节点重点在于提供文件信息以及提供文件数据所在的位置,而块缓存实际上更多的是物理的扇区到操作系统的块之间的一种抽象。两者都能极大的提升文件系统的效率,但所在的层次不同。

块的分布情况

块的分布情况如下图所示,如XV6这种简单的操作系统就是一个巨大的块的数组,在其他操作系统中可能有更加复杂的结构(树结构等)。一般而言第一块都是boot块,也就是操作系统的启动块,每次开机后都会执行该块中的内容。第二块称为“super block”,他主要存储关于文件系统的信息,比如文件系统采用的架构,大小,结构等。之后的2-31块称为log日志块,存储日志信息。接下来的32-44,存放所有的inode节点,这里每个inode是64B,则每个块包含16个inode节点。随后的45块表示bitmap块(位图块),其中每一位仅用0/1表示数据块/inode节点的占用信息。46块之后的都是数据块,即实际存储文件数据的地方。

inode

inode(Index Node)也叫索引节点,其主要作用用于存储文件的元数据而不是文件本身的数据。元数据含义是存储数据的数据,例如文件类型(目录/文件)、文件大小,存储该文件的数据块的指针等信息。在文件系统中,inode和真正的文件(本质不同)一一对应,也就是当inode用完时,文件系统不可再创建新的文件了。

在xv6中inode节点的信息如下,包括类型type,nlink链接个数,size文件大小,以及bn0-bn11这12个直接块编号分别指向该文件的数据块,以及一个间接索引块,其指向了一个索引块,索引块中包含了256个快编号,所以一个inode节点最大的文件大小是(256+12)*1024B=268KB。

目录

在Unix操作系统中有一个“一切皆文件”的概念,大概意思是说操作系统把所有输入/输出资源都抽象成”文件“接口,这样同一的抽象处理使得程序员大大方便了很多,这里目录也不例外。

目录也是有inode节点存储,其中type类型为目录,其数据块中存储的是一个个目录项,在xv6中目录项如下图所示,一个目录项有16字节,前2个字节存储对应的inode编号,后14个字节存储文件名称,所以一个数据块中最多包含1024/16=64个目录项。

这里举一个查找文件的例子,比如要抄找“/y/x”文件,则首先先寻找根目录inode编号(一般固定在inode块的第二个,第一个通常保存文件系统的坏块列表),这个是提前固定好的,之后根据此inode节点中找到其数据块,其是目录,数据块中存放的全是目录项,朝朝filename为‘y’的,找到之后返回其inode编号,之后再根据此inode编号找到其inode节点,根据数据块找到filename为‘x’的inode编号,此时就找到了x的inode节点编号。(相对路径查询则直接从当前目录出发查找,流程类似)。

XV6文件系统的实践

首先在启动qemu后,可以看到文件系统的初始化,如下图所示,白色的是提前创建好的文件,下方则是对文件系统的说明,46个块包含1个boot块,一个super块,30个log块,13个inode 块以及1个bitmap块,最后的是954个数据块,一共1000个块,是一个很小的文件系统了。

接下来,看一下执行echo hi > x指令,涉及到的块来体会文件系统具体的工作流程,如下图所示。

首先是创建文件x,第一次到块33是找一个空闲的inode编号,之后第二个33是在inode节点中修改信息,之后的块46是根目录的数据块,要增加一个目录项,随后回到块32,修改根目录inode的size属性,最后块33暂且不提。之后是写“hi”到数据块中,首先在bitmap块中将inode节点编号和块编号都改为1,表示已用,随后找到空闲数据块595,先后写下‘h’和‘i’,最后回到块33也就是文件x所在inode节点修改size。最后写'\n'为文件结束符,同样先后经过595和33.

之后我们结合xv6中的代码来看一下他具体的流程,以下是echo的用户程序:

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int
main(int argc, char *argv[])
{
  int i;

  for(i = 1; i < a
【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
### MIT xv6操作系统实验中Lab9文件系统的文档和指南 在MIT的xv6操作系统课程中,Lab 9专注于实现一个简单的日志结构文件系统(log-structured file system, LFS)。这个实验室的目标是让学生理解并实践如何设计和实现一种高效的文件系统,这种文件系统通过将所有的写操作顺序记录在一个日志中来提高性能。 #### 实验目标 学生需要修改`fs.c`中的函数以支持LFS的功能。这涉及到重写磁盘块分配逻辑以及引入新的机制来处理垃圾回收等问题[^1]。 #### 关键概念 - **Log Structured File System (LFS)**: 日志结构化的文件系统不覆盖已有的数据块而是追加新版本到日志末端。 - **Segment**: 文件系统被划分为多个段(segment),每个段包含若干个连续的数据块。 - **Checkpointing**: 定期保存当前状态的一个快照以便于恢复。 - **Garbage Collection**: 清理不再使用的旧版本数据块以释放空间给未来的写入操作。 #### 主要任务 为了完成此实验,参与者通常会经历以下几个方面的工作: - 修改`balloc()` 和 `bread()` 函数使得它们能够管理基于日志的空间而不是传统的位图(bitmap)方式。 - 更新`iwrite()` 来确保每次更改都先记入日志再提交至最终位置。 - 设计并实施有效的垃圾收集算法用于清理过时的日志条目。 ```c // Example of modifying balloc to support log-based allocation. struct superblock { int size; // Number of blocks. int nblocks; // Total number of data blocks. int ninodes; // Number of inodes. }; int lfs_balloc(struct superblock *sb){ static uint next_block = 0; if(next_block >= sb->nblocks) panic("out of blocks"); struct buf* bp = bread(sb->size + next_block); next_block++; return bp->blockno; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值