模拟实现用位示图法管理文件存储空间的分配与回收
- 格式:doc
- 大小:197.00 KB
- 文档页数:15
基于位示图的分配与回收交通
计算机
翟高寿
位示图
利用位示图(即二维数组Map[m][n ])的一位(0/1)来表示一个内存物理块(或磁盘盘块)的使用情况,使内存所有物理块(或磁盘上所有盘块)都与一个二进制位相对应
1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 ……
1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 … m-1 n-1 ……
物理块(盘块)的分配
Var Map: array [m] of integer;⇔ array [m][n] of bit ❑根据需求计算确定所需物理块数zKs
❑顺序扫描位示图,找出zKs个其值均为空闲“0”的二进制位
❑将所找到的“0”值二进制位Map[i][j]的行/列号转换为与之对应的物理块(盘块)号b:
b = n i + j
❑按物理块(或盘块)号分配物理块(或盘块),同时修改位示图和进程页表
物理块(盘块)的回收
I.将回收物理块(或盘块)的物理块(或盘块)号b
转换为位示图中的行号i和列号j:
A.i = b DIV n;
B.j = b MOD n;
II.按物理块(或盘块)号回收物理块(或盘块)III.根据回收物理块(或盘块)对应二进制位的行/列号修改位示图和进程页表
知行合一,
开拓进取!
基于位示图的分配与回收■。
课程设计报告( 2009--2010年度第二学期)课程名称:操作系统实验课设题目: 用位示图管理磁盘空间的分配与回收院系:控制与计算机工程学院班级:姓名:指导教师:李为设计周数: 一周成绩:2010年7月9 日一、需求分析要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。
(1)假定现有一个磁盘组,共40个柱面。
每个柱面4个磁道,每个磁道又划分成4个物理记录。
磁盘的空间使用情况用位示图表示。
位示图用若干个字构成,每一位对应一个磁盘块。
1表示占用,0表示空闲。
为了简单,假定字长为16位,其位示图如图9—1所示。
系统设一个变量S,记录磁盘的空闲块个数。
(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出柱面号、磁道号(也即磁头号)和扇区号)。
由位示图计算磁盘的相对块号的公式如下:相对块号一字号×16+位号之后再将相对块号转换成磁盘的物理地址:由于一个柱面包含的扇区数=每柱面的磁道数×每磁道的扇区数=4×4=16,故柱面号=相对块号/16的商,即柱面号=字号磁道号=(相对块号/16的余数)/4的商,即(位号/4)的商物理块号=(相对块号/16的余数)/4的余数,即(位号/4)的余数(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应位置0。
计算公式如下:先由磁盘地址计算相对块号:相对块号=柱面号×16+磁道号×4+物理块号再计算字号和位号:字号=相对块号/16的商,也即字号=柱面号位号=磁道号×物理块数/每磁道+物理块号(4)按照用户要求,申请分配一系列磁盘块,运行分配程序,完成分配。
然后将分配的相对块号返回用户,并将相对块号转换成磁盘绝对地址,再显示系统各表和用户已分配的情况。
(5)设计一个回收算法,将上述已分配给用户的各盘块释放。
并显示系统各表。
学号:28课程设计模拟设计页式存储管理的分题目配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011年01月09日课程设计任务书学生姓名: XX 专业班级:计算机0902班指导教师: XXX 工作单位:计算机科学与技术学院题目: 模拟设计页式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用页式管理方案实施内存分配和回收。
能够处理以下的情形⑴能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
⑵要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。
2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日武汉理工大学《操作系统》课程设计说明书模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。
位数4位数4 操作系统综合实验——位示图法管理文件存储空间的分配与回收实验组成员组长:葛加文成员:周颜安翟秋明崔建奎一、实验目的磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和回收算法。
二、实验内容位示图法管理文件存储空间的分配与回收(1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。
为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。
位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
(2) 申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。
为了程序编写方便,假设现在有一个盘组共8个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录。
那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:柱面号=字节号磁道号=[ ]物理记录号={ }(3) 归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。
按照(2)中假设的盘组,归还块在位示图中的位置计算如下:字节号=柱面号位数=磁道号 4+物理记录号(4) 设计申请一块磁盘空间和归还一块磁盘空间的程序。
课程设计模拟设计页式存储管理的分题目配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011 年01月09 日课程设计任务书学生姓名:XX _________ 专业班级:计算机0902班____________ 指导教师:XXX ________ 工作单位:计算机科学与技术学院题目:模拟设计页式存储管理的分配与回收初始条件:1•预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。
2•实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1•采用页式管理方案实施内存分配和回收。
能够处理以下的情形⑴ 能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
⑵ 要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。
2•设计报告内容应说明:⑴课程设计目的与功能;⑵ 需求分析,数据结构或模块说明(功能与框图);⑶ 源程序的主要部分;⑷ 测试用例,运行结果与运行情况分析;⑸ 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。
课程设计任务书学生姓名:专业班级:计算机0指导教师:郭羽成工作单位:计算机科学与技术学院题目: 模拟设计段式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解有关虚拟存储器、段式存储管理等概念,并掌握段式管理内存的分配和回收过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用段式管理方案实施内存分配和回收。
能够处理以下的情形⑴能够输入给定的内存大小,进程的个数,每个进程的段数及段大小;⑵当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后有关内存空间使用的情况;⑶显示回收后内存空间的使用情况(注意回收后的合并)。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日模拟设计段式存储管理的分配与回收1 需求分析段式存储管理是基于为用户提供一个方便灵活的程序设计环境而提出来的。
段式管理的基本思想是:把程序按内容或过程(函数)关系分成段,每段有自己的名字。
一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。
段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。
和页式管理时一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些在将来一段时间内不被访问的段放入外存,待需要时自动调入的方法现实二维虚拟存储器。
袇课程设计报告螈(2016--2017年度第二学期):操作系统实验薆课程名称:用位示图管理磁盘空间的分配与回收袃课设题目:控制与计算机工程学院羇院系:信安1401羅班级:黄竞昶羃姓名:贾静平薂指导教师:一周肇设计周数:莆成绩年 7月 9日螅2015莀一、需求分析蒁要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。
螆( 1)假定现有一个磁盘组,共 40 个柱面。
每个柱面 4 个磁道,每个磁道又划分成 4 个物理记录。
磁盘的空间使用情况用位示图表示。
位示图用若干个字构成,每一位对应一个磁盘块。
1 表示占用, 0 表示空闲。
为了简单,假定字长为 16 位,其位示图如图 9— 1 所示。
系统设一个变量 S,记录磁盘的空闲块个数。
莃蒁 1 膇 2 袅 3 膂 4 薁 5 薈 6 莃 7 羁 8 蚀 9 蚅肅蚀螀肆薃膃位10 11 12 13 14 15袀螃字 0 蒇 1 芅 1 薂 1 羀 1 袈 1 蚂 0 芁 1 肀 0 羄 0 莄 1 聿 1 肀 1 莅 1 袂 1 肂 01膀 1袆 2....袁 39芀图 9—1 位示图( 2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0 的位,并计算磁盘的芇物理地址 ( 即求出柱面号、磁道号 ( 也即磁头号 ) 和扇区号 ) 。
肂由位示图计算磁盘的相对块号的公式如下:蚀相对块号一字号× 16+位号荿之后再将相对块号转换成磁盘的物理地址:蚈由于一个柱面包含的扇区数=每柱面的磁道数×每磁道的扇区数=4× 4= 16,故柱面号=相对块号/ 16 的商,即柱面号=字号螄磁道号= ( 相对块号/ 16 的余数 ) /4 的商,即 ( 位号/ 4) 的商蚃物理块号= ( 相对块号/ 16 的余数 ) / 4 的余数,即 ( 位号/ 4) 的余数葿( 3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应位置 0。
位示图方法模拟磁盘块的分配与回收题目的描述:1.要求在LINUX环境用C语言编程2.假设有一个500行500列的矩阵来表示磁盘块,状态位是1表示已经分配出去,状态位是0表示空闲块3.给这个矩阵用随机函数初始化,让其布满0和14.写程序统计有多少个空闲块?5.有一个程序文件要申请20个磁盘块,能否分配?如果可以分配,给出分配块的块号地址,块号=字号×500+位号,并修改位示图,块号从0开始编址。
6.要回收第300块和第580块,如何实现?给出位示图修改的程序在linux系统中,我想很多的朋友使用的是虚拟机,这样的话,当我们将行和列都设置为500x500的话,操作就不是很方便了,所以呢,小Q就将其修改为10X10的来演示就好了,其中的算法和思想是完全相同的。
另外一点,必须声明,在linux中使用vi编辑器进行C语言的编程,其中是不允许含有中文的,即使是中文的注释也不行。
为了,朋友们好理解,我再这里写注释的时候使用的是中文的注释,但是你在使用的时候一定要记住不能将其放入到linux环境下的vi编辑器中。
好了,我想建立文件什么的我就不用讲了,下面看下,如何解决上述的问题吧,就算是抛砖引玉吧。
/*使用变量:row表示行,col表示列*/#include <stdio.h>#include <sys/time.h>#include <fcntl.h>#define row 10#define col 10void init_random (){unsigned int ticks;struct timeval tv;int fd;gettimeofday (&tv, NULL);ticks = _sec + _usec;fd = open ("/dev/urandom", O_RDONLY);if (fd > 0){unsigned int r;int i;for (i = 0; i < 512; i++){read (fd, &r, sizeof (r));ticks += r;}close (fd);}srand (ticks);//printf("init finished ");}unsigned int new_rand (){int fd;unsigned int n = 0;fd = open ("/dev/urandom", O_RDONLY);if (fd > 0){read (fd, &n, sizeof (n));}close (fd);return n;}int statistics_free(unsigned int wst[][]){int sum_free=0;//记录空闲块个数,并初始化int i_row=0;int i_col=0;for(;i_row<row;i_row++)for(i_col=0;i_col<col;i_col++){if(wst[i_row][i_col]==0)sum_free++;}return sum_free;}void ask_space(unsigned int wst[][],int ask) {int i_row=0;int i_col=0;int t_row=0;int t_col=0;if(ask>statistics_free(wst)){printf("The space don't enough");return;}printf("The space address like this:\n");for(;i_row<row;i_row++)for(i_col=0;i_col<col;i_col++){int address=0;if(ask>0&&wst[i_row][i_col]==0){wst[i_row][i_col]=1;ask--;//计算当前的分配块号的地址address=i_row*row+i_col;printf("%d ",address);}else if(ask==0){printf("\nThe ask had request,the array is changed:\n");for(t_row=0;t_row<row;t_row++){for(t_col=0;t_col<col;t_col++)printf("%d ",wst[t_row][t_col]);printf("\n");}return;}}}void recover_space(unsigned int wst[row][col],int recover_number){int r_row=0;int r_col=0;r_row=recover_number/col;r_col=recover_number%col;if(r_row>row-1){printf("Your ask to free space don't find.");return;}wst[t_row][t_col]=0;printf("\nThe ask had request,the array is changed:\n");for(r_row=0;r_row<row;r_row++){for(r_col=0;r_col<col;r_col++)printf("%d ",wst[r_row][r_col]);printf("\n");}printf("\n");}int main (){//int n, i;//init_random ();//调用内部的接口进行设置随机种子。
实习四 主存储器空间的分配和回收一,实习题目本实习模拟在两种存储管理方式下的主存分配和回收。
第一题:在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。
[提示]:可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,假设有,则按需要量分割一个分区分配给该作业;假设无,则作业不能装入。
随着作业的装入、撤离,主存空间被分成许多个分区,有为了 说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:第一栏 第二栏其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白〔无效〕,可用来登记新的空闲区〔例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态〕。
由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。
上述的这张说明表的登记情况是按提示〔1〕中的例所装入的三个作业占用的主存区域后填写的。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。
(3) 采用最先适应算法〔顺序分配算法〕分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。
合肥学院计算机科学与技术系课程设计报告20011~2012 学年第1 学期课程名称操作系统原理课程设计名称模拟实现用位示图法管理文件存储空间的分配与回收专业班级学生姓名学生学号指导教师20011 年11 月实验题目模拟用位示图法管理文件存储空间的分配与回收一、实验目的:1)理解文件存储空间的分配与回收的基本概念,掌握产生文件存储空间的分配与回收的几种方法,体会位示图算法是管理文件存储空间的分配与回收的一种行之有效的方法。
2)通过编写程序实现位示图算法,进一步理解位示图算法的原理和执行过程,掌握位示图算法的描述和应用,进一步熟练掌握文件存储空间的分配与回收的方法。
二、实验内容:(1)首先对位示图算法原理进行深刻的理解和掌握;(2)程序首先要给出位示图初态。
分配时,参数为文件名及需要分配的块数。
回收时,参数为文件名。
(3)回答信息:分配时,能够分配时,给出文件名和分配的具体块号。
否则,给出无法分配的信息。
显示位示图。
(4)回收时:给出回收的具体块号。
显示位示图。
三、实验环境Windows系统,在C++的环境下来运行这儿程序四、实验主要步骤1、初始化及使用数据结构对数组WST[]元素初始化为0。
定义以下3个链表并初始化。
空闲区结构体定义free_link、申请空间作业结构体定义office、相关位示图操作的结构体定义work。
位示图算法是利用二进制的一位来表示磁盘中的一个盘块的使用情况。
在外存上建立一张位示图(bitmap),记录文件存储器的使用情况。
每一位仅对应文件存储器上的一个物理块,取值0和1分别表示空闲和占用。
文件存储器上的物理块依次编号为:0、1、2、…。
定义为一维数组WST[],操作起来更为方便。
下表号与盘块号对应。
在输出的时候控制输出为二维形式。
2、申请空间算法首先要输入文件名和大小,查找与已存在的文件是否重名。
没有,则比较空闲区中空闲块数是否大于欲分配的块数。
有的话分配。
分配的时候该作业要记录下自己所占盘块的其实盘号和所占用的盘快数。
并修改对应盘块的位示图的值。
m=r->start_location;//空闲区的起始地址s->begin_location=r->start_location;//作业从空闲区的起始地址开始分配r->start_location=r->start_location+s->office_number;//改变空闲区空闲块数的起始地址r->free_number=r->free_number-s->office_number;//改变空间区块数的大小n=(r->start_location-1);//新的空间区的起始地址-1for(i=m;i<=n;i++)//模拟分配WST[i]=1;3、回收空间算法首先输入文件名,查找申请空间作业链表找到该作业。
找到该作业时回收该盘块。
回收时要判断盘块前后的是否为空。
决定回收的盘块来加入哪个空闲区。
(1)if((WST[s->begin_location-1]==0&&WST[s->begin_location+s->office_number]==1&&s->b egin_location-1>=0)||(WST[s->begin_location-1]==0&&s->begin_location+s->office_number== 256&&s->begin_location-1>=0)){//前面为空盘块区,后面为已分配,并入前面(2)if((WST[s->begin_location-1]==1&&WST[s->begin_location+s->office_number]==0&&s->b egin_location+s->office_number<256)||(s->begin_location==0&&WST[s->begin_location+s->off ice_number]==0&&s->begin_location+s->office_number<256)){//后面为空盘,并入后面区域(3)if(WST[s->begin_location-1]==0&&WST[s->begin_location+s->office_number]==0&&s->be gin_location-1>=0&&s->begin_location+s->office_number<256){//前后都空,合为一个空盘区(4)if((WST[s->begin_location-1]==1&&WST[s->begin_location+s->office_number]==1&&s->b egin_location-1>=0&&s->begin_location+s->office_number<256)||(s->begin_location==0&&WS T[s->begin_location+s->office_number]==1&&s->begin_location+s->office_number<256)||(WS T[s->begin_location-1]==1&&s->begin_location+s->office_number==256&&s->begin_location-1>=0)||(s->begin_location==0&&s->begin_location+s->office_number==256)){//要回收的区域自成一个空盘结点4.否否五、记录实验结果并分析1、在dos窗口界面下,我们看到的如下所示,这是程序初始化时出现的界面:2现在我们对其进行操作:选择1—分配文件,出现如下界面:我们不妨设文件名位“caozuoxitong”,并令块数为10,执行,得到如下的界面:看到从第一行的第一列一直到第一行的第九列共10个盘块均已经被分配,并且令“0”该为“1”,表示盘块已分配。
盘块的分配已经完成,下面是盘块的回收:选择2—回收文件,出现如下界面:输入我们刚刚输入的文件名“caozuoxitong”,并回车,界面如下我们看到从第一行的第一列一直到第一行的第九列已经全部变为“0”了,表示此时盘块已经回收。
按“3”退出。
对于程序中的其他的一些事项,比如盘块不够大;输入错误;找不到文件等情况,程序也给予相应的提示,用户在使用时,根据提示会很快改正相关的错误的。
六、实验总结及体会。
在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间。
如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半。
做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。
做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛。
实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。
在这里我深深体会到哲学上理论对实践的指导作用:弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。
我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。
七、源程序清单及注释。
#include"stdio.h"#include"malloc.h"#include"windows.h"#include"string.h"#include"iostream.h"int WST[256];/*************************************空闲区结构体定义start_location 空闲区对象变量的开始位置free_number 空闲区块数目next 指向下一个空闲区的指针**************************************/typedef struct node{int start_location;int free_number;struct node*next;}free_link;/*************************************申请空间作业结构体定义office[] 作业名begin_location 作业申请空间后的开始位置office_number 作业申请空间区的数目next 指向下一个申请空闲区的作业指针**************************************/typedef struct link{char office[20];int begin_location;int office_number;struct link *next;}office;/**************************************相关位示图操作的结构体定义p 空间区链表指针q 作业链表指针***************************************/typedef struct {free_link *p;office *q;}work;/*************************************** 程序菜单****************************************/void menu(){printf(" 文件的存取和回收\n");printf(" 1--分配文件\n");printf(" 2--回收文件\n");printf(" 3--退出\n\t");printf(" 请输入选项: ");}/*************************************** 置空位示图进行初始化****************************************/ void zero_wst(){int i;for(i=0;i<256;i++)WST[i]=0;}/**************************************** 位示图输出显示将初始化或者申请或者回收后的位示图进行显示*****************************************/ void print_wst(int WST[256]){int i,j=0;printf("%3s"," ");for(i=0;i<16;i++)printf("%3d",i);printf("\n");printf("%3d",0);for(i=0;i<256;i++){j++;printf("%3d",WST[i]);if(j%16==0&&i!=0&&j!=256){printf("\n");printf("%3d",j/16);}}printf("\n");}/**************************************已经申请空间的作业相关情况输出显示包括:作业名申请空间的开始位置和截至位置***************************************/void print_office(work *w){office *q;q=w->q;q=q->next;if(q!=NULL){printf("已有文件:\n");while(q!=NULL){printf("\t%s:%d-%d\n",q->office,q->begin_location,q->begin_location+q->office_number-1) ;q=q->next;}}}/*************************************位示图操作的初始化包括:空闲区链表的初始化作业链表的初始化**************************************/work *start(){free_link *p;office *q;work *w;w=(work *)malloc(sizeof(work));p=(free_link*)malloc(sizeof(free_link));p->start_location=0;p->free_number=256;p->next=NULL;q=(office *)malloc(sizeof(office));q->next=NULL;w->p=p;w->q=q;return w;}/**************************************申请空间操作***************************************/work *request(work *w,int WST[256]){int i,m,n,flag=0;free_link *p,*r,*e;//r->free_number 用于查找空闲区的块数office *q,*s,*t,*u;//s 创建新节点,存储新建文件的信息,n用于查找是否有重复节点p=w->p;r=p;q=w->q;t=q;u=q->next;printf("请输入文件名和块数:");s=(office*)malloc(sizeof(office));s->next=NULL;while(t->next!=NULL)t=t->next;scanf("%s%d",&(s->office),&(s->office_number));while(u!=NULL){if(strcmp(s->office,u->office)==0){flag=1;printf("对不起,该文件已存在!\n");free(s);break;}u=u->next;}if(flag==0){while(r!=NULL){if((r->free_number)>=(s->office_number))//用于查找空闲区中空闲块数是否大于欲分配的块数break;r=r->next;}if(r==NULL){printf("对不起,没有足够的空间分配失败!\n");free(s);}else{t->next=s;m=r->start_location;//空闲区的起始地址s->begin_location=r->start_location;//作业从空闲区的起始地址开始分配r->start_location=r->start_location+s->office_number;//改变空闲区空闲块数的起始地址r->free_number=r->free_number-s->office_number;//改变空间区块数的大小n=(r->start_location-1);//新的空间区的起始地址-1for(i=m;i<=n;i++)//模拟分配WST[i]=1;if(r->free_number==0){if(p==r){//p==r说明内存中只有一个整块的空闲区free(r);p=NULL;}else{e=p;while(e!=NULL){if(e->next==r)break;e=e->next;}e->next=r->next;free(r);}}}}w->p=p;w->q=q;return w;}/*********************************************回收空间操作**********************************************/work *delect(work *w,int WET[]){char name[20];int i;free_link *p,*r,*t;office *q,*s,*e;p=w->p;r=p;t=p;q=w->q;s=q;e=q;s=s->next;if(s==NULL){printf("没有可以回收的文件!\n");}else {printf("请输入文件名:");cin>>name;while(s!=NULL){if(strcmp(s->office,name)==0)break;s=s->next;}if(s==NULL){cout<<"对不起没有找到相关文件!\n";}else{if((WST[s->begin_location-1]==0&&WST[s->begin_location+s->office_number]==1&&s-> begin_location-1>=0)||(WST[s->begin_location-1]==0&&s->begin_location+s->office_number==256&&s->begin _location-1>=0)){while(r!=NULL){if((r->start_location+r->free_number)==s->begin_location)break;r=r->next;}r->free_number=r->free_number+s->office_number;}if((WST[s->begin_location-1]==1&&WST[s->begin_location+s->office_number]==0&& s->begin_location+s->office_number<256)||(s->begin_location==0&&WST[s->begin_location+s->office_number]==0&&s->begin_location+s->office_number<256)){while(r!=NULL){if((s->begin_location+s->office_number)==r->start_location)break;r=r->next;}r->start_location=r->start_location-s->office_number;r->free_number=r->free_number+s->office_number;}if(WST[s->begin_location-1]==0&&WST[s->begin_location+s->office_number]==0&& s->begin_location-1>=0&&s->begin_location+s->office_number<256){while(r!=NULL){if((s->begin_location+s->office_number)==r->start_location){t=r;break;}r=r->next;}r->free_number=r->free_number+s->office_number+t->free_number;free(t);}if((WST[s->begin_location-1]==1&&WST[s->begin_location+s->office_number]==1&&s-> begin_location-1>=0&&s->begin_location+s->office_number<256)||(s->begin_location==0&&WST[s->begin_location+s->office_number]==1&&s->begin_location+s->office_number<256)||(WST[s->begin_location-1]==1&&s->begin_location+s->office_number==256&&s->begin _location-1>=0)||(s->begin_location==0&&s->begin_location+s->office_number==256)){t=(free_link*)malloc(sizeof(free_link));t->next=NULL;t->start_location=s->begin_location;t->free_number=s->office_number;if(r==NULL)p=t;if(r!=NULL&&r->next==NULL){if(r->start_location<s->begin_location)r->next=t;else{t->next=r;p=t;}}if(r!=NULL&&r->next!=NULL){while(r!=NULL&&r->next!=NULL){if((r->start_location<s->begin_location)&&(s->begin_location<r->next->start_location))break;r=r->next;}t->next=r->next;r->next=t;}}for(i=s->begin_location;i<(s->begin_location+s->office_number);i++)WST[i]=0;while(e!=NULL){if(e->next==s)break;e=e->next;}e->next=s->next;free(s);}}w->p=p;w->q=q;return w;}/****************************************主函数****************************************/void main(){int flag;work *w;zero_wst();w=start();while(1){system("cls");print_wst(WST);print_office(w);menu();cin>>flag;switch(flag){case 1:w=request(w,WST);break;case 2:w=delect(w,WST);break;case 3:exit(0);default:printf("输入错误,请重新输入!\n");break;}}}。