当前位置:文档之家› 操作系统大型实验报告

操作系统大型实验报告

操作系统大型实验报告姓名林丹学号200626410112 班级软件工程2+3(061)得分一、实验目的:了解动态分区分配方式中使用的数据结构,熟悉最优分配算法,并进一步加深对动态扮区存储管理方式包括理解分配内存资源及回收资源及其实现过程的理解。

二、实验环境:Win2000/WinXP VC++6.0三、实验内容:(1)用C++语言分别实现采用最佳适应算法的动态分区分配过程excellent() 和回收过程mfree()。

(2)假设初试状态下,可用的内存空间为1024KB,并初始化空闲区和已分配区(3)每次分配和回收后显示空闲内存分区链情况(共有多个空闲分区,每个空闲分区的大小分别为多大,以及空闲标记)。

(4) 回收内存时若存在连续的空闲结点则合并,处理释放内存产生的碎片。

四.实验代码及分析解释程序主要以数组形式实现,相关函数如下:1.void initial()初始化空间段(空闲区和已分配区),大小可自定。

2.void excellent()采用最优算法分配内存,。

3.void print()输出已经分配和空闲资源情况。

4.void mfree()回收内存,若存在连续的空闲结点则合并5.void main()Main主函数,实现整个过程;包括选择对作业的操作类型,选0退出程序,选1进行内存分配,选2撤消某作业并回收资源选3输出已经分配和空闲资源情况。

源程序:#include<stdio.h>#include<stdlib.h>#include<conio.h> //getch()#include<iostream.h>#include<string.h>#include<iomanip.h>const int MAXJOB=20; //定义最大作业数typedef struct node{ //结构体int start;int length;char tag[20];}job;job frees[MAXJOB];//定义空闲区表int free_quantity;job occupys[MAXJOB];//定义已分配区表int occupy_quantity;//初始化函数void initial(){int i;for(i=0;i<MAXJOB;i++){frees[i].start=0;frees[i].length=1024;strcpy(frees[i].tag,"free"); //标识空闲区"free"occupys[i].start=0;occupys[i].length=0;strcpy(occupys[i].tag,""); //标识已分配区}free_quantity++;//occupy_quantity=0;}//显示void print(){int i;cout<<endl<<"----------------------------------------------------------"<<endl;cout<<"当前空闲表:"<<endl;cout<<"起始地址长度状态"<<endl;for(i=0;i<free_quantity;i++){cout.setf(2);cout.width(12);cout<<frees[i].start;cout.width(10);cout<<frees[i].length;cout.width(8);cout<<frees[i].tag<<endl;}cout<<endl<<"----------------------------------------------------------"<<endl;cout<<"当前已分配表:"<<endl;cout<<"起始地址长度作业名"<<endl;for(i=0;i<occupy_quantity;i++){cout.setf(2);cout.width(12);cout<<occupys[i].start;cout.width(10);cout<<occupys[i].length;cout.width(8);cout<<occupys[i].tag<<endl;}}void excellent() //分配内存,给定作业采用最佳分配算法分配xk大小的空间(OPT) {char job_name[20];int job_length;int i,flag;cout<<"请输入新申请内存空间的作业名和空间大小:";cin>>job_name>>job_length;flag=0; //标记申请空间是否成功,"0"成功,"1"失败for(i=0;i<free_quantity;i++){if(frees[i].length>=job_length){ //如果要申请的内存空间小于当前空闲区大小,则标记flag=1表示申请空间成功flag=1;}}if(flag==0)//标记是否满足申请要求{cout<<endl<<"对不起,当前没有能满足你申请长度的空闲内存,请稍候再试"<<endl; }else{i--;for(int j=0;j<free_quantity;j++){if((frees[j].length>=job_length)&&(frees[j].length<frees[i].length))//寻找最合适空闲区,即找到满足申请条件的最小快{i=j; //j为局部变量;}}occupys[occupy_quantity].start=frees[i].start; //分配内存,起始地址strcpy(occupys[occupy_quantity].tag,job_name); //复制作业号occupys[occupy_quantity].length=job_length; //占有的内存大小(长度) occupy_quantity++;if(frees[i].length>job_length)//空闲区大于要分配的空间大小{frees[i].start+=job_length; //修改空闲区的起始地址、长度frees[i].length-=job_length;}else //相等{for(j=i;j<free_quantity-1;j++){frees[j]=frees[j+1];}free_quantity--;}cout<<"恭喜你!内存空间成功:)"<<endl<<endl;}}//撤消作业void mfree(){char job_name[20];int i,j,flag,p=0;int start;int length;cout<<"请输入要撤消的作业名:";cin>>job_name;flag=-1; //标识是否存在要撤消的作业名,"-1"表示没有for(i=0;i<occupy_quantity;i++){if(!strcmp(occupys[i].tag,job_name))//找到要撤消的作业(匹配){flag=i; //找到匹配作业的下标start=occupys[i].start;length=occupys[i].length;}}if(flag==-1){cout<<"没有这个作业名"<<endl;}else{ //找到作业名;//加入空闲表for(i=0;i<free_quantity;i++){if((frees[i].start+frees[i].length)==start) // 寻找回收分区,上邻空闲区,下邻空闲区,三项合并(0 1 0){if(((i+1)<free_quantity)&&(frees[i+1].start==start+length)){frees[i].length=frees[i].length+frees[i+1].length+length;for(j=i+1;j<free_quantity;j++){frees[j]=frees[j+1];}free_quantity--;p=1;}else //上邻空闲区,下邻非空闲区,与上邻合并(0 1 1){frees[i].length+=length;p=1;}}if(frees[i].start==(start+length)){ // 上邻非空闲区,下邻为空闲区,与下邻合并(1 1 0) or 10 1frees[i].start=start;frees[i].length+=length;p=1;}if(p==0){frees[free_quantity].start=start;frees[free_quantity].length=length;free_quantity++;}//删除分配表中的该作业for(i=flag;i<occupy_quantity;i++){occupys[i]=occupys[i+1];}occupy_quantity--;}}void main(){int flag=0;int t=1;int chioce=0;initial();while(1){cout<<"========================================================="<<endl; cout<<"= 存储管理模拟系统="<<endl;cout<<"========================================================="<<endl; cout<<"= 1.申请空间(最优适配法) ="<<endl;cout<<"= 2.撤消作业="<<endl;cout<<"= 3.显示空闲表和分配表="<<endl;cout<<"= 0.退出="<<endl;cout<<"========================================================="<<endl; cout<<"====请你选择操作(0~3):";cin>>chioce;switch(chioce){excellent(); //采用最优算法分配内存break;case 2:mfree(); //释放作业占有的内存break;case 3:print(); //显示内存分配情况break;case 0:exit(0);default:cout<<"你选择的操作有误,请重输!"<<endl;}}}五.实验问题思考:(1)采用最佳适应算法,对内存的分配和回收速度有什么不同的影响?采用最佳适应算法,找到要分配的内存适合的最小的空闲区进行分配,在分配过程中,不需要寻找其他适合的空间给予分配,提高了分配及回收的速度。

相关主题