磁盘空间管理模拟实验源程序
- 格式:doc
- 大小:43.50 KB
- 文档页数:9
实验报告课程名称:操作系统院系:信息与控制工程学院专业班级:计算机0801姓名:指导老师:2010年 12月 31日目录一、实验目的 2二、需求分析 2三概要设计 3四、详细设计 4(1)先来先服务算法(FCFS) 4(2)最短寻道时间优先算法(SSTF) 5(3)电梯算法(SCAN) 7五、调试过程 8六、结论与体会 8七、附件:源程序清单 9一、实验目的本实验的目的是通过设计一个磁盘调度模拟系统,以加深对FCFS、最短寻道时间以及电梯等磁盘调度算法的理解。
让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二、需求分析1、模拟一个磁盘调度算法;Visual C++ 6.0平台2、输入为一组作业的磁道请求;作业的寻到请求可以用一个数组模拟3、要求能够模拟FCFS、最短寻道时间、电梯算法三个磁盘调度算法;FCFS (First Come First Served )先来先服务,在计算机并行任务处理中,被视为最简单的任务排序策略,即是无论任务大小和所需完成时间,对先到的任务先处理,后到的任务后处理。
按照此算法,数组顺序输出即可。
最短寻道时间优先(ShortestSeekTimeFirst,SSTF)要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,确定当前磁道,选择距离当前最近的。
电梯算法,磁臂仅移动到请求的最外道就回转。
反方向查找服务。
确定当前磁道以及运动方向,排序后的数组当前磁道以后的磁道顺序序输出,在将剩余反向输出。
4、输出为按选择的算法执行时的磁头移动轨迹和移动的总道数。
三概要设计系统流程图四、详细设计(1)先来先服务算法(FCFS)先来先服务(FCFS)调度:按先来后到次序服务,未作优化。
最简单的移臂调度算法是“先来先服务”调度算法,这个算法不必考虑当前移臂所在的位置,而只是考虑访问者提出访问请求的先后次序。
.先来先服务算法流程图(2)最短寻道时间优先算法(SSTF)最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短(距离当前移臂最近)的那个请求先执行的,而不管访问者到来的先后次序。
一、实验目的本次实验旨在让学生了解磁盘管理的基本概念和操作,掌握磁盘分区、格式化、挂载等基本技能,熟悉磁盘空间分配策略和优化方法,提高学生对磁盘管理的实际操作能力。
二、实验环境操作系统: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`命令,将分区挂载到挂载点。
目录摘要 (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`命令卸载已挂载的分区。
模拟磁盘⽂件管理的程序模拟磁盘⽂件管理的程序⼀、课程设计内容⑴⾃定义磁盘⽂件管理的数据结构;⑵能够⾃由创建、修改、删除⽂件;⑶⽂件具有⼀定⾃定义的属性;⑷能够显⽰当前系统⽂件的状态。
⼆、课程设计的数据结构说明程序中定义了两个类:class file//⽂件类{private:char name[10]; //⽂件名public:int tag; //删除标记 1:已删 0:未删file( ){ }char *getname( ){return name;} //获取⽂件名int gettag( ){return tag;} //获取删除标记int getlength() {return length;} //获取⽂件⼤⼩int getblocknum() {return blocknum;} // 磁盘块数int getblocksum1(){return blocksum1;} //磁盘块号的始点int getblocksum2(){return blocksum2;} //磁盘块号的终点int length,blocknum,blocksum1,blocksum2;void setname(char na[ ] ) {strcpy(name,na);} //设置⽂件名void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建⽂件void deltefile(char *na) {tag=1; strcpy(name,na);} //删除⽂件void disp( )//输出⽂件信息class fdatabase //⽂件库类{ private:int top; //⽂件记录指针file f[50];public:fdatabase(){top=-1;} //构造函数int search(char *fname)//按⽂件名查找int creatfile(char *na,int L,int num,int s1,int s2)//创建⽂件时先查找是否存在int deltefile(char *na)//删除⽂件时先查找是否存在void disp() //输出所有⽂件信息};三、课程设计的模板说明1、初始化,建⽴⽂件系统输⼊磁盘⼤⼩(G),每个盘块⼤⼩(M),⾃动建⽴位⽰图,位⽰图字长定为32位输出位⽰图的⾏数,以及⾏号、列号与磁盘块号的转换公式(都从0开始编号)。
实验五磁盘存储空间的管理一、实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。
每个磁道又分成若干个扇区(又叫做磁盘块)。
之后用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. 磁盘缓存和磁盘阵列技术对系统性能的影响:磁盘缓存和磁盘阵列技术是提高磁盘访问性能的两种常见方法。
磁盘缓存利用高速缓存存储器来暂存磁盘数据,以减少对磁盘的实际访问次数,从而提高系统的响应速度。
而磁盘阵列则是通过将多个磁盘组合成一个逻辑单元,实现数据的并行读写,从而提高磁盘的吞吐量。
通过实验测试,我们对比了启用和禁用磁盘缓存以及使用单个磁盘和磁盘阵列的情况下的磁盘访问性能。
磁盘管理实验报告磁盘管理实验报告一、引言磁盘管理是计算机操作系统中的重要组成部分,它负责管理磁盘上的文件存储和访问。
在本次实验中,我们将通过模拟磁盘管理的过程,探索不同的磁盘调度算法对系统性能的影响。
本报告将介绍实验的背景和目的,并详细讨论实验过程和结果。
二、实验背景和目的磁盘是计算机中常用的存储设备之一,它将数据以磁场的形式存储在磁道上。
磁盘的读写速度较慢,而且在多个进程同时访问磁盘时容易出现冲突。
因此,磁盘管理的优化对于提高系统的性能至关重要。
本次实验的目的是通过模拟不同的磁盘调度算法,比较它们在不同场景下的性能差异。
我们将使用C语言编写模拟程序,通过生成随机的磁盘请求序列,并使用不同的磁盘调度算法进行处理。
通过比较不同算法的平均寻道时间、平均旋转延迟和平均传输时间等指标,评估算法的优劣。
三、实验过程实验的第一步是编写模拟程序,我们使用C语言实现了一个简单的磁盘调度模拟器。
该模拟器可以生成指定数量的磁盘请求,并使用不同的磁盘调度算法进行处理。
我们实现了以下几种磁盘调度算法:1. 先来先服务(FCFS):按照请求的到达顺序进行处理。
2. 最短寻道时间优先(SSTF):选择离当前磁道最近的请求进行处理。
3. 扫描算法(SCAN):按照一个方向进行扫描,直到最边缘,然后改变方向继4. 循环扫描算法(C-SCAN):类似于SCAN算法,但是当到达最边缘时,直接返回到最开始的磁道。
5. 电梯算法(LOOK):类似于SCAN算法,但是当到达最边缘时,改变方向继续扫描。
在模拟程序中,我们使用随机数生成器生成了1000个磁盘请求,并分别使用以上算法进行处理。
在每次处理完一个请求后,我们记录下当前的磁道位置,并计算出寻道时间、旋转延迟和传输时间。
最后,我们计算出每种算法的平均寻道时间、平均旋转延迟和平均传输时间,并进行对比分析。
四、实验结果和分析根据实验结果,我们得到了每种算法的平均寻道时间、平均旋转延迟和平均传输时间。
一、实验目的:1、掌握基本磁盘的管理方法。
二、实验环境:操作系统:Windows Server 2003;本实验应采用虚拟机软件完成,以虚拟机为例进行实验。
三、实验内容:1、基本磁盘管理查看虚拟机硬盘分配情况,填入下表:回答下面的问题:(1)打开我的电脑,可以看到该硬盘中的哪几个分区?(2)能否创建扩展磁盘分区并为它指派一个驱动器号或路径?(3)如果把逻辑分区文件系统改为 NTFS,该如何做?(4)如果磁盘中仍有未指派的空间,能否将一个分区或逻辑驱动器的容量进行扩展?2、磁盘碎片整理用户保存文件时,字节数较大的文件常常被分段存放在磁盘不同位置。
较长时间地执行文件的写人、删除等操作后,许多文件分段分布在磁盘不同的位置,就形成了所谓的磁盘“碎片”。
碎片的增加,直接影响了大文件的存取速度,也必定降低了机器的整体运行速度。
磁盘碎片整理程序的作用是,重新安排磁盘中的文件和磁盘自由空间,使文件尽可能存储在连续的单元中,并使磁盘空闲的自由空间形成连续的块。
1.按下述方式启动磁盘碎片整理程序:“开始”--“程序”--“附件”--“系统工具”--“磁盘碎片整理程序”2.查看在磁盘碎片整理程序窗口的各项内容3.分析各驱动器是否需要磁盘碎片整理在磁盘碎片整理程序窗口中依次选择一个磁盘分区,选择“分析”,查看分析报告。
4.对D盘进行磁盘碎片整理5.在磁盘碎片整理程序窗口中选择D盘,选择“碎片整理”6.整理完成后在对D盘进行分析,查看与整理前的区别。
注意:1.碎片整理时要关闭其他正在运行的程序。
2.尽量不要整理其他的系统分区,该分区请在其系统内进行整理。
3、磁盘清理该工具可以辨别硬盘上的一些无用的文件,并征得用户许可后删除这些文件,以便释放一些硬盘空间。
所谓“无用文件”,如Internet临时文件,回收站等。
1.按下述方式启动磁盘碎片整理程序:“开始”--“程序”--“附件”--“系统工具”--“磁盘碎片整理程序”2.在出现的对话窗口中选择要进行清理的磁盘,确定3.提示信息将报告清理后可能释放的磁盘空间,列出可被删除的目标文件类型和每个目标文件类型的说明,并可以进一步详细查看某种文件类型中的所有目标文件列表。
案例1:未来科技公司服务器共享空间可以为员工提供上传文件服务,如果不限制员工上传文件的空间大小,将可能导致部分员工占用过多空间,而其他员工无法使用空间的问题,试解决。
解决思路:1、新建用户a1(旧知识)2、设置文件夹共享(旧知识)3、在共享文件夹所在的磁盘上进行磁盘配额设置(新知识)操作步骤:1、新建用户(操作过程见:新建用户.swf)点击“开始”—“程序”—“管理工具”—“计算机管理”,点击“本地用户和组”,右击“用户”,选择“新用户”,在新窗口中输入用户名和密码,并勾去“用户下次登录时需更改密码”最后单击“创建”。
2、设置文件夹共享(操作过程见:共享与安全权限.swf)右击“我的电脑”,选择“资源管理器”,打开“资源管理器”后,点击C盘(因需要共享的文件夹file在C盘),在窗口右侧右击“file”,选择“共享与安全”,在新窗口中点击“共享此文件夹”前单选按钮,然后点击“权限”,在新窗口中,将共享权限“更改”后的复选框勾选,便于复制文件。
点击“确定”后,然后点击“安全”选项卡,登录用户a1不在用户列表中,此时需要将登录用户a1添加到用户列表中点击“添加”,在新窗口中,点击“高级”然后再点击“立即查找”,在查找结果列表中选中用户a1,然后点击“确定”,再点击“确定”,在权限列表框中将a1用户权限设置为可写入,勾选“写入”后复选框,最后单击“确定”按钮。
3、在共享文件夹所在的磁盘上进行磁盘配额设置(操作过程见:限制磁盘配额(通用).swf)右击“我的电脑”,选择“资源管理器”,打开“资源管理器”后,右击C盘(因共享文件夹在C盘),选择“属性”,在新窗口中点击“配额”选项,勾选“启用配额管理”和“拒绝将磁盘空间给超过配额限制的用户”前复选框,然后点击“将磁盘空间限制为”前单选按钮,输入限制空间为5MB(为方便验证,故只限制为5MB),方法为输入5,选择单位为MB,最后单击“确定”按钮。
4、访问验证(操作过程见:访问验证.swf)(1)在客户机上,右击“网上邻居”,选择“搜索计算机”,在新窗口中,输入要搜索的计算机的计算机名,此处应输入服务器的名称,如tlpt-glc,搜索成功后,计算机名会出现在窗口右侧,双击计算机名tlpt-glc,会弹出登录窗口,此时输入在步骤1中新建的用户名和密码进行登录,如果没有出现登录窗口,则执行步骤(2)(2)没有出现登录窗口,原因是访问机器与服务器(设置共享机器)的登录用户和密码相同,则需要更改访问机器用户密码(操作过程见:修改用户密码.swf)点击“开始”—“程序”—“管理工具”—“计算机管理”,点击“本地用户和组”,点击“用户”,在窗口右侧右击“Administrator”(Administrator为默认登录用户名),选择“设置密码”,在新窗口中输入新密码,单击“确定”按钮。
1.成组链接法#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) /*若该组不止一个空闲块*/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(); /*显示*/}void menu() /*功能选择函数*/{ int choice;char judge;printf("\ninput your choice:(1--assign,2--callback):"); scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();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");}}main(){ int i;for(i=0;i<=3;i++)MA[i]=A[0][i];display();menu();}2.位示图法#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,k,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(){out();menu();}。