文件系统存储空间管理模拟实验报告

合集下载

实验六模拟文件系统

实验六模拟文件系统

操作系统试验班级:计科0801 姓名:韩伟伟学号:08407106 日期:2011/6/15实验六模拟实现文件系统一.实验目的通过模拟程序实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能,了解文件系统实现的特点,掌握文件系统的各种功能实现方法。

二.实验属性设计三.实验内容模拟实现文件系统问题是一个经典的关于文件的处理问题,包括:实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能。

设计思想如下:1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2.文件物理结构可采用显式链接或其他方法。

3.磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。

5.设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建: create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)列出文件目录:dir(10)退出:logout四.设计思路1.本系统初始化了十个用户,每个用户初始化五个文件,最多可拥有十个文件,所以每个用户在此基础上可为自己再创建五个文件,也可以在删除文件后再创建。

2.系统使用create,open,read,write,close,delete,dir和exit来创建文件,打开文件,读文件,写文件,关闭文件,删除文件和显示文件。

3.程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。

存储管理实验报告

存储管理实验报告

存储管理实验报告存储管理实验报告引言:存储管理是计算机系统中非常重要的一部分,它负责管理计算机系统中的存储资源,包括内存和外存。

合理的存储管理能够提高计算机系统的性能和效率,保证系统的稳定运行。

本次实验旨在通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。

一、实验目的本次实验的主要目的是通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。

具体目标如下:1. 了解存储管理的基本概念和原理;2. 掌握存储管理的常用方法和技术;3. 分析实验结果,探讨存储管理的优化策略。

二、实验环境本次实验使用了一台配置较高的计算机,具备较大的内存和高速的硬盘。

实验环境如下:1. 操作系统:Windows 10;2. 内存:16GB;3. 硬盘:1TB。

三、实验过程1. 内存管理实验在内存管理实验中,我们使用了一段较大的程序代码进行测试。

首先,我们通过编程语言将程序代码写入内存中,然后通过内存管理技术将程序代码加载到内存的合适位置。

在加载过程中,我们使用了分页和分段两种常用的内存管理技术,并比较了它们的性能差异。

实验结果显示,分页技术相对来说更加高效,能够更好地利用内存资源,提高系统的运行速度。

2. 外存管理实验在外存管理实验中,我们模拟了大文件的读写操作。

首先,我们将一个较大的文件写入硬盘中,然后通过外存管理技术将文件加载到内存中进行读取。

在加载过程中,我们使用了磁盘调度算法和文件系统管理技术,并比较了它们的性能差异。

实验结果显示,磁盘调度算法的选择对系统的读写速度有较大的影响,而文件系统的合理管理能够提高文件的存取效率。

四、实验结果分析通过对实验结果的分析,我们可以得出以下结论:1. 内存管理中,分页技术相对于分段技术更加高效,能够更好地利用内存资源,提高系统的运行速度;2. 外存管理中,磁盘调度算法的选择对系统的读写速度有较大的影响,合理选择磁盘调度算法能够提高系统的性能;3. 文件系统的合理管理能够提高文件的存取效率,减少文件的碎片化,提高系统的整体性能。

文件系统管理实训报告

文件系统管理实训报告

一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。

为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。

本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。

二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。

三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。

常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。

(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。

(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。

每组权限包括读(r)、写(w)和执行(x)三种。

通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。

文件管理实验报告

文件管理实验报告

文件管理实验报告一、实验目的本次文件管理实验旨在深入了解和掌握文件管理的基本原理和操作方法,提高对文件系统的认识和运用能力,培养良好的文件管理习惯,以提高工作和学习的效率。

二、实验环境操作系统:Windows 10应用软件:资源管理器三、实验内容及步骤(一)文件的创建与命名1、打开资源管理器,选择合适的存储位置(如桌面、D 盘等)。

2、右键单击空白处,选择“新建”,然后根据需要创建文本文档、Word 文档、Excel 表格等不同类型的文件。

3、为创建的文件进行合理的命名,遵循简洁、清晰、有意义的原则,避免使用模糊、无意义或过长的文件名。

(二)文件的复制、移动与删除1、复制文件选中要复制的文件,按下Ctrl +C 组合键或右键单击选择“复制”。

导航到目标位置,按下 Ctrl + V 组合键或右键单击选择“粘贴”。

2、移动文件选中要移动的文件,按下Ctrl +X 组合键或右键单击选择“剪切”。

导航到目标位置,按下 Ctrl + V 组合键或右键单击选择“粘贴”。

3、删除文件选中要删除的文件,按下 Delete 键或右键单击选择“删除”。

在弹出的确认对话框中,选择“是”确认删除。

(三)文件的搜索与查找1、利用资源管理器的搜索功能,在搜索框中输入文件名、关键词或文件类型等信息,快速找到所需文件。

2、学会使用高级搜索选项,如指定搜索范围、修改时间、文件大小等条件,进一步精确搜索结果。

(四)文件的分类与整理1、根据文件的类型(如文档、图片、音频、视频等)、用途(工作、学习、娱乐等)或项目等进行分类。

2、创建不同的文件夹来存放各类文件,并为文件夹进行清晰的命名。

3、将相关文件移动到对应的文件夹中,保持文件系统的整洁和有序。

(五)文件的备份与恢复1、选择重要的文件或文件夹,将其复制到外部存储设备(如 U 盘、移动硬盘)或云存储服务(如百度网盘、OneDrive)中进行备份。

2、模拟文件丢失或损坏的情况,从备份中恢复文件,验证备份的有效性。

文件管理实验报告

文件管理实验报告

文件管理实验报告一、实验目的本次文件管理实验的主要目的是深入了解和掌握文件管理的基本原理和操作方法,通过实际操作和观察,提高对文件系统的认识和运用能力,培养良好的文件管理习惯,以提高工作和学习的效率。

二、实验环境本次实验使用的操作系统为 Windows 10,使用的工具包括资源管理器、命令提示符等。

三、实验内容与步骤(一)文件和文件夹的创建与命名1、打开资源管理器,选择合适的磁盘分区和文件夹。

2、右键单击空白处,选择“新建”,然后分别创建文本文件、Word 文档、文件夹等。

3、为创建的文件和文件夹进行合理的命名,遵循清晰、简洁、有意义的原则,例如“学习资料_数学”“工作周报_202309”等。

(二)文件和文件夹的复制、移动与删除1、选中要操作的文件或文件夹,可以使用鼠标左键单击或按住Ctrl 键进行多选。

2、对于复制操作,右键单击选中的对象,选择“复制”,然后在目标位置右键单击选择“粘贴”。

3、移动操作类似,只是选择“剪切”而不是“复制”。

4、删除文件或文件夹时,选中对象后按下 Delete 键,或者右键单击选择“删除”。

需要注意的是,删除操作是不可逆的,对于重要文件要谨慎操作。

(三)文件和文件夹的属性设置1、右键单击文件或文件夹,选择“属性”。

2、在属性对话框中,可以设置文件的只读、隐藏等属性。

3、了解文件的大小、创建时间、修改时间等信息。

(四)文件的搜索与查找1、在资源管理器的搜索框中输入关键词,如文件名、文件内容中的部分文字等。

2、可以设置搜索范围、搜索条件等,以更精确地找到所需文件。

(五)文件的压缩与解压缩1、选择要压缩的文件或文件夹,右键单击选择“添加到压缩文件”。

2、可以设置压缩格式、压缩级别等参数。

3、对于压缩文件,右键单击选择“解压到当前文件夹”或“解压到指定文件夹”进行解压缩操作。

四、实验中遇到的问题及解决方法(一)问题 1:误删除重要文件在进行删除操作时,不小心删除了一个包含重要数据的文件夹。

模拟储存技术实验报告

模拟储存技术实验报告

一、实验目的1. 了解模拟存储技术的概念和原理;2. 掌握模拟存储器的基本结构和功能;3. 通过实验验证模拟存储技术的性能特点;4. 分析模拟存储技术在现代计算机系统中的应用。

二、实验环境1. 实验平台:PC机2. 实验软件:C++ Builder3. 实验工具:Visual Studio三、实验原理模拟存储技术是一种在计算机系统中实现存储器虚拟化的技术。

通过模拟存储器,计算机可以实现对物理存储器的高效管理和利用。

模拟存储技术主要包括以下几种:1. 虚拟存储器:通过将物理内存和硬盘存储空间结合起来,实现大容量内存的模拟;2. 页面置换算法:根据页面访问的频率和顺序,选择合适的页面进行置换,以提高内存利用率;3. 快速缓存:通过将频繁访问的数据存储在快速缓存中,减少对物理内存的访问次数。

四、实验内容1. 模拟存储器的基本结构设计(1)设计模拟存储器的基本结构,包括物理内存、硬盘存储空间、虚拟内存和页面置换算法等模块;(2)实现模拟存储器的初始化、数据读写、页面置换等功能。

2. 页面置换算法的实现(1)实现三种页面置换算法:FIFO、LRU和OPT;(2)对每种算法进行性能分析,包括缺页率和页面命中率等指标。

3. 快速缓存的设计与实现(1)设计快速缓存的结构,包括缓存大小、替换策略等;(2)实现快速缓存的数据读写、替换等功能。

4. 模拟存储技术的应用实例(1)模拟一个简单的计算机系统,包括CPU、内存、硬盘等模块;(2)在计算机系统中应用模拟存储技术,实现虚拟内存和快速缓存等功能;(3)通过实验验证模拟存储技术在计算机系统中的应用效果。

五、实验步骤1. 设计模拟存储器的基本结构,实现初始化、数据读写、页面置换等功能;2. 实现三种页面置换算法:FIFO、LRU和OPT,并分析其性能;3. 设计快速缓存的结构,实现数据读写、替换等功能;4. 模拟一个简单的计算机系统,应用模拟存储技术,实现虚拟内存和快速缓存等功能;5. 对实验结果进行分析,总结模拟存储技术的性能特点和应用效果。

文件管理虚拟实验实验报告

文件管理虚拟实验实验报告

文件管理虚拟实验实验报告《文件管理虚拟实验实验报告》一、实验目的:本实验的目的是通过使用文件管理虚拟实验平台,深入了解和掌握操作系统中的文件管理相关知识,包括文件的创建、打开、关闭、读写等操作,并通过实际操作来体验和理解文件的属性、权限以及目录的创建、删除等操作。

二、实验内容:1. 文件创建与打开:使用平台提供的命令或系统调用,创建一个文件并打开文件。

2. 文件写入与保存:向已打开的文件中写入一段文字,并保存文件。

3. 文件关闭:关闭已打开的文件。

4. 文件读取:从已打开的文件中读取并显示文件内容。

5. 文件权限设置:设置文件的权限属性,例如读、写、执行权限。

6. 目录创建与删除:创建一个新目录并删除该目录。

三、实验步骤:1. 登录文件管理虚拟实验平台。

2. 打开终端窗口,使用命令或系统调用创建一个文件,并打开该文件。

3. 在打开的文件中写入一段文字,保存文件。

4. 关闭已打开的文件。

5. 重新打开文件,并读取文件内容并显示。

6. 设置文件的权限属性,例如读、写、执行权限。

7. 创建一个新的目录。

8. 删除新目录。

四、实验结果:通过实验操作,我成功创建了一个文件,并且能够通过打开、写入、保存、关闭等操作对文件进行管理。

此外,我还能够设置文件的权限属性,例如读、写、执行权限,以及创建和删除目录。

五、实验心得:通过这次文件管理虚拟实验实验,我对操作系统中的文件管理有了更深入的理解和掌握。

通过实际操作,我更加熟悉了文件的创建、打开、关闭、读写等操作,并能够正确地设置文件的权限属性和对目录进行创建和删除操作。

在实验过程中,我发现文件管理是操作系统中非常重要的一部分,文件的管理涉及到了数据的存储、读取和保密等方面的内容。

合理地管理文件能够提高操作系统的效率和安全性。

此外,我还意识到文件的权限属性对文件的访问和使用具有重要的作用。

正确地设置文件的权限属性可以有效地保护文件的机密性和完整性,防止未经授权的访问和恶意操作。

文件管理实验报告结果(3篇)

文件管理实验报告结果(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,验证文件管理的有效性和可行性,并对文件管理系统的性能进行评估。

通过实验,了解文件管理的相关原理和方法,提高文件管理的实践能力。

二、实验环境1. 操作系统:Windows 102. 文件管理系统:Windows文件管理器3. 实验数据:实验过程中产生的文件和数据三、实验内容1. 文件创建与删除2. 文件夹创建与删除3. 文件与文件夹的复制、移动、重命名4. 文件属性的设置与修改5. 文件搜索与查找6. 文件权限管理7. 文件压缩与解压四、实验步骤1. 文件创建与删除(1)在Windows文件管理器中,新建一个名为“实验文件.txt”的文本文件。

(2)在“实验文件.txt”上右击,选择“删除”,确认删除。

2. 文件夹创建与删除(1)在Windows文件管理器中,新建一个名为“实验文件夹”的文件夹。

(2)在“实验文件夹”上右击,选择“删除”,确认删除。

3. 文件与文件夹的复制、移动、重命名(1)将“实验文件.txt”复制到“实验文件夹”中。

(2)将“实验文件.txt”移动到桌面。

(3)将“实验文件.txt”重命名为“实验文件修改.txt”。

4. 文件属性的设置与修改(1)在“实验文件修改.txt”上右击,选择“属性”,设置文件属性为“只读”。

(2)修改“实验文件修改.txt”的属性为“隐藏”。

5. 文件搜索与查找(1)在Windows文件管理器中,输入“实验文件”进行搜索。

(2)使用“查找”功能,查找“实验文件修改.txt”。

6. 文件权限管理(1)在“实验文件夹”上右击,选择“属性”,点击“安全”标签。

(2)添加用户权限,设置权限为“完全控制”。

7. 文件压缩与解压(1)将“实验文件夹”压缩为“实验文件夹.zip”。

(2)解压“实验文件夹.zip”到指定位置。

五、实验结果与分析1. 文件创建与删除:实验成功创建和删除了文件,验证了文件管理的可行性。

2. 文件夹创建与删除:实验成功创建和删除了文件夹,验证了文件管理的可行性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号专业班级实验日期成绩指导老师一、实验目的根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。

二、实验原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。

当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。

三、主要仪器设备PC机(含有VC)四、实验容与步骤实验容:1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配法;2. 文件空闲空间管理,可采用空白块链、空白目录、位示图法;步骤如下:1. 输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;(1)磁盘基本信息:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q;(2)假设采用整数数组存放位示图,则数组大小为:Size= ceil((柱面数*每柱面磁道数*每磁道物理块数)/(sizeof(int)*8))(3)申请大小为size的整数数组map,并对其进行随机初始化。

例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=2, 则位示图大小为4,map[4]如下:地址到高地址位上。

即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状如上表所示,29号磁盘的状态存在map[1]中,对应于第13位;2. 输出初始位示图信息;3. 输入文件分配或释放请求,(1)格式:“+ 文件名申请块数”或“- 文件名”“+”表示申请文件分配,“-”表示删除文件如:+ F1 54. 根据请求完成相应操作。

(1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR 地址或相对磁盘块号记录在文件目录中。

输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。

否则,空间不够,退出执行下一条请求;●计算公式如下:a. 已知位示图中的下标i , j, 计算相对块号Block= i*sizeof( int )*8+jb. 已知相对块号计算柱面、磁道、物理块号如下:柱面号C= 相对块号/(每柱面磁道数*每磁道物理块数)磁道号H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数物理块号R= 相对块号%每磁道物理块数●(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读取文件相应的盘块CHR地址, 计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j),将位示图中的相应位有“1”改为“0”,并从目录中删除该目录项。

输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图和目录。

计算过程如下:相对磁盘块号= 柱面号*每柱面磁道数*每磁道物理块数+磁道号*每磁道物理块数+ 物理块号i = 相对磁盘块号/ (sizeof(int)*8)j = 相对磁盘块号% (sizeof(int)*8)五、实验流程图图一文件空闲区分配算法图二文件空闲区回收算法六、实验代码#include "stdio.h"#include <stdlib.h>#include <conio.h>#include <string.h>int physic[100]; //文件地址缓冲区int style=1; //文件的类型char cur_dir[10]="root"; //当前目录struct command{char [10];}cmd[13];struct block{ int n; //空闲的盘快的个数int free[50]; //存放空闲盘快的地址int a; //模拟盘快是否被占用}memory[20449];struct block_super{int n; //空闲的盘快的个数int free[50]; //存放进入栈中的空闲块int stack[50]; //存放下一组空闲盘快的地址}super_block;struct node //i结点信息{int file_style; //i结点文件类型int file_length; //i结点文件长度int file_address[100]; //i结点文件的物理地址} i_node[640];struct dir //目录项信息{char file_name[10]; //文件名int i_num; //文件的结点号char dir_name[10]; //文件所在的目录} root[640];void format() //格式化{int i,j,k;super_block.n=50;for(i=0;i<50;i++) //超级块初始化{ super_block.free[i]=i; //存放进入栈中的空闲块super_block.stack[i]=50+i; //存放下一组的盘块}for(i=0;i<640;i++) //i结点信息初始化{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;//文件地址}i_node[i].file_length=-1; //文件长度i_node[i].file_style=-1; //文件类型}for(i=0;i<640;i++) //根目录区信息初始化{strcpy(root[i].file_name,"");root[i].i_num=-1;strcpy(root[i].dir_name,"");}for(i=0;i<20449;i++) //存储空间初始化{memory[i].n=0; //必须有这个memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}for(i=0;i<20449;i++) //将空闲块的信息用成组的法写进每组的最后一个块中{ //存储空间初始化if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<20450){memory[i].free[j]=k;//下一组空闲地址memory[i].n++; //下一组空闲个数注意在memory[i].n++之前要给其赋初值k++;}else{memory[i].free[j]=-1;}}memory[i].a=0; //标记为没有使用continue; //处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环}for(j=0;j<50;j++){memory[i].free[j]=-1;}memory[i].n=0;}printf("已经初始化完毕\n");printf("进入UNIX文件模拟............\n\n");}void write_file(FILE *fp) //将信息读入系统文件中{int i;fp=fopen("system","wb");for(i=0;i<20449;i++){ fwrite(&memory[i],sizeof(struct block),1,fp);}fwrite(&super_block,sizeof(struct block_super),1,fp);for(i=0;i<640;i++){write(&i_node[i],sizeof(struct node),1,fp);}for(i=0;i<640;i++){ fwrite(&root[i],sizeof(struct dir),1,fp);}fclose(fp);}void read_file(FILE *fp) //读出系统文件的信息{ int i;fp=fopen("system","rb");for(i=0;i<20449;i++){fread(&memory[i],sizeof(struct block),1,fp);}fread(&super_block,sizeof(struct block_super),1,fp);for(i=0;i<640;i++){ fread(&i_node[i],sizeof(struct node),1,fp);}for(i=0;i<640;i++){fread(&root[i],sizeof(struct dir),1,fp);}fclose(fp);}void callback(int length) //回收磁盘空间{ int i,j,k,m,q=0;for(i=length-1;i>=0;i--)k=physic[i]; //需要提供要回收的文件的地址m=49-super_block.n; //回收到栈中的哪个位置if(super_block.n==50) //注意当super_block.n==50时m=-1;的值{ //super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){ m=49; //将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息}super_block.free[m]=physic[i]; //将下一个文件地址中的盘块号回收到栈中super_block.n++;}}void allot(int length) //分配空间{ int i,j,k,m,p;for(i=0;i<length;i++){k=50-super_block.n; //超级块中表示空闲块的指针m=super_block.free[k]; //栈中的相应盘块的地址p=super_block.free[49]; //栈中的最后一个盘块指向的地址if(m==-1||memory[p].a==1) //检测是否还有下一组盘块{printf("存不足,不能够分配空间\n");callback(length);break;}if(super_block.n==1){memory[m].a=1; //将最后一个盘块分配掉physic[i]=m;super_block.n=0;for(j=0;j<memory[m].n;j++) //从最后一个盘块中取出下一组盘块号写入栈中{super_block.free[j]=memory[m].free[j];super_block.n++;}continue; //要跳过这次循环,下面的语句在IF中已经执行过}physic[i]=m; //栈中的相应盘块的地址写进文件地址缓冲区memory[m].a=1;super_block.n--;}}void create_file(char filename[],int length) //创建文件{int i,j;for(i=0;i<640;i++){if(strcmp(filename,root[i].file_name)==0)printf("文件已经存在,不允建立重名的文件\n");return;}}for(i=0;i<640;i++){if(root[i].i_num==-1){root[i].i_num=i;strcpy(root[i].file_name,filename);strcpy(root[i].dir_name,cur_dir); //把当前目录名给新建立的文件i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j<length;j++){i_node[i].file_address[j]=physic[j];}break;}}}void create_dir(char filename[]) //创建目录{style=0; //0代表文件类型是目录文件create_file(filename,4);style=1; //用完恢复初值,因为全局变量,否则}void del_file(char filename[]) //删除文件{int i,j,k;for(i=0;i<640;i++){if(strcmp(filename,root[i].file_name)==0){k=root[i].i_num;for(j=0;j<i_node[k].file_length;j++){physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length); //调用回收函数for(j=0;j<100;j++) //删除文件后要将文件属性和目录项的各个值恢复初值{i_node[k].file_address[j]=-1; //地址恢复初值}strcpy(root[i].file_name,""); //文件名恢复初值root[i].i_num=-1; //目录项的I结点信息恢复初值strcpy(root[i].dir_name,""); //目录项的文件目录信息恢复初值i_node[k].file_length=-1; //文件长度恢复i_node[k].file_style=-1; //文件类型恢复初值break;}}if(i==640){printf("不存在这个文件\n");}}void del_dir(char filename[]) //删除目录需要判断目录下时候为空,不为空就不删除int i,j,k;for(i=0;i<640;i++) //还要加条件判断要删除的目录是不是当前目录{k=root[i].i_num; //找到目录名字if( strcmp(root[i].file_name,filename)==0 && strcmp(cur_dir,filename)!=0 && (i_node[k].file_style)==0 ){for(j=0;j<640;j++){if(strcmp(filename,root[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==640){del_file(filename);break;}break;}}if(i==640){printf("这个不是目录文件或者不存在这个目录,或者你要删除的是当前目录\n");}}void display_curdir() //显示当前目录下的文件列表{int i,k;printf("\t\t文件名字文件类型文件长度所属目录\n");for(i=0;i<640;i++){if(strcmp(cur_dir,root[i].dir_name)==0) //查询文件中所在目录信息和当前目录信息相同的数据{k=root[i].i_num;printf("\t\t %s\t",root[i].file_name); //文件名printf("\t%d\t",i_node[k].file_style); //文件的类型printf("%d\t",i_node[k].file_length); //文件的长度printf("%s\n",root[i].dir_name); //文件所在的目录}}}void display_dir(char filename[]) //进入指定的目录{int i,k;for(i=0;i<640;i++){k=root[i].i_num; //判断文件类型是不是目录类型if((strcmp(filename,root[i].file_name)==0) && (i_node[k].file_style==0)){strcpy(cur_dir,filename); //将要进入的指定目录设置为当前目录赋值不要反了strcpy(目的,源)break;}if(i==640){printf("没有这个目录\n");}}void open_file(char filename[]) //打开文件{int i,j,k;printf("\t\t文件名字文件类型文件长度所属目录\n");for(i=0;i<640;i++){k=root[i].i_num;if(strcmp(filename,root[i].file_name)==0 && (i_node[k].file_style==1)){printf("\t\t %s\t",root[i].file_name); //文件名printf("\t%d\t",i_node[k].file_style); //文件的类型printf("%d\t",i_node[k].file_length); //文件的长度printf("%s\n",root[i].dir_name); //文件所在的目录printf("\t\t文件占用的物理地址\n");for(j=0;j<i_node[k].file_length;j++) //显示物理地址{printf("%d ",i_node[k].file_address[j]); //文件具体占用的盘块号}printf("\n");break;}}if(i==640){printf("没有这个文件或者这个文件不是正规文件\n");}}void back_dir() //返回上一级目录{int i,k;for(i=0;i<640;i++) //查询和当前目录名相同的目录文件名{k=root[i].i_num;if(strcmp(cur_dir,root[i].file_name)==0 && (i_node[k].file_style==0)){strcpy(cur_dir,root[i].dir_name); //将查询到的目录文件名所在的目录赋值给当前目录}}}void display_sys() //显示系统信息(磁盘使用情况){int i,m,k=0;for(i=0;i<20449;i++){if(memory[i].a==0)k++;}m=20449-k;printf("空闲的盘块数是:\t");printf("%d\n",k);printf("使用的盘块数是:\t");printf("%d\n",m);}void help() //显示帮助信息{printf("***********************************************************\n"); printf("* 以下是文件管理已分配盘块------------------------------- *\n");printf("* 1.初始化-----------------------------------------format *\n");printf("* 2.查看当前目录文件列表---------------------------dir *\n");printf("* 3.查看文件--------------cat-----(cat + 空格+ 文件名) *\n");printf("* 4.查看系统信息-----------------------------------ls *\n");printf("* 5.创建目录--------------md------(md + 空格+ 目录名) *\n");printf("* 6.创建文件---vi------(vi + 空格+ 文件名+ 文件长度) *\n"); printf("* 7.删除文件---------------del-----(del + 空格+ 文件名) *\n");printf("* 8.删除目录----------------deldir--(del + 空格+ 目录名) *\n");printf("* 9.进入当前目录下的指定目录-----cd--(cd + 空格+ 目录名) *\n"); printf("* 10.返回上一级目录--------------------------------cd.. *\n");printf("* 11.显示帮助命令----------------------------------help *\n");printf("* 12.退出文件模拟----------------------------------quit *\n");printf("* 13,进入成组----------------------------------guo *\n");printf("***********************************************************\n"); }int MA[4]; /*空闲块数组*/int A[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; /*磁盘空间*/int mark[9]; /*存放已分配的块*/int No=0; /*已分配的块数*/void display1(){ int i,j,temp,count;No=0;if(MA[1]!=0){ i=MA[0];printf("\ngroup1:");for(j=1;j<=i;j++){ printf("%d ",MA[j]);mark[++No]=MA[j];}temp=MA[1];count=2;while(A[temp][1]!=0){ printf("\ngroup%d:",count);i=A[temp][0];for(j=1;j<=i;j++){ printf("%d ",A[temp][j]);mark[++No]=A[temp][j];}count++;temp=A[temp][1];}printf("\ngroup%d:",count);i=A[temp][0];for(j=2;j<=i+1;j++)if(A[temp][j]>0){ printf("%d ",A[temp][j]);mark[++No]=A[temp][j];}}elseif(i==1)printf("\nThe blocks are all assigned");else{ printf("\ngroup1:");for(j=2;j<=i;j++){ printf("%d ",MA[j]);mark[++No]=MA[j];}}}}void display() /*显示分组情况*/{ int i,j;if(MA[0]!=0)display1();else{ i=MA[1];for(j=0;j<=3;j++)MA[j]=A[i][j];display1();}}void assign() /*分配空闲块*/{ int s,i;if(MA[0]>1) /*若该组不止一个空闲块*/{ i=MA[0];s=MA[i];MA[0]--;printf("\nnumber of the block:%d",s);}else if(MA[0]==1) /*只剩一个空闲块*/{ if(MA[1]!=0) /*还有其它空闲块组*/{ s=MA[1];for(i=0;i<=3;i++)A[0][i]=A[s][i];MA[0]--;printf("\nnumber of the block:%d",s);}else /*没有其它空闲块组*/{ printf("\nThere isn't any space");return;}}else /*当前组已分配完*/{ for(i=0;i<=3;i++)MA[i]=A[0][i];assign();}display(); /*显示分组情况*/}void callback() /*回收空闲块*/{ int i,j,temp;printf("\ninput the No. of the block you want to callback:");scanf("%d",&j);getchar(); /*得到待回收的空闲块号*/for(temp=1;temp<=No;temp++){ if(mark[temp]==j)}if(temp<No+1) /*若该空闲块已在,退出*/{ printf("\nThe block is in the disk");return;}if(MA[0]<3) /*当前组不满3块*/{ i=MA[0];MA[i+1]=j;MA[0]++;}else /*已有3块*/{ for(i=0;i<=3;i++)A[j][i]=MA[i];MA[0]=1;MA[1]=j;}display(); /*显示*/}int filecontrol();void menu() /*功能选择函数*/{ int choice;char judge;printf("文件管理空间管理\n");printf("\ninput your choice:(1--assign,2--callback,3--backtofilecontrol):\n");scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();else if(choice==3)filecontrol();elseprintf("\ninvalid command!");printf("\ncontinue or not?(y--Yes,n--Not):");scanf("%c",&judge);getchar();if(judge=='y')menu();else{ printf("\nNow the graph is:");display();printf("\npress any key to quit");getchar();}}void guolink(){ int i;for(i=0;i<=3;i++)MA[i]=A[0][i];display();menu();}int filecontrol() //主函数{ int i, j=0,p,len=0;char tmp[10],[10],tmp1[10],k;struct command tmp2[10];FILE *fp;help();strcpy(cmd[0].,"format"); //将各个命令存进命令表strcpy(cmd[1].,"dir");strcpy(cmd[2].,"cat");strcpy(cmd[3].,"ls");strcpy(cmd[4].,"md");strcpy(cmd[5].,"vi");strcpy(cmd[6].,"del");strcpy(cmd[7].,"deldir");strcpy(cmd[8].,"cd");strcpy(cmd[9].,"cd..");strcpy(cmd[10].,"help");strcpy(cmd[11].,"quit");strcpy(cmd[12].,"guo");if((fp=fopen("system","rb"))==NULL) //判断系统文件是否存在{printf("can not open file\n");printf("format the disk Y / N \n");scanf("%c",&k);if(k=='y')format();}else{read_file(fp); //读取系统文件的容}while(1){j=0; //必须重新给恢复0否则出错strcpy(tmp,cur_dir);while(strcmp(tmp,"root")!=0){for(i=0;i<640;i++){p=root[i].i_num;if(strcmp(tmp,root[i].file_name)==0 && (i_node[p].file_style==0)) {strcpy(tmp2[j].,tmp);j++;strcpy(tmp,root[i].dir_name);}}}strcpy(tmp2[j].,tmp);for(i=j;i>=0;i--){printf("%s/",tmp2[i].);}scanf("%s",); //输入命令并且查找命令的相关操作for(i=0;i<13;i++){if(strcmp(,cmd[i].)==0){p=i;break;}if(i==13) //如果没有这个语句以后输入的命令都和第一次输入的效果一样{p=14; //随便的一个值}switch(p){case 0: format(); //初始化break;case 1: display_curdir(); //查看当前目录下的文件列表break;case 2: scanf("%s",tmp); //查看文件open_file(tmp);break;case 3: display_sys(); //查看系统信息break;case 4:scanf("%s",tmp); //创建目录create_dir(tmp);break;case 5: scanf("%s",tmp); //创建文件scanf("%d",&len);create_file(tmp,len);break;case 6: scanf("%s",tmp); //删除文件for(i=0;i<640;i++) //判断文件是不是正规文件{j=root[i].i_num;if(strcmp(tmp,root[i].file_name)==0 && (i_node[j].file_style)==1){del_file(tmp);break;}}if(i==640){printf("这个不是正规文件文件\n");}break;case 7:scanf("%s",tmp); //删除目录del_dir(tmp);break;case 8: scanf("%s",tmp1); //进入当前目录下的指定目录相当于进入目录cd + 目录名display_dir(tmp1);break;case 9: back_dir(); //返回上一级目录break;case 10:help();break;case 11:write_file(fp); //将磁盘利用信息写进系统文件,退出return 0;case 12:guolink();break;default:printf("SORRY,没有这个命令\n");break;}}int main(){ int i;printf("操作系统课程设计\n");printf("请输入选择\n");printf("input your choice(1 stand for file control\n 2 stand for guo control)\n");scanf("%d",&i);if(i==1)filecontrol();else if(i==2)guolink();else ;return 0;}六、实验结果显示。

相关文档
最新文档