磁盘空间管理模拟实验

合集下载

磁盘管理的实验报告

磁盘管理的实验报告

磁盘管理的实验报告实验报告:磁盘管理一、引言(100字)磁盘是计算机中主要的存储介质之一,磁盘管理是操作系统中的一项重要任务。

本实验旨在通过模拟磁盘管理的相关操作,加深对磁盘管理的理解,并学习实际应用中磁盘管理的策略。

二、实验目的(100字)1.了解磁盘管理的基本原理和相关概念;2.学习磁盘分区的原理及实践;3.理解磁盘调度算法的工作原理;4.掌握常用的磁盘管理策略。

三、实验内容(300字)1.磁盘分区:a.使用磁盘分区工具将物理磁盘划分为若干个分区;b.使用命令查看已分区、格式化后的磁盘分区。

2.磁盘调度算法:a.了解并实现FCFS(先来先服务)、SSTF(最短寻道时间优先)和SCAN(扫描)等磁盘调度算法;b.分别使用模拟程序测试不同算法的性能。

3.磁盘缓存:a.实现一个简单的磁盘缓存管理系统;b.学习并使用命令进行磁盘缓存管理的相关操作。

四、实验步骤(400字)1.磁盘分区:a.打开磁盘分区工具,选择对应磁盘进行分区,设置分区大小和类型;b.格式化已分区的磁盘,创建文件系统;c.使用命令查看分区情况,确认分区操作是否成功。

2.磁盘调度算法:a.阅读并理解给定的FCFS、SSTF和SCAN算法的伪代码;b.根据伪代码实现相应的算法,并进行测试;c.分别使用模拟程序测试不同算法的性能,根据性能结果评估各算法的优劣。

3.磁盘缓存:a.阅读并理解磁盘缓存管理的相关原理和命令;b.实现一个简单的磁盘缓存管理系统,包括缓存页面的替换策略;c.使用命令进行磁盘缓存管理的相关操作,通过测试验证缓存管理系统的正确性。

五、实验结果(150字)1.磁盘分区工具成功将物理磁盘划分为若干个分区,并格式化后创建了文件系统;2.使用命令查看分区情况,确认分区操作成功;3.实现了FCFS、SSTF和SCAN算法,并成功模拟了它们的运行过程;4.使用模拟程序测试了不同算法的性能,分析并比较了各算法的优劣;5.成功实现了一个简单的磁盘缓存管理系统,并通过测试验证了其正确性。

管理磁盘存储实训报告

管理磁盘存储实训报告

Windows网络操作系统管理课程实训报告实训名称:管理磁盘存储实训h-OX»|I G,T fl.SQ-QOflifidJXlB gw QJCT2.使用服务器管理器,在第一个磁盘上创建一个主分区号为X;文件系统为ReFS;卷标为Data。

4.使用磁盘管理,将卷X ,扩展到4096 MB 。

文世闺»^AJ« = M 品沏林0 31目USr X 01 BE工■可闰市! 凌串 |胃行蓄差W7S一三二二・ 二回-0« i» 网 -rue 花+周干 置羊 虫 *唯 S3:SiNTK挈工 而陪艇NJF5状石艮F L-iUiBUJ(-4XHR1F L 状哼吃21© Me 200 MB 里他G& 47.W 驰 杂 XGB 4.30 GB 加 MB4&1MBtoo % 79 U97% 年了 M.叱i 於工■55.M GB 呢C-sta -X: 5.00 GB 3汽54J87 G :B■丑士2设ttA (曲凤敦胧 G6 504 M B NIF S 聚仁UlSff■ * 4 ■ _ -.■二■ F 3堂5M9 GB iWffi■吐[之任里年. |概t旨i 、Eax» miME己叩印用1 】g#3 理事..不%48 仃寤融 79%C-dLa Dtl降百庆时: 一11£0日i^bM& 至**由川寿四土费NTFSWi M s4MMRq 『,ww gi ; moo ME NTFSH.ROfl装万良牙5.将C:\Windows\System32\imgageres.dll复制到卷Z,再复制出9个副本文件。

a. 茎事至百G 5号一■楸摩田 3 \:青=*。

诏(7:'停表3 If ML*也博时可■ S3mg—时=ru.dl25,仃.弓。

15:: 2宜阳等寸温力Kfi・Egag白七-副豆.dll2C 寸:0口15:1.5度用磐F属OKE♦卜科E!X.L3J dll15455.!wr©*tj p fl IIICB* 1力呜d拒rl - E S® 3 dll20"仃巧1。

分区存储管理模拟实验报告

分区存储管理模拟实验报告

分区存储管理模拟实验报告分区存储管理模拟实验报告1.实验目的了解动态分区存储管理方式中的数据结构和分配算法,加深对动态分区存储管理方式及其实现技术的理解。

2. 实验内容▪用C语言或Pascal语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程Allocate()和回收过程Free()。

其中,空闲分区采用空闲分区链来组织,内存分配时,优先使用空闲区低地址部分的空间。

▪假设初始状态,可用内存空间为640KB,作业请求序列如下(也可以编程从键盘输入,R 表示请求,F表示释放):✧作业1请求130 KB。

✧作业2请求60 KB。

✧作业3请求100 KB。

到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。

最佳适应算法:当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。

然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。

内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。

并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。

typedef struct freearea{}ElemType;定义一个空闲区说明表结构,每申请一个作业,改作业便具有此结构体typedef struct DuLNode{}DuLNode,*DuLinkList;定义一个双向链表Status Initblock(){}开创带头结点的内存空间链表,通过双向链表把申请的作业链接起来,作业的插入和删除,和链表中节点的插入和删除类似。

双向链表如图1所示Status First_fit(int ID,int request){}传入作业名及申请量采用首次适应算法实现动态内存分区分配的模拟,初始态640KB,只是一个虚态,每申请成功一个作业,便相应的640KB做相应的减少,同过双向链表模拟主存的分配情况。

磁盘管理空间实验报告

磁盘管理空间实验报告

一、实验目的本次实验旨在让学生了解磁盘管理的基本概念和操作,掌握磁盘分区、格式化、挂载等基本技能,熟悉磁盘空间分配策略和优化方法,提高学生对磁盘管理的实际操作能力。

二、实验环境操作系统:Linux Ubuntu 20.04硬件环境:虚拟机,CPU:2.5GHz,内存:4GB,硬盘:100GB三、实验内容1. 磁盘分区(1)查看磁盘分区信息使用`fdisk -l`命令查看当前磁盘的分区信息。

(2)创建新分区使用`fdisk /dev/sdb`命令进入磁盘分区编辑模式,创建新分区。

(3)格式化分区使用`mkfs.ext4 /dev/sdb1`命令将新分区格式化为ext4文件系统。

2. 磁盘挂载(1)创建挂载点使用`mkdir /mnt/sdb1`命令创建挂载点。

(2)挂载分区使用`mount /dev/sdb1 /mnt/sdb1`命令将分区挂载到挂载点。

3. 磁盘空间分配策略(1)查看磁盘空间使用情况使用`df -h`命令查看磁盘空间使用情况。

(2)优化磁盘空间分配使用`du -sh `命令查看目录大小,删除不必要的文件。

4. 磁盘碎片整理(1)查看磁盘碎片情况使用`e2fsck -f /dev/sdb1`命令检查磁盘碎片情况。

(2)整理磁盘碎片使用`e2fsck -f /dev/sdb1`命令整理磁盘碎片。

四、实验步骤1. 查看磁盘分区信息执行`fdisk -l`命令,查看当前磁盘的分区信息。

2. 创建新分区执行`fdisk /dev/sdb`命令,进入磁盘分区编辑模式。

(1)输入`n`创建新分区。

(2)选择分区类型(主分区或扩展分区)。

(3)选择分区编号。

(4)设置分区起始扇区。

(5)设置分区结束扇区。

3. 格式化分区执行`mkfs.ext4 /dev/sdb1`命令,将新分区格式化为ext4文件系统。

4. 创建挂载点执行`mkdir /mnt/sdb1`命令,创建挂载点。

5. 挂载分区执行`mount /dev/sdb1 /mnt/sdb1`命令,将分区挂载到挂载点。

磁盘空间管理模拟实验之Linux磁盘空间管理

磁盘空间管理模拟实验之Linux磁盘空间管理

目录摘要 (2)前言 (3)正文 (4)1. 实验目的 (4)2. 设计思想 (4)3. 实验结构图 (5)4. 各模块的伪码算法 (5)5. 测试分析 (10)6. 测试结果 (11)7. 源程序 (14)总结 (24)参考文献 (25)致谢 (26)摘要要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。

存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。

用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。

如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存储空间的分配和收回的方法:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况),空闲块链接法(在UNIX操作系统中,把磁盘存储空间的空闲块成组链接)。

关键词:磁盘的分配和回收管理;位示图;成组链接。

前言通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。

学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的物理地址过程。

学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。

了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

希望通过本次设计过程可以提高自己的分析问题的能力和实际动手的能力,将学到的知识用于实践中。

正文1. 实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。

每个磁道又分成若干个扇区(又叫做块)。

这些空间就是用来存放用户文件的。

当用户的文件不再需要时,就应该删除。

把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。

因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。

如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。

磁盘管理分区实验报告

磁盘管理分区实验报告

一、实验目的本次实验旨在掌握Linux系统中磁盘管理的相关操作,包括磁盘分区的创建、格式化、挂载以及分区信息的查看等。

通过实验,加深对磁盘分区概念的理解,并能够熟练运用相关命令进行磁盘管理。

二、实验环境操作系统:Ubuntu 20.04 LTS硬件设备:虚拟机(至少1GB内存,10GB硬盘空间)软件工具:Linux命令行终端三、实验内容1. 磁盘分区(1)查看现有磁盘信息使用`lsblk`命令查看系统中现有的磁盘和分区信息。

```bashlsblk```(2)创建分区使用`fdisk`命令创建新的分区。

以下示例中,我们将对/dev/sdb磁盘进行分区。

```bashsudo fdisk /dev/sdb```在`fdisk`命令的交互式界面中,按照以下步骤操作:- 输入`n`创建新的分区。

- 输入`p`创建主分区。

- 按提示输入分区号(例如1)。

- 按提示输入起始扇区,默认回车即可。

- 按提示输入结束扇区,默认回车即可。

- 输入`w`保存并退出`fdisk`。

(3)查看分区信息再次使用`lsblk`命令查看分区信息,确认新创建的分区。

2. 格式化分区(1)使用`mkfs`命令格式化分区。

以下示例中,我们将格式化新创建的分区/dev/sdb1。

```bashsudo mkfs.ext4 /dev/sdb1```(2)确认格式化结果使用`lsblk`命令查看分区信息,确认分区已格式化。

3. 挂载分区(1)创建挂载点在`/mnt`目录下创建一个挂载点,用于挂载新创建的分区。

```bashsudo mkdir /mnt/new_disk```(2)挂载分区使用`mount`命令将新创建的分区挂载到挂载点。

```bashsudo mount /dev/sdb1 /mnt/new_disk```(3)查看挂载信息使用`df -h`命令查看挂载信息,确认分区已挂载。

4. 卸载分区使用`umount`命令卸载已挂载的分区。

操作系统 磁盘空间管理的实验报告

操作系统 磁盘空间管理的实验报告

实验五磁盘存储空间的管理一、实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。

每个磁道又分成若干个扇区(又叫做磁盘块)。

之后用fdisk命令对硬盘进行分区,即使只有一个分区,也必须用fdisk命令进行分区。

分区的目的,就是制作文件卷,形成文件系统。

一个文件卷一般都被划分成引导扇区、文件系统管理区和文件数据区。

其中,文件数据区用来存放系统文件和用户文件。

用户可以通过文件系统提供的API,创建、打开、关闭和对文件进行读写。

当用户的文件不再需要时,就应该删除。

把一个文件放到磁盘上时,可以组织成连续文件、链接文件或索引文件等。

因此,磁盘空间的分配方法也有两种,一种是连续空间的分配,一种是不连续空间的分配(又叫动态分配)。

如何充分有效地利用磁盘空间,是操作系统应解决的重要课题之一。

本实验模拟实现磁盘空间的分配与回收,使学生对磁盘空间的管理有一个较深入的理解。

二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有详细注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体验及对实验的改进意见和见解三、实验内容(1)假定现有一个磁盘组,共有40个柱面。

每个柱面4个磁道,每个磁道又划分成4个物理记录。

磁盘的空间使用情况用位示图表示。

位示图用若干个字构成,每一位对应一个磁盘道。

“1”表示占用,“0”表示空闲。

为了简单,假定字长为16位,一个字可用来模拟磁盘的一个柱面,其位示图如图5—1所示。

系统设置一个变量S记录当前的空闲磁盘块个数。

位示图的初始状态由户自己设定。

图5-1 位示图(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出它的柱面号、磁道号和扇区号)。

①由位示图计算磁盘的相对块号的公式如下:相对块号=字号*16+位号②再将相对块号转换成磁盘的物理地址:柱面号=(相对块号/16)的商,也即柱面号=字号磁道号=((相对块号/16的余数)/4)的商,也即(位号/4)的商物理块号=(((相对块号/16)的余数)/4)的余数,也即(位号/4)的余数(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应由“1”改为“0”。

磁盘管理 实验报告

磁盘管理 实验报告

磁盘管理实验报告磁盘管理实验报告概述:磁盘管理是计算机操作系统中的重要组成部分,它负责管理计算机系统中的磁盘存储空间,确保数据的高效存取和安全性。

本实验旨在通过实际操作和测试,探究磁盘管理的原理和技术,并评估其对系统性能的影响。

实验目标:1. 理解磁盘管理的基本概念和原理。

2. 掌握磁盘分区和文件系统的创建与管理方法。

3. 了解磁盘调度算法的工作原理和性能特点。

4. 分析磁盘缓存和磁盘阵列技术对系统性能的影响。

实验环境:本次实验使用了一台配置较为普通的计算机,搭载了Windows 10操作系统和500GB机械硬盘。

实验步骤和结果:1. 磁盘分区和文件系统的创建与管理:在Windows 10操作系统中,我们使用了磁盘管理工具对硬盘进行了分区和格式化操作。

通过分区,我们将硬盘划分为多个逻辑驱动器,以便更好地管理和组织数据。

而文件系统的格式化则是为了在磁盘上创建文件系统,并对其进行初始化。

我们选择了NTFS文件系统,因为它支持更大的文件大小和更高的性能。

经过实验操作,我们成功地创建了多个分区,并将它们格式化为NTFS文件系统。

2. 磁盘调度算法的工作原理和性能特点:磁盘调度算法是为了优化磁盘访问的顺序和效率而设计的。

在本次实验中,我们选择了最常用的磁盘调度算法——SCAN算法,并通过实验测试其性能。

我们使用了一个模拟的磁盘访问序列,并记录了SCAN算法下的平均寻道时间和平均旋转延迟时间。

实验结果表明,SCAN算法在磁盘访问效率方面表现出色,能够较好地平衡磁盘访问的延迟和吞吐量。

3. 磁盘缓存和磁盘阵列技术对系统性能的影响:磁盘缓存和磁盘阵列技术是提高磁盘访问性能的两种常见方法。

磁盘缓存利用高速缓存存储器来暂存磁盘数据,以减少对磁盘的实际访问次数,从而提高系统的响应速度。

而磁盘阵列则是通过将多个磁盘组合成一个逻辑单元,实现数据的并行读写,从而提高磁盘的吞吐量。

通过实验测试,我们对比了启用和禁用磁盘缓存以及使用单个磁盘和磁盘阵列的情况下的磁盘访问性能。

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

目录摘要 (2)前言 (3)正文 (4)1. 实验目的 (4)2. 设计思想 (4)3. 实验结构图 (5)4. 各模块的伪码算法 (5)5. 测试分析 (10)6. 测试结果 (11)7. 源程序 (14)总结 (24)参考文献 (25)致谢 (26)摘要要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。

存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。

用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。

如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存储空间的分配和收回的方法:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况),空闲块链接法(在UNIX操作系统中,把磁盘存储空间的空闲块成组链接)。

关键词:磁盘的分配和回收管理;位示图;成组链接。

前言通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。

学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的物理地址过程。

学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。

了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

希望通过本次设计过程可以提高自己的分析问题的能力和实际动手的能力,将学到的知识用于实践中。

正文1. 实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。

每个磁道又分成若干个扇区(又叫做块)。

这些空间就是用来存放用户文件的。

当用户的文件不再需要时,就应该删除。

把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。

因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。

如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。

通过本实验,使学生对磁盘空间的分配与回收有一个较深入的理解。

2. 设计思想位示图法:一个简单的管理方法是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。

一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,位图中的每一位与盘组分块一一对应。

位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。

数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。

成组链接法:首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A〔0〕复制到内存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制到专用块这,然后把该块分配给申请者,当一组的空闲块分配完后则把专用块内容(下一组链接情况)复制到内存,再为申请者分配。

回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把内存中登记的一组链接情况MA复制到归还块中,然后在MA这重新登记一个新组。

显示分组情况。

系统初始化时先将专用块内容读入内存,当有申请空闲块要求时,就直接在内存专用块中找到哪些块是空闲的,每分配一块后把空闲块数减1。

但要把一组中第一块分配出去之前,可以先把登记在该块中的下一组的块号保存在专用块中(此时,原专用块中的信息巳经无用了,因它指示的一组空闲块都已分配掉)。

当中文组空闲块分配完后,则将下一组内容读入内存专用块中,以便继续分配时查找。

3. 实验结构图4. 各模块的伪码算法1)对位示图法申请磁盘块查看位示图找位号等是否找到是:由字位号计算相对块号和柱面号,磁道号,物理记录号,并输出这些相应参数否:返回,磁盘已满,本次无法分配置位示图相应位为1 返回定义分配函数:void assign(){unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;for(i=0 ,k=0;i<5;i++){q=size[i] ;j=0;while(1){j++ ;if((q%2)==0){ if(j==1) size[i]+=1;else{for(m=1;m<j;m++)s*=2 ;size[i]+=s;}k=1;break ;/*完成后退出*/}q=q/2;}if(k==1) /*将找到的位示图位转换成物理地址*/{ if((j-1)/8==1){zhm=2*i+1;cid=(j-9)/4;sq=(j-9)%4;}else{zhm=2*i;cid=(j-1)/4;sq=(j-1)%4;}n=1;break;/*退出for循环*/}}if(n==0)printf("没有空间可分配!\n");else{printf("分配成功!\n");/*输出物理地址*/printf("柱面号为: %d\n",zhm);printf("磁道号为: %d\n",cid);printf("扇区号为: %d\n",sq);}printf("分配后的位示图为:\n");out();}定义回收函数:void callback()/*回收函数*/{ unsigned int i,j,s=1,q,m,sq,zhm,cid;printf("确定要回收块的柱面号、磁道号、扇区号:\n");printf("请输入柱面号:");scanf("%d",&zhm);printf("\n请输入磁道号:");scanf("%d",&cid);printf("\n请输入扇区号:");scanf("%d",&sq);if(zhm%2==0)/*计算对应的位示图位置*/{ i=zhm/2;j=cid*4+sq+1;}else{ i=(zhm-1)/2;j=cid*4+sq+9;}q=size[i];m=j-1;while(m){q=q/2;m--;}if(q%2==1)/*判断该块是否被分配*/{if(j==1)size[i]-=1;/*将位示图对应为置零*/else{for(m=1;m<j;m++)s*=2 ;size[i]-=s;}printf("回收成功!");printf("回收后的位示图为:\n");out();}elseprintf("该块以被分配!");}2)对成组链接法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)break;}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(); /*显示*/}5. 测试分析用位示图表示的磁盘空间可以很形象的反映出磁盘中空间的利用情况,不足之处在于每次分配与回收只可以对单一的分块进行操作,不能同时进行几个块的分配与回收,要进行多个块的分配时,只能单独分配,且块之间没有相互链接,对于大的空间分配只能在连续空间进行。

用成组链接法模拟的磁盘空间能够解决用位示图中存在的问题,它可以通过链表的形式存取信息,对于较大的空间分配,若一个磁盘空间不够,通过指针找到下一个空闲的分区,但操作过程比较复杂,没有位示图方便,简捷。

6. 测试结果1)位示图法✧编译及连接时界面:✧刚运行时界面:✧分配空间时界面:✧回收空间时界面:2)成组链接法分配空间时界面:回收空间时界面:7. 源程序位示图法:#include<stdio.h>unsigned int size[5]={1,1,1,1,1};/*保存位示图*/void out()/*输出位示图函数*/{ unsigned int i,j,m;for(j=0;j<5;j++)/*循环输出size的各个数的各个二进制位*/{m=size[j];for(i=0;i<16;i++) /**/{printf("%d ",m%2);m=m/2;if(i==7)printf("\n");}printf("\n");}}void callback()/*回收函数*/{ unsigned int i,j,s=1,q,m,sq,zhm,cid;printf("确定要回收块的柱面号、磁道号、扇区号:\n");printf("请输入柱面号:");scanf("%d",&zhm);printf("\n请输入磁道号:");scanf("%d",&cid);printf("\n请输入扇区号:");scanf("%d",&sq);if(zhm%2==0)/*计算对应的位示图位置*/{ i=zhm/2;j=cid*4+sq+1;}else{ i=(zhm-1)/2;j=cid*4+sq+9;}q=size[i];m=j-1;while(m){q=q/2;m--;}if(q%2==1)/*判断该块是否被分配*/{if(j==1)size[i]-=1;/*将位示图对应为置零*/else{for(m=1;m<j;m++)s*=2 ;size[i]-=s;}printf("回收成功!");printf("回收后的位示图为:\n");out();}elseprintf("该块以被分配!");}void assign(){unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;for(i=0 ,k=0;i<5;i++){q=size[i] ;j=0;while(1){j++ ;if((q%2)==0){ if(j==1) size[i]+=1;else{for(m=1;m<j;m++)s*=2 ;size[i]+=s;}k=1;break ; /*完成后退出*/}q=q/2;}if(k==1) /*将找到的位示图位转换成物理地址*/{ if((j-1)/8==1){zhm=2*i+1;cid=(j-9)/4;sq=(j-9)%4;}else{zhm=2*i;cid=(j-1)/4;sq=(j-1)%4;}n=1;break;/*退出for循环*/}}if(n==0)printf("没有空间可分配!\n");else{printf("分配成功!\n");/*输出物理地址*/printf("柱面号为: %d\n",zhm);printf("磁道号为: %d\n",cid);printf("扇区号为: %d\n",sq);}printf("分配后的位示图为:\n");out();}void menu() /*功能选择函数*/ { int choice;char judge;printf("\n请选择操作:(1--分配,2--回收):");scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();elseprintf("\n没有此项!");printf("\n继续还是退出?(y--继续,n--退出):");scanf("%c",&judge);getchar();if(judge=='y')menu();else{ printf("\n现在的位示图:\n");out();printf("\n按任意键退出!\n");getchar();}}main(){printf("\t\t————欢迎进入磁盘空间管理模拟实验————\n");printf( " \n");printf("★★★★08级计算机一08240128 李彦博★★★★\n");printf("﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌\n");out();menu();}成组链接法:#include<stdio.h>int MA[4]; /*空闲块数组*/intA[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];}}else{i=MA[0];if(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)break;}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(); /*显示*/}void menu() /*功能选择函数*/{ int choice;char judge;printf("\n做出选择:(1--分配,2--回收):");scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();elseprintf("\n错误请求!");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");}}main(){ int i;for(i=0;i<=3;i++)MA[i]=A[0][i];display();menu();}总结经过本次课程设计,完成题目“磁盘空间管理模拟实验”,熟悉了UNIX/LINUX 的常用基本命令,理解并掌握了UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

相关文档
最新文档