UNIX File System 实现

Java8 File / FileSystem(二) 源码解析 目录 1、renameTo /setLastModified 2、setReadOnly /setWritable /setReadable /setExecutable /canExecute /canRead /canWrite 3、getTotalSpace /getFreeSpace /getUsableSpace 4、compareTo /equals / hashCode 5、ExpiringCache 6、DeleteOnExitHook 本篇... 阅读详情

title: UNIX File System 实现
tags:

  • Operating System
    categories:
  • Operating System
  • 随堂笔记
    abbrlink: 48303
    date: 2018-06-14 20:57:03

最后的大作业是实现一个文件系统,我以UNIX的文件系统为标准,实现了简单的文件系统和API接口。

本文的所有代码已经上传我的Github

要求

  • 设计一个文件系统,最多可以容纳5000个文件,设备容量为250MB,单个文件最大容量为50MB,提供目录树功能,文件名最长为50个字符,每块大小1KB
  • 本实验采用文件来模拟磁盘,采用dd命令创建文件,例如:dd if=/dev/zeroof=simulated_device bs=1024 count=250000将创建一个包含250000块文件名为simulated_device的文件。(这个文件可以满足测试程序中所有测试程序的空间需要)
  • 本实验已经给出测试文件,最大测试文件为50M。

思考

  • 实验要求很简单,就是实现一个普通的文件系统,而且实现方式不限,使用提供的write_block等接口来模拟低层的磁盘操作。
  • 设计一个文件系统,最主要的是思考如何布局。无论什么文件系统,都要包含目录树、文件信息等功能。
  • 文件的实现书上介绍了几种常见的方法:
    • 连续分配
      • 最简单的分配方案,将每个文件存放在连续的磁盘数据块中。
      • 易于实现,性能不错,但会造成大量外碎片(在多个小文件的时候经常发生)
    • 带有文件分配表的链表结构
      • 把每一个磁盘块中的链表指针抽取出来,单独组成一个表格,放在内存中。
      • 这样的坏处是整个文件分配表必须都放在内存,太占用空间。
    • I-Node
      • 大名鼎鼎的i-node登场啦。此i-node节点列出了文件的属性和各个数据库的磁盘地址,在给定一个i-node之后,就能找到该文件的所有信息。
      • 只有当一个文件被打开时,才需要把它的i节点装入内存。
      • i-node存储的磁盘地址不够时,我们还可以使用多级间接块(indirect block)来描述更多的磁盘地址。
  • 目录
    • 相对来说,目录的实现就简单多了。目录也可以理解为一种特殊的文件,UNIX中的目录非常简单,每一项(entry)只包含文件名i-node节点号两个信息。
  • 空闲块管理
    • 如何迅速知道磁盘中的空闲块以及剩余容量呢?
    • 一种方法是使用链表,但会占用大量空间。
    • 更常用的方法是使用位图(bitmap)来管理,已经分配的块用1表示,未分配的用0表示,每个块只占1个byte。
  • SuperBlock
    • 我们还需要一个SuperBlock作为文件系统的初始块。它应该包含文件系统初始化信息、位图地址、根目录地址等等,以便让系统将文件系统加载进内存。

实现

本项目使用了SuperBlockBitmap,以及i-node来实现文件系统。

  • Superblock
    • 是否初始化
    • 磁盘剩余空间(用于快速访问,了解该文件是否能放入磁盘)
    • bitmap信息(每个位图的使用情况)
    • 存储在第一块block中,当初始化时自动加载。
  • Bitmap
    • 按理来说,Bitmap中的每一个byte来代表一个块。但用byte操作不太直观,因此本项目使用short类型代替(会多浪费不少空间,但总占比空间依然不多)
    • 由于我们由250000个块,本项目设计每个Bitmap包含500个块的位图信息,其余地址用于存储起始磁盘块地址、剩余块多少。
    • 因此,我们需要500Bitmap,存储在第2~501个磁盘块中。
  • Root目录
    • Root目录也必须在文件系统初始化时加载和初始化,因此我们将它分配在502磁盘块上。
  • i-node
    • 在每个i-node中,我们设计了以下属性:
    • 文件大小
    • 创建、修改时间
    • 直接块(200个,可以存储200KB的信息)
    • 一级间接块(1个,可以存储256KB的信息–一条地址4bytes)
    • 二级间接块(1个,可以存储256*256KB的信息,完全足够我们用了)

总结下来,我们的文件系统大体框架如下图所示:

缓存

解决了文件系统的大体框架问题,接下来我们就要想缓存的问题了。因为我们不可能每次写都直接写到磁盘、每次读都直接从磁盘中读,这样一个block(1KB)一个block的读实在是太慢了。因此我想出了以下几个方法:

  • 每次write只写到缓存,只有当文件close的时候才真正写到内存。这种方法的好处是无论如何读写都很快,但当文件很大的时候非常占用内存。
  • 给内存分配一块专门用作文件读写的缓冲区,当文件大小小于缓冲区时,就直接将文件存储在缓存区中,当文件大于此大小,就将多余的部分存储在磁盘中。

理论上来说,第二种方案肯定是更好的,因为作为操作系统的一部分,肯定不希望占用过多的内存。但本项目为了简单,只采用了第一种方案。

代码逻辑

结构设计

因为文件系统涉及的结构层次较多,为了方便阅读代码,我整理了函数的逻辑如下:

52911994491

FileSystem:类Unix文件系统设计与实现 二级文件系统 File System (Unix) 项目简介 本项目是一个类似Unix文件系统的二级文件系统,即使用一个普通的大文件(unix-fs.img ,称之为一级文件)模拟UNIX V6++文件系统的一个文件卷。在完成本项目之前较为详细的阅读了Unix V6++系统的源代码,特别是文件系统相关部分。本文件系统为用户提供命令行界面,基本功能模块包括用户界面模块、文件打开表管理模块、系统访问管理模块、系统盘块管理模块、高速缓存管理模块、设备驱动模块等,可跨平台运行。所有工作由一人独立完成。 模块说明 DeviceDriver:设备驱动模块,直接负责磁盘文件直接读写。 BufferManager:高速缓存管理模块,主要负责管理系统中所有的缓存块,包括申请、释放、读写、清空一块缓存的功能函数接口,以及系统退出时刷新所有缓存块。 FileSystem:系统盘块管理模块,主要负责对镜像文件的存储空间管理,包 立即下载

相关推荐

UnixFileSystem.zip

C++实现Unix文件系统,包含注释,内容详尽,为vs工程

java filesystem_JDK不同操作系统FileSystemunix-like)上篇

前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 ...

weixin_34979632的博客 838

UNIX Filesystems

介绍UNIX文件系统发展, 设计, 和实现的很好的书籍

JDK不同操作系统FileSystemunix-like)下篇

前言 我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。 关于FileSystem类 JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem...

weixin_34062469的博客 611

Unix File System

The Unix file system is characterized by: 1.a hierarchical structure. 2.consistend treatment of file data. 3.the ability to create and delete files. 4.dynamic growth of files. 5.the protection of

Norwaykenny的博客 558

从零到精通:UNIX BENCH性能基准测试全流程实战

本文提供了UNIX BENCH性能基准测试从环境准备到结果解读的全流程实战指南。详细介绍了在Linux服务器上安装、配置和运行UNIX BENCH的步骤,重点解决了无图形界面环境的编译问题,并指导如何正确设置并行测试参数以获取准确性能数据。最后,深入解读测试报告,帮助用户将分数转化为有效的系统性能洞察与优化依据。

n2o3p4的博客 672

操作系统目录结构

系统可以有多个文件系统,且文件系统可以有不同的类型,就比如说一个典型的Solaris系统当中就可以有多个UFS文件系统、一个VFS系统和一些NFS系统 关于UFS文件系统概念:UFS是UNIX文件系统的简称,它来源于4.3Tahoe发行版中提供的BSD Fat Fast File System(FFS)系统,属于FFS的演化版本。UFS几乎是大部分UNIX操作系统默认的基于磁盘的文件...

rv0p111 2809

共享文件系统概要

共享文件系统本身并不是我们通常意义上讲的磁盘文件系统,它不能用于存储和管理磁盘数据,而只是定义了文件在网络传输过程中的组织格式和传输协议,所以,一个文件从网络的一端到达另一端的过程中,需要进行两次格式转换,分别发生在进入网络和离开网络的时候。 对于共享文件系统实现,常用的有NFS(Network File System)和Samba,其...

weixin_33695450的博客 438

11.24 cifs通用网络文件系统

1.cifs和samba的介绍 CIFS (Common Internet File System),通用Internet文件系统。在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。 CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机提供服务。CIFS 使用客户/服务器模式。客户程序请求远在服务器上的服务器程序为它提...

qq_41627390的博客 433

SMB与CIFS 445端口

SMB(Server Message Block)又称CIFS(Common Internet File System),一种应用层网络传输协议(微软(Microsoft)和英特尔(Intel)在1987年制定的协议),由微软开发,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通讯等资源。它也提供认证的进程间通讯技能。它主要用在Windows的机器上。 CIFS是由microso...

海绵汽水的博客 9747

unixfilesystem:模拟Unix文件系统

模拟Unix文件系统 浙江工业大学操作系统大型试验 目的 通过对UNIX文件系统的子集的模拟实现,了解Unix文件系统实现机制。 实现功能 Ls 显示文件目录 Chmod 改变文件权限 Chown 改变文件拥有者 Chgrp 改变文件所属组 Pwd 显示当前目录 Cd 改变当前目录 Mkdir 创建子目录 Rmdir 删除子目录 Umask 文件创建屏蔽码 Mv 改变文件名 Cp 文件拷贝 Rm 文件删除 Ln 建立文件联接 Cat 连接显示文件内容 Passwd 修改用户口令

UNIX Filesystems Evolution, Design, and Implementation

unix filesystems conceptsone linux file systems programming

cifs文件存储与samba服务(一)Windos和Linux之间的文件共享

文章目录cifs是什么SMB协议是什么samba是什么如何像磁盘一样的共享文件?Windos和Linux之间的文件共享 cifs是什么 CIFS (Common Internet File System) 通用Internet文件系统 ,它是一个协议 在windows主机之间进行网络文件共享 是通过使用微软公司自己的CIFS服务实现的 它使程序可以访问远程Internet计算机上的文件并要求此...

weixin_45649763的博客 442

nfs与samba

nfs服务:(network file system)linux或unix系统之间实现资源的共享 特点: 本是思想:linuxA下/share文件夹,linuxB可以利用挂载(mount)机制将linuxA系统中的/share文件夹挂在到linuxB中,从而实现资源的共享。 如何配置nfs:     1.服务器端:对于RHlinux 5来说,nfs服务需要两个套件:portmap和nf

tianpeiwen的专栏 613

网络文件共享服务——NFS

NFS简单介绍 NFS ( Network File System ) 是由 Linux 、 UNIX 及其他类似操作系统使用的互联网标准协议 , 可作为它们的本地网络文件系统。它是一种活动扩展之下的开放标准 , 可支持本地 Linux 权限和文件系统功能 有两种方法用来确定由服务器提供的 NFS 导出 , 或叫做文件共享。如果服务器支持 NFSv3 或 NFSv2 , 可以使用 showmo...

passion_for_life的博客 328

遍历 文件名

文件系统的操作在C语言中没有跨平台的方案。Windows平台:FindFistFile/FindNextFileLinux/Unix平台:opendir/readdir如果可以用C++的话,推荐使用boost::file_system。它是个跨平台的解决方案

354

java安全入门

是所有的类加载器的父类,有非常多的子类加载器,比如我们用于加载jar包的其本身通过继承类,重写了findClass方法从而实现了加载目录class文件甚至是远程资源文件。现在用来尝试写一个加载类器来加载自定义的字节码,并调用hello方法如果类存在的情况下,我们可以使用如下代码即可实现调用hello但是,如果不在我们的classpath中,我们可以通过自定义的类加载器重写findClass方法,然后在调用的时候,传入该类的字节码,最后通过反射机制就可以调用类的hello方法了。/***/

xnxqwzy的博客 3398

小师妹学JavaIO之:File文件系统

小师妹又遇到难题了,这次的问题是有关文件的创建,文件权限和文件系统相关的问题,还好这些问题的答案都在我的脑子里面,一起来看看吧。 文件权限和文件系统 早上刚到公司,小师妹就凑过来神神秘秘的问我:F师兄,我在服务器上面放了一些重要的文件,是非常非常重要的那种,有没有什么办法给它加个保护,还兼顾一点隐私? 更多内容请访问www.flydean.com 什么文件这么重要呀?不会是你的照片吧,放心没人会感兴趣的。 小师妹说:当然不是,我要把我的

程序那些事 9433
上一篇: 如何选择神经网络中的超参数
下一篇: MINIX3进程管理器概述
zealscott
博客等级 码龄9年 327粉丝 196原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值