文件系统(操作系统实验)

实验内容

(1)在内存中开辟一个虚拟磁盘空间作为文件存储器, 在其上实现一个简单单用户文件系统。 在退出这个文件系统时,应将改虚拟文件系统保存到磁盘上, 以便下次可以将其恢复到内存的虚拟空间中。

(2)要求提供有关操作:format, create, rm, mkdir, rmdir, ls…

format:对文件存储器进行格式化,即按照文件系统对结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。

mkdir:用于创建子目录;

rmdir:用于删除目录;

ls:用于显示目录;

cd:用于更改当前目录;

create:用于创建文件;

open:用于打开文件;

close:用于关闭文件;

write:用于写文件;

read:用于读文件

rm:用于删除文件

实验原理:

磁盘分区方式:

superblock super; // 超级块FAT fat;           // FAT 表bitmap bm;         // 磁盘块的位识图inodemap im;       // 索引节点的位示图inode inodes[INODE_SUM]; // 索引节点inode root;               // 根目录的索引节点block blocks[BLOCK_SUM]; // 其他索引节点

文件管理系统数据成员:

disk *diskptr;                          // 管理的虚拟磁盘char *filepath;                         // 虚拟磁盘保存的位置Buf wdir;                               // 工作目录Buf wfile;                              // 文件操作缓冲区Filebuf wprt[10];                       // 读写指针int cur_blockid = 0;                    // 当前工作目录下的第一个盘块int cur_inode = -1;                     // 当前工作目录下的索引节点string workpath;

算法思路:

用FAT表对磁盘块进行链接存储,索引节点和磁盘块均采用位示图的方式进行管理和分配根节点的索引节点号为 -1。

对文件或者目录进行修改删除时,均先切换到对应得目录下再进行操作,执行完毕后再返回原来得工作目录。

程序退出时先将虚拟磁盘写回到目录再退出。

编译执行命令: g++ -o main *.cpp && ./main

效果展示

列出当前目录项得文件和文件夹

查看文件内容

创建文件夹

删除文件夹

创建文件,并读写文件

程序退出时保存原来得磁盘情况

保存的磁盘文件 16进制展示

超级块和部分FAT表

部分根目录:

保存的部分文件内容

保存的磁盘文件大小:

部分源码

data.hpp

#pragma once
#define BLOCK_SIZE 512      // 磁盘块大小 512 B
#define ENTRIES_PER_BLOCK 4 // 每个磁盘块最多 4 个目录项
#define BLOCK_SUM 2048      // 磁盘块数
#define INODE_SUM 2048      // 索引节点数
#define DIRSTY 0            // 目录
#define FILESTY 1           // 普通文件
#define READ 1              // 读权限
#define WRITE 2             // 写权限

disk.hpp

#pragma once
#include "data.hpp"class superblock
{
public:int block_sum; // 盘块的数量int inode_sum; // 索引节点的数量superblock();
};class FAT
{
public:int next[BLOCK_SUM]; // 链表法FAT();
};class bitmap
{
public:char map[BLOCK_SUM / 8]; // 位示图bool empty(int no);      // 判断磁盘块是否分配void set(int);           // 将磁盘块置为已分配void free(int);          // 回收磁盘块bitmap();                // 初始化,全部为未分配int get();               // 申请一个磁盘块,成功则返回磁盘块号,否则返回 -1
};class inodemap
{
public:char map[INODE_SUM / 8];bool empty(int no); // 返回当前节点是否为空void set(int);void free(int);inodemap(); // 初始化位示图int get();
};class inode
{
public:int firstblock; // 第一个盘块号int type;       // 文件类型
};class entry
{
public:bool flag;      // 目录项是否有效char name[123]; // 文件名int node;       // 索引节点号entry();
};union block // 磁盘块,有两种组织形式,普通文件目录的形式
{
public:char data[BLOCK_SIZE];entry entries[ENTRIES_PER_BLOCK];block();
};class disk
{
public:superblock super;FAT fat;bitmap bm;inodemap im;inode inodes[INODE_SUM];inode root;block blocks[BLOCK_SUM];disk();
};

FS.hpp

#pragma once
#include <string>
#include "disk.hpp"
using std::string;union Buf // 缓存区,主要用于将目录、文件放到缓冲区处理
{entry entries[4096];char data[524288];block blocks[512];Buf();
};class Filebuf // 读文件工作区,保存已经打开的文件及权限
{
public:bool flag = false;inode fnode;char mod = 0;char name[123];int fafblock; // 父目录的第一个盘块
};class FS
{disk *diskptr;                          // 管理的虚拟磁盘char *filepath;                         // 虚拟磁盘保存的位置Buf wdir;                               // 工作目录Buf wfile;                              // 文件操作缓冲区Filebuf wprt[10];                       // 读写指针int cur_blockid = 0;                    // 当前工作目录下的第一个盘块int cur_inode = -1;                     // 当前工作目录下的索引节点void loadbuf(int firstblock, Buf &buf); // 载入缓冲区,可以执行工作目录和文件操作缓冲区的加载void writebackdir(int firstblock);      // 写回目录,常常在切换工作目录时写回void writebackfile(int firstblock);     // 写回文件,完成写文件后写回void delfile(int firstblock);           // 删除文件,包括目录和普通文件/*------------------ 原子操作(只允许在当前目录下操作) --------------------------------------*/int cd(const char *);      // 切换目录,原子操作,返回 1 表示没有该目录void create(const char *); // 创建文件void rmdir(const char *);  // 删除文件void mkdir(const char *);  // 创建目录void ls();                 // 列出当前目录下的文件和文件夹string getfolerpath(string);string getfilename(string);public:string workpath;FS(char *file); // 对磁盘格式化,或导入已有的磁盘文件~FS();          // 写回磁盘并保存/*------------------ 原子操作(只允许在当前目录下操作) --------------------------------------*/int open(const char *, char mod); // 返回一个 wptr,只能打开当前目录的文件void write(int, const char *);    // 写文件,第一个参数为写指针,第二个参数为写的内容void close(int);                  // 关闭文件void read(int);                   // 读文件,参数为读指针void rm(int);                     // 删除文件,需要先打开文件才能删除/*--------------------- 允许任何在路径下操作(只有changedir 会改变工作路径)------------------------------*/int changedir(const char *);                // 切换工作目录void createfile(const char *);              // 创建文件,参数为文件路径void removedir(const char *);               // 删除文件夹,参数为文件夹路径void list(const char *);                    // 列出指定目录下的文件和文件夹void makedir(const char *);                 // 创建文件夹,参数为文件夹路径int openfile(const char *, char);           // 打开指定文件,第二个参数为读写权限,返回读写指针void writefile(const char *, const char *); // 写文件,第一个参数为文件路径,第二个为写入内容void readfile(const char *);                // 读文件void removefile(const char *);              // 删除文件
};

main.cpp

#include <iostream>
#include <string>
#include "FS.hpp"
using namespace std;char file[] = "./FileSys";
FS fs(file);int main()
{cout << "/>";string op;string contxt;string par;int wptr;while (cin >> op){if (op == "ls"){char a = getchar();if (a == '\n'){char path[] = ".";fs.list(path);}else{cin >> par;fs.list(par.c_str());}}if (op == "cd"){cin >> par;fs.changedir(par.c_str());}if (op == "touch"){cin >> par;fs.createfile(par.c_str());}if (op == "mkdir"){cin >> par;fs.makedir(par.c_str());}if (op == "rmdir"){cin >> par;fs.removedir(par.c_str());}if (op == "open"){cin >> par;wptr = fs.openfile(par.c_str(), READ | WRITE);}if (op == "write"){cin >> par;char line[524288];contxt = "";cin.get();cin.getline(line, 524288, '\n');cin.clear();while (string(line) != "EOF"){contxt += string(line) + '\n';cin.getline(line, 1024, '\n');cin.clear();}fs.writefile(par.c_str(), contxt.c_str());}if (op == "cat"){cin >> par;fs.readfile(par.c_str());}if (op == "rm"){cin >> par;fs.removefile(par.c_str());}if (op == "quit")break;if (op == "close"){fs.close(wptr);}cout << fs.workpath << ">";}
}

doc.txt(转载自China Daily)

Precipitation on Tibetan Plateau underestimated
By YAN DONGJIE | China Daily | Updated: 2024-06-07 09:17
Precipitation across the Tibetan Plateau, which is known as Asia's water tower, has been significantly underestimated, Chinese researchers said in a paper published in the Proceedings of the National Academy of Sciences late last month.
The researchers, from the Chinese Academy of Sciences' Institute of Tibetan Plateau Research, said the underestimation is caused by the measuring instruments used and the method of calculation, and called for a "redesigned precipitation observation strategy" to remedy it.
A substantial proportion of precipitation over the plateau falls as snow, often accompanied by strong winds.
The researchers said ground-based instrument monitoring is widely regarded as the primary and most reliable technique for acquiring precipitation data, but traditional ground-level precipitation gauges have a limited cross-section in the collection cylinder and a sealed bottom.
"This design results in the formation of upward supporting airflow under windy conditions, which in turn prevents raindrops or snowflakes from entering the gauge cylinder. Consequently, this leads to an underestimation of precipitation in this region," said Miao Chiyuan from Beijing Normal University, the first author of the study.
Miao said the instrument measurement error caused by strong winds is the primary factor affecting the accuracy of precipitation measurements in high-altitude regions, with errors under extreme weather conditions potentially exceeding 100 percent.
Apart from the equipment, variations in altitude can cause mistakes in the data collected. Weather stations in the region are often placed in valleys or lower areas for convenience, which means they miss out on precipitation that occurs at higher elevations. Additionally, the limited number of stations and their uneven distribution can make the data even less accurate, according to the study.
The Tibetan Plateau, home to more than 100,000 square kilometers of glaciers and 1 million sq km of frozen soil, serves as the source of 10 major Asian river systems flowing into 10 countries, and supports the lives of about 2 billion people.
"In the context of accelerated warming, precipitation across the Tibetan Plateau plays a critical role in water cycles. Accordingly, obtaining reliable precipitation information is a prerequisite for water cycle analysis, future climate projections, and water-related disaster risk assessments," said the institute's Li Xin, the corresponding author of the research.
EOF

file.txt

Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
snap
Desktop/lab1
Desktop/lab2
Desktop/lab3
Desktop/lab4
Desktop/lab5
snap/firefox
snap/firefox/3836
snap/firefox/4336
snap/firefox/common
snap/snapd-desktop-integration
snap/snapd-desktop-integration/83
snap/snapd-desktop-integration/common

存储大文件存在一点问题,自行修改

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生煤矿智能化综合管控平台

煤矿可视化通过图扑 HT 实现实时数据集成和三维建模仿真&#xff0c;呈现井下环境、设备状态和生产状况等多维度数据&#xff0c;帮助管理人员进行直观监控和精准分析。该技术提升了运营效率和安全水平&#xff0c;为煤矿作业提供了智能化的管理解决方案&#xff0c;有助于减少…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis&#xff1f; redis是一种键值型数据库&#xff0c;内部所存的数据都是键值对的形式&#xff0c;例如&#xff0c;我们可以把一个用户数据存储为如下格式&#xff1a; 键值id$1600name张三age21 但是这样的存储方式&#xff0c;数据会显得非常松散&#xff0c;因…

云计算HCIE+RHCE学员的学习分享

大一下学期&#xff0c;我从学长嘴里了解到誉天教育&#xff0c;当时准备考RHCE&#xff0c;我也了解了很多培训机构&#xff0c;然后学长强烈给我推荐誉天&#xff0c;我就在誉天报名了RHCE的课程。 通过杨峰老师的教学&#xff0c;我学到了许多Linux知识&#xff0c;也了解了…

笔记本电脑部署VMware ESXi 6.0系统

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统&#xff08;Windows 11升级不了&#xff1f;但Win10就要停服了啊&#xff01;来&#xff0c;我教你&#xff01;&#xff09;&#xff0c;也介绍了…

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析&#xff1a;参考文档 方法 虚拟机关机&#xff0c;整个文件夹压缩后拷贝到新机器中&#xff0c;开机启用即可 成功的情况&#xff1a; Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

mysql5.7安装使用

mysql5.7安装包&#xff1a;百度网盘 提取码: 0000 一、 安装步骤 双击安装文件 选择我接受许可条款–Next 选择自定义安装&#xff0c;下一步 选择电脑对应的系统版本后(我的系统是64位)&#xff0c;点击中间的右箭头&#xff0c;选择Next 选择安装路径–Next 执行…

matlab可以把图像数据转换为小波分析吗

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片

中间件的常考方向&#xff1a; 中间件如何做到高可用和高性能的&#xff1f; 你在实践中怎么做的高可用和高性能的&#xff1f; Elasticsearch节点角色 Elasticsearch的节点可以分为很多种角色&#xff0c;并且一个节点可以扮演多种角色&#xff0c;下面列举几种主要的&…

【软件测试】白盒测试(知识点 + 习题 + 答案)

《 软件测试基础持续更新中》 最近大家总是催更……&#xff0c;我也是百忙之中给大家详细总结了白盒测试的重点内容&#xff01; 知识点题型答案&#xff0c;让你用最短的时间&#xff0c;学到最高效的知识&#xff01; 整理不易&#xff0c;求个三连 ₍ᐢ..ᐢ₎ ♡ 目录 一、…

Spring专题一:源码编译

下载源码 因为公司使用的是Spring5.2.x所以就下载了这个版本&#xff0c;github源码地址如下&#xff1a; GitHub - spring-projects/spring-framework at v5.2.6.RELEASE&#xff1a; 如果网络不稳定可以使用下载压缩版即可&#xff0c;网络稳定的话还是建议使用git clone …

【redis】redis RDB

1、概述 1.1定义 RDB (Redis Database) 是 Redis 的默认持久化机制&#xff0c;它能够在指定的时间间隔内将内存中的数据集快照写入磁盘。RDB 持久化产生的文件是一个经过压缩的二进制文件&#xff0c;通过该文件可以还原生成 RDB 文件时的数据库状态。 1.2特点 一次性全量备…

【工具分享】SQLmap

文章目录 工具介绍安装方式环境准备安装 sqlmap 工具介绍 sqlmap 是一个非常强大的自动化 SQL 注入工具&#xff0c;主要用于渗透测试和安全审计。它能够检测和利用 SQL 注入漏洞&#xff0c;进而访问数据库服务器。 GitHub&#xff1a;https://github.com/sqlmapproject/sql…

Everything 一款功能强大的搜索工具

要在电脑上使用Everything搜索文件&#xff0c;您需要使用以下步骤&#xff1a; 在您的电脑上下载并安装Everything软件。您可以从官方网站https://www.voidtools.com/downloads/下载最新版本的软件。 安装完成后&#xff0c;打开Everything软件。 在搜索栏中输入您要查找的文…

JsonCpp:更简洁的序列化及反序列化

简介 jsoncpp 提供了一组简单易用的 API&#xff0c;使得在 C 程序中处理 JSON 数据变得更加方便和高效。 安装 linux环境下安装jsoncpp sudo apt-get update sudo apt-get install --reinstall libjsoncpp-dev建立软链接确保编译器找到头文件 #include <json/json.h>…

Java数据结构6-栈与队列

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则 压栈…

机电公司管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;公告管理&#xff0c;考勤管理&#xff0c;请假管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;机电零件&…

gitee配置ssh教程

生成公钥 执行命令&#xff1a; ssh-keygen -t rsa查看公钥 cat ~/.ssh/id_rsa.pub这个公钥就是要复制粘贴到Gitee中的ssh公钥。 配置Gitee SSH公钥 来到Gitee的ssh公钥中&#xff0c;配置