Skip to content

操作系统课程设计,实现一个类似于UnixV6++的二级文件系统

Notifications You must be signed in to change notification settings

1696762169/OperatingSystemHW

Repository files navigation

OperatingSystemHW

项目介绍

本项目为同济大学操作系统课程设计作品,使用C#实现了一个二级文件系统,即在一个大文件中模仿文件系统的方式存储小文件。

使用方式

本项目的解决方案中包含两个项目,分别为OperatingSystemHW(服务器)与Client(客户端)。可以同时开启多个客户端程序,开启的客户端会自动连接到服务器。服务器使用本机端口8109,客户端端口由系统自动分配。

克隆仓库到本地后,启动解决方案,会分别生成一个服务器实例和一个客户端实例,并自动在生成的服务器可执行程序目录中生成名为disk.img的磁盘文件。若要开启多个客户端,需要找到生成的客户端可执行程序并手动执行。

客户端命令

客户端命令模仿Linux命令编写。文件路径默认为从当前工作目录起始的相对路径,使用绝对路径需要在原路径前增加斜线“/”,例如:

cd /            // 将当前工作目录更改为根目录
touch a.txt     // 在当前工作目录中创建名为a.txt的文件
touch /a.txt     // 在根目录中创建名为a.txt的文件
  • ls:显示当前目录下的文件和文件夹列表。
  • clear:清除控制台的显示内容。
  • cat:显示指定文件的内容。参数为文件路径。
  • stat:显示指定文件的状态信息,如文件大小、修改时间等。参数为文件路径,若不提供参数,则此命令将显示磁盘状态信息,如剩余空间大小等。
  • touch:创建一个新的空文件。参数为文件路径。
  • rm:删除指定文件。参数为文件路径。
  • mkdir:创建一个新的文件夹。参数为文件夹路径。
  • rmdir:删除指定文件夹。参数为文件夹路径,默认仅删除空文件夹,可提供-r参数递归删除其所有子文件夹,例如:
rmdir my_dir -r
  • cd:更改当前工作目录到指定的文件夹。参数为文件夹路径。
  • input:将外部文件系统中的文件移动到本系统中。参数为待移入文件路径、本系统中待创建文件路径。注意:移入会覆盖本系统中已存在的同名文件。
  • output:将本系统中的文件移动到外部文件系统中。参数为本系统中待移出文件路径、外部系统待创建文件路径。注意:移出会覆盖外部系统中已存在的同名文件。
  • open:打开指定文件,没有实用价值,仅供测试文件访问权限使用。打开的文件无法被其它客户端访问,当本客户端访问/修改文件后,文件会被自动关闭。参数为文件路径。
  • close:关闭指定文件,没有实用价值,仅供测试文件访问权限使用。参数为文件路径。
  • quit / exit:退出客户端程序。
  • help:显示帮助信息。

项目结构

本项目客户端仅负责向服务器发送控制台输入的指令内容,并输出服务器返回的文本信息,文件系统的核心功能均由服务器实现。文件服务器以自底向上的方式构建,共包含以下的四层结构,并通过TCP协议建立服务端与客户端之间的通信。

磁盘层

磁盘层由DiskManager类实现,提供直接读写disk.img(以下称为磁盘文件)的接口。系统初始化时,DiskManager以内存映射的方式打开磁盘文件,若没有找到磁盘文件则创建该文件。该类提供的接口将直接对磁盘文件进行读写,不进行访问权限检查,不使用线程锁。

扇区层

扇区层主要由FileSystem类和BlockManager类实现,提供扇区级别的操作接口。

FileSystem类提供超级块操作接口与用户信息操作接口,在系统初始化时检查超级块签名是否正确,不正确则初始化超级块与用户信息。超级块信息主要包括磁盘中的剩余扇区数与Inode数,用户信息与超级块信息共同占据磁盘的前两个扇区。

BlockManager类提供扇区与Inode的操作接口。该类允许外部申请/释放扇区与Inode的权限,并允许外部对已申请权限的扇区或Inode进行读写操作,拒绝未授权区域的操作,保证磁盘文件不被意外破坏。该类的接口使用了线程锁,保证多个客户端同时操作扇区/Inode时不会发生冲突。

文件层

文件层主要由FileManager类实现,提供文件操作接口。FileManager类提供了打开/关闭/读取/写入/移动文件指针等常用的文件操作接口,在内部使用OpenFile结构表示已打开文件,每个OpenFile与Inode一一对应。FileManager进行文件操作时,主要调用BlockManager提供的扇区/Inode接口函数,并保证在申请到文件扇区/Inode权限的情况下才进行操作。

用户层

用户层主要由View类实现,负责解析客户端发来的指令,并调用文件层或扇区层提供的接口进行文件操作,将操作结果或出错信息发送回客户端。

进程通信

本项目实现进程通信相关的类均存放在msg文件夹中。进程间传输的网络消息以SerializeMsg类的派生类表示,并由MsgParser进行解析,完成对TCP协议数据包分包/黏包的处理。

解决方案启动时,首先会开启一个服务器进程,该进程会不断监听是否有客户端请求连接服务器。接下来会开启一个客户端进程,该进程创建后会立即尝试连接服务器。

当服务器成功连接到一个客户端后,会为其创建一个新线程,并为其创建一个FileManager对象和一个View对象,然后创建一个用户信息副本,保证不同的客户端能够独立在文件层和用户层进行操作。服务器的扇区层和磁盘层对象是唯一的,以此保证磁盘内容的唯一性。

About

操作系统课程设计,实现一个类似于UnixV6++的二级文件系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages