文件系统存储空间管理模拟实验报告
- 格式:doc
- 大小:834.50 KB
- 文档页数:17
操作系统试验班级:计科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. 删除新目录。
四、实验结果:通过实验操作,我成功创建了一个文件,并且能够通过打开、写入、保存、关闭等操作对文件进行管理。
此外,我还能够设置文件的权限属性,例如读、写、执行权限,以及创建和删除目录。
五、实验心得:通过这次文件管理虚拟实验实验,我对操作系统中的文件管理有了更深入的理解和掌握。
通过实际操作,我更加熟悉了文件的创建、打开、关闭、读写等操作,并能够正确地设置文件的权限属性和对目录进行创建和删除操作。
在实验过程中,我发现文件管理是操作系统中非常重要的一部分,文件的管理涉及到了数据的存储、读取和保密等方面的内容。
合理地管理文件能够提高操作系统的效率和安全性。
此外,我还意识到文件的权限属性对文件的访问和使用具有重要的作用。
正确地设置文件的权限属性可以有效地保护文件的机密性和完整性,防止未经授权的访问和恶意操作。
第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. 文件夹创建与删除:实验成功创建和删除了文件夹,验证了文件管理的可行性。
存储管理实验报告总结本次实验主要是针对存储管理进行的。
存储管理是操作系统中非常重要的一部分,它负责管理计算机系统的内存空间,为进程提供必要的存储资源。
通过本次实验,我对存储管理的相关概念和技术有了更加深入的了解。
在实验中,我首先学习了存储管理的基本原理。
操作系统将内存分为若干个大小相等的页框,而进程的内存空间则被划分为若干个大小相等的页。
通过页表的映射关系,操作系统可以将进程的页映射到物理内存的页框上。
这样,进程就可以方便地访问内存中的数据。
在实验中,我还学习了虚拟内存的概念和实现方法。
虚拟内存是一种扩展内存的方法,它允许进程访问超出物理内存容量的数据。
虚拟内存通过将进程的页映射到磁盘上的页面文件中,实现了内存的扩展。
当进程需要访问某个页面时,操作系统会将该页面从页面文件中加载到物理内存中,并更新页表的映射关系。
在实验中,我还学习了页面置换算法的原理和实现。
页面置换算法是虚拟内存中非常重要的一部分,它负责决定哪些页面需要被置换出去。
常见的页面置换算法有FIFO算法、LRU算法和Clock算法等。
不同的算法有着不同的性能特点和适用场景,我们需要根据具体的应用场景选择合适的页面置换算法。
在实验中,我还学习了内存分配和回收的方法。
操作系统通过内存分配算法为进程分配内存空间,而通过内存回收算法回收进程不再使用的内存空间。
内存分配算法的选择会影响到系统的性能和资源利用率,我们需要根据具体的应用场景选择合适的内存分配算法。
通过本次实验,我深入了解了存储管理的相关概念和技术。
存储管理是操作系统中非常重要的一部分,它直接影响到系统的性能和资源利用率。
合理地管理存储资源可以提高系统的运行效率和稳定性,从而提升用户的体验。
在今后的学习和工作中,我将进一步深化对存储管理的理解,不断提升自己的技术水平。
一、实验目的1. 理解文件系统的基本概念和组成。
2. 掌握文件系统的创建、删除、修改和查询等基本操作。
3. 了解文件系统的性能分析和优化方法。
4. 提高对文件系统原理的理解和实际操作能力。
二、实验环境1. 操作系统:Windows 102. 文件系统:NTFS3. 实验软件:Windows资源管理器、Notepad++等三、实验内容1. 文件系统的基本概念和组成(1)文件:存储在文件系统中的数据单元,可以是程序、文档、图片等。
(2)目录:用于组织文件的结构,类似于文件夹。
(3)文件系统:管理存储设备上文件和目录的数据结构。
2. 文件系统的创建、删除、修改和查询等基本操作(1)创建文件:使用Notepad++创建一个名为“test.txt”的文本文件。
(2)创建目录:在Windows资源管理器中,创建一个名为“test”的目录。
(3)删除文件:选中“test.txt”文件,按Delete键删除。
(4)删除目录:选中“test”目录,按Delete键删除。
(5)修改文件:使用Notepad++打开“test.txt”文件,修改内容后保存。
(6)查询文件:在Windows资源管理器中,通过路径或搜索功能查找“test.txt”文件。
3. 文件系统的性能分析和优化方法(1)查看磁盘空间使用情况:在Windows资源管理器中,选中磁盘分区,查看磁盘空间使用情况。
(2)清理磁盘:使用Windows自带的磁盘清理工具清理磁盘垃圾文件。
(3)优化文件系统:使用Windows自带的磁盘碎片整理工具优化文件系统。
四、实验结果与分析1. 创建文件和目录实验结果显示,使用Notepad++创建了一个名为“test.txt”的文本文件,使用Windows资源管理器创建了一个名为“test”的目录。
2. 删除文件和目录实验结果显示,成功删除了“test.txt”文件和“test”目录。
3. 修改文件实验结果显示,使用Notepad++修改了“test.txt”文件的内容,并成功保存。
实验目的:通过本次实验,了解文件存储的基本原理,掌握文件存储系统的组成和功能,熟悉不同文件存储方式的优缺点,并能够对文件存储系统进行性能测试和优化。
实验时间:2023年3月15日实验地点:计算机实验室实验器材:1. 计算机(配备Windows操作系统)2. 文件存储设备(如硬盘、固态硬盘、U盘等)3. 文件存储管理软件(如Windows资源管理器、Disk Management等)4. 文件压缩软件(如WinRAR等)实验内容:一、文件存储系统组成及功能1. 文件存储系统组成:(1)硬件:硬盘、固态硬盘、U盘等存储设备;(2)软件:操作系统中的文件系统、文件存储管理软件等。
2. 文件存储系统功能:(1)存储:将文件数据存储在存储设备上;(2)管理:对存储在设备上的文件进行分类、排序、检索、备份等操作;(3)保护:防止文件数据丢失、损坏,确保数据安全;(4)优化:提高文件存储系统的性能。
二、文件存储方式1. 磁盘存储方式:(1)优点:容量大、读写速度快、易于扩展;(2)缺点:存储速度受磁盘转速、寻道时间等因素影响。
2. 固态硬盘存储方式:(1)优点:读写速度快、无机械磨损、功耗低、体积小;(2)缺点:容量相对较小、价格较高。
3. U盘存储方式:(1)优点:携带方便、容量适中、易于扩展;(2)缺点:读写速度较慢、容量有限。
三、文件存储性能测试1. 测试工具:使用CrystalDiskMark软件进行测试。
2. 测试方法:(1)将测试文件复制到硬盘、固态硬盘、U盘中;(2)使用CrystalDiskMark软件分别对三种存储方式进行读写速度测试;(3)记录测试结果。
3. 测试结果分析:(1)硬盘:读写速度约为100MB/s;(2)固态硬盘:读写速度约为500MB/s;(3)U盘:读写速度约为20MB/s。
四、文件存储优化1. 合理分配磁盘空间:根据文件类型和用途,合理分配磁盘空间,提高磁盘利用率。
2. 定期整理磁盘:删除无用的文件,清理磁盘碎片,提高文件访问速度。
一、实验目的1. 理解文件管理的基本概念和原理。
2. 掌握文件系统的组织结构和文件操作的基本方法。
3. 培养实际操作能力,提高文件管理的效率。
二、实验环境1. 操作系统:Windows 102. 文件管理工具:Windows自带的文件管理器三、实验内容1. 文件系统的基本概念和原理2. 文件系统的组织结构3. 文件操作的基本方法4. 文件夹的创建、删除、重命名等操作5. 文件和文件夹的搜索与查找6. 文件属性的查看和修改7. 文件和文件夹的复制、移动、粘贴等操作8. 文件和文件夹的压缩与解压缩9. 文件和文件夹的权限设置四、实验步骤1. 打开文件管理器,查看当前文件夹的结构。
2. 创建一个新的文件夹,命名为“实验文件夹”。
3. 在“实验文件夹”中创建一个文本文件,命名为“实验.txt”。
4. 打开“实验.txt”,输入以下内容:实验报告:文件管理实验5. 保存并关闭“实验.txt”。
6. 将“实验.txt”复制到“实验文件夹”中。
7. 将“实验.txt”移动到桌面。
8. 重命名“实验.txt”为“实验1.txt”。
9. 删除“实验1.txt”。
10. 搜索“实验文件夹”中的文件。
11. 查看文件属性。
12. 修改文件属性。
13. 压缩“实验文件夹”。
14. 解压缩“实验文件夹”。
15. 设置文件和文件夹的权限。
五、实验结果与分析1. 文件系统的基本概念和原理:通过实验,我们了解到文件系统是计算机中用于存储和管理文件的数据结构,包括文件、文件夹、磁盘等。
文件系统负责对文件进行组织、存储、检索、更新等操作。
2. 文件系统的组织结构:实验中,我们通过文件管理器查看当前文件夹的结构,了解到文件系统采用树状结构组织文件和文件夹。
3. 文件操作的基本方法:实验中,我们学习了文件和文件夹的创建、删除、重命名、复制、移动、粘贴等操作方法。
4. 文件和文件夹的搜索与查找:实验中,我们通过文件管理器搜索功能,快速找到所需的文件和文件夹。
内存模拟管理实验报告引言内存管理是操作系统中重要的一部分,它负责管理计算机的内存资源,合理地分配和回收内存空间。
本实验旨在模拟内存管理过程,通过对内存分配、回收和置换算法的模拟实验,加深对内存管理的理解。
实验目的通过本实验,我们的目标是:1. 掌握内存分配、回收和置换算法的基本原理;2. 理解不同的内存管理算法的特点和适用场景;3. 学会使用模拟软件进行内存管理实验。
系统设计本实验采用基于模拟软件的方式进行,我们使用了一款常用的内存管理模拟软件——MemSim。
该软件可以模拟内存的分配、回收和置换算法,并根据实验结果生成相应的性能报告。
首先,我们在MemSim中设计了一个包含若干作业和内存分区的实验环境。
我们可以设置不同的作业大小和内存分区大小,以及各种不同的内存分配、回收和置换算法。
实验过程首先,我们设计了三种内存分配算法:首次适应算法(First Fit)、最佳适应算法(Best Fit)和最坏适应算法(Worst Fit)。
我们分别选择了一组作业和一组内存分区,并使用这三种算法进行内存分配测试。
我们观察到:- 首次适应算法往往会使碎片数量较少,但存在大量分散的小碎片;- 最佳适应算法分配的内存分区较为紧凑,但会导致外部碎片的增加;- 最坏适应算法可以很好地避免外部碎片的产生,但会导致更多的内部碎片。
接下来,我们针对内存回收算法进行了实验。
我们测试了随时间回收算法(FIFO)和优先级回收算法(Priority)两种算法,并选择了不同的作业和内存分区进行了测试。
我们观察到:- 随时间回收算法在作业的运行时间较长的情况下,表现较好;- 优先级回收算法可以根据作业的优先级来选择回收内存,适合于具有不同优先级的作业。
最后,我们还对内存置换算法进行了实验。
我们测试了最先进入先出算法(FIFO)和最不常使用算法(LFU)。
我们选择了一组较大的内存分区,并模拟了一组较大的作业。
通过实验,我们了解到:- 最先进入先出算法可以很好地保证作业的执行顺序,但会导致较高的缺页率;- 最不常使用算法可以合理地选择置换页面,但会增加算法的复杂度。
南昌大学操作系统实验报告存储管理的模拟实现南昌大学实验报告---存储管理的模拟实现学生姓名:张皓然学号:5501215001专业班级:本硕151实验类型:□ 验证□ 综合■ 设计□ 创新实验日期:实验成绩:一、实验目的存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
二、实验内容1.过随机数产生一个指令序列,共320条指令。
其地址按下述原则生成:①50%的指令是顺序执行的;②25%的指令是均匀分布在前地址部分;③25%的指令是均匀分布在后地址部分;#具体的实施方法是: A. B. C. D. E. F.在[0,319]的指令地址之间随机选区一起点M; 顺序执行一条指令,即执行地址为M+1的指令;在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’; 顺序执行一条指令,其地址为M’+1;在后地址[M’+2,319]中随机选取一条指令并执行;重复A—E,直到执行320次指令。
2.指令序列变换成页地址流设:页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条—第9条指令为第0页;第10条—第19条指令为第1页;。
第310条—第319条指令为第31页;按以上方式,用户指令可组成32页。
3. 计算并输出下述各种算法在不同内存容量下的命中率。
A. FIFO先进先出的算法 B. LRU最近最少使用算法C.LFU最少访问页面算法三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤代码如下:#include #include #include #include #ifndef _UNISTD_H #define _UNISTD_H #include #include #endif #define TRUE 1 #define FALSE 0 #define INV ALID -1 #define total_instruction 320//指令流长#define total_vp 32//虚页页长#define clear_period 50//清零周期typedef struct//页面结构{ int pn,//页面序号pfn,//页面所在内存区的帧号counter,//单位时间内访问量time;}pl_type; pl_type pl[total_vp];//页面结构数组struct pfc_struct{//页面控制结构int pn,//页面号pfn; //内存区页面的帧号//页面指针,用于维护内存缓冲区的链式结构struct pfc_struct *next; }; typedef structpfc_struct pfc_type; //主存区页面控制结构名称pfc_type pfc[total_vp],//主存区页面控制结构数组*freepf_head, //空闲页面头指针*busypf_head,//忙页面头指针*busypf_tail;//忙页面尾指针int diseffect;//缺页计数器int a[total_instruction]; //指令流数组int page[total_instruction]; //指令对应的页面号int offset[total_instruction]; //指令所在页面的偏移量//初始化页面结构数组和页面控制结构数组int initialize(int); int FIFO(int);//先进先出int LRU(int);//最近最久未使用int OPT(int);//最佳置换算法int CLOCK(int);//clock置换算法int main( ) { int s;int i; srand(10*getpid()); s = (int)((float)(total_instruction-1)*(rand()/(R AND_MAX+))); printf(\随机产生指令流------------\\n\for (i=0; i a[i]=s; //任选一指令访问点ma[i+1]=a[i]+1; //顺序执行一条指令a[i+2]=(int)((float)a[i]*(rand()/(RAND_M AX+))); //执行前地址指令m’a[i+3]=a[i+2]+1; //顺序执行一条指令printf(\s = (int)((float)((total_instruction-1)-a[i+2])*(r and()/(RAND_MAX+))) a[i+2];} printf(\ for (i=0;i page[i]=a[i]/10; offset[i]=a[i] ;} printf(\不同页面工作区各种替换策略的命中率表--\\n\ printf(\for(i=4;i printf(\ FIFO(i);LRU(i);OPT(i); CLOCK(i);printf(\} return 0; + } //初始化页面结构数组和页面控制结构数组//total_pf; 用户进程的内存页面数int initialize(int total_pf) { int i; diseffect=0; for(i=0;i//主存区页面控制结构的空闲页面头指针指向pfc[0] return 0; } //最久最近未使用算法形参为用户进程的内存页面数目int LRU (int total_pf) { int MinT;//最小的访问时间int MinPn;//拥有最小访问时间的页的页号int i,j; int CurrentTime; initialize(total_pf);//初始化CurrentTime=0; diseffect=0; for(i=0;i diseffect++;//缺页次数+1 if(freepf_head==NULL)//无空闲的页面{ MinT=100000; for(j=0;jpl[j].time&&pl[j].pfn!=INV ALID) { MinT=pl[j].time; MinPn=j;}} //释放最久未访问的页面freepf_head=&pfc[pl[MinPn].pfn]; //最久未访问页面被换出主存pl[MinPn].pfn=INV ALID; //最久未访问页面的访问时间设置为无效pl[MinPn].time=-1;freepf_head->next=NULL;} pl[page[i]].pfn=freepf_head->pfn;pl[page[i]].time=CurrentTime;freepf_head=freepf_head->next;} else pl[page[i]].time=CurrentTime; CurrentTime++;} printf(\return 0; } //最佳置换算法int OPT(int total_pf) { int i,j; int MaxD; //将来最近一次访问距离的最大值int MaxPn;//对应的页号int dis; //距离计数器int dist[total_vp]; initialize(total_pf);diseffect=0; for(i=0;i OPT算法流程图:开始页面存入数组p 初始化内存块page 是i++ P[i]是否已在内存中否Page是否有空否是将距离最远的页面从page中的页面置换出去直接将p[i]装入内存i++ 是输出当前页面的命中率否i结束Clock算法流程图:开始查询指针前进一步否页面访问位=0 置页面访问位=0 是选择该页面淘汰结束五、实验数据及处理结果随机产生指令流,并给出不同置换策略的命中率表。
文件管理实验报告文件管理实验报告一、引言文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
在这个实验中,我们将通过模拟文件管理系统来了解文件管理的基本原理和技术。
二、实验目的本实验的主要目的是通过设计和实现一个简单的文件管理系统,加深对文件管理的理解,并掌握文件的创建、读写、删除等基本操作。
三、实验过程1. 文件的创建在文件管理系统中,文件的创建是一个重要的操作。
我们首先需要确定文件的名称和文件的类型。
在实验中,我们选择了一个文本文件作为示例。
通过调用系统提供的文件创建函数,我们可以在指定的目录下创建一个新的文本文件。
2. 文件的读写文件的读写是文件管理的核心操作之一。
在实验中,我们使用了C语言的文件读写函数来实现对文件的读写操作。
首先,我们需要打开文件,然后可以使用读取函数来读取文件中的内容,或者使用写入函数来向文件中写入内容。
最后,我们需要关闭文件,以确保文件的完整性和安全性。
3. 文件的删除文件的删除是一个常见的操作。
在实验中,我们通过调用系统提供的文件删除函数来删除指定的文件。
在删除文件之前,我们需要确保文件已经关闭,并且没有其他进程正在使用该文件。
通过删除文件,我们可以释放磁盘空间,并且保持文件系统的整洁。
四、实验结果通过实验,我们成功地创建了一个简单的文件管理系统,并实现了文件的创建、读写和删除等基本操作。
我们可以通过系统提供的命令来查看文件的属性和内容,以及进行其他操作。
五、实验总结通过这次实验,我们深入了解了文件管理的原理和技术。
文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
掌握文件管理的基本原理和技术对于我们理解计算机系统的运行机制和提高工作效率都具有重要意义。
在实验中,我们通过设计和实现一个简单的文件管理系统,加深了对文件管理的理解,并掌握了文件的创建、读写、删除等基本操作。
通过实验结果的验证,我们证明了文件管理系统的可行性和有效性。
课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号专业班级实验日期成绩指导老师一、实验目的根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。
二、实验原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,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号磁盘块的状2. 输出初始位示图信息;3. 输入文件分配或释放请求,(1)格式:“+ 文件名申请块数”或“ - 文件名”“+”表示申请文件分配,“-”表示删除文件如:+ F1 54. 根据请求完成相应操作。
操作系统大型试验实验报告姓名:XX班级:软件工程110x学号:201126630xxx一、名称操作系统大型试验。
二、目的用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求开发工具:word,vc win32api1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储2.文件系统的目录结构采用类似Linux的树状结构;3.要求模拟的操作包括:a)目录的添加、删除、重命名;b)目录的显示(列表)c)文件的添加、删除、重命名d)文件和目录的拷贝4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明5.用户输入exit时退出该系统6.实验实现基于windows平台;7.实验开发语言可以选用C/c++等四、设计1.主要思路说明本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。
模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。
设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。
搜索空白物理盘块时采用顺序搜索物理盘块数组。
存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!2.申优功能:1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号专业班级实验日期成绩指导老师一、实验目的根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。
二、实验原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,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;}六、实验结果显示。