实验报告
姓名:_________ 班级:____________ 学号:______________
同组实验者:______________________________________________
操作系统实验三
【实验题目】:动态分区分配算法
【实验目的】
通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。
【实验内容及要求】
问题描述:
设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,Pn,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。
程序要求:
1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。
2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。
3)输入:空闲分区个数n,空闲分区大小P1, … ,Pn,进程个数m,进程需要的分区大小S1, … ,Sm。
4)输出:首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法,最终内存空闲分区的分配情况。
实现源代码:
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
#define max 100
using namespace std;
int work_num;
int zone_num;
struct Data{
int data;
char name;
};
Data *d=new Data[max];
struct Table{
int data;
char array[max];
int length;
};
Table *T=new Table[max];
Table *temp=new Table[max];
void Init()
{
ifstream inf("DTFQ.txt");
int i,j;
char ch;
inf>>work_num;
cout<<"作业数:"<<work_num<<endl;
inf>>zone_num;
cout<<"空闲分区数:"<<zone_num<<endl;
cout<<" 作业为 :";
for(j=0;j<work_num;j++)
{
inf.get(ch);
d[j].name=ch;
cout<<setw(4)<<d[j].name;
}
cout<<endl;
cout<<"作业大小:";
for(i=0;i<work_num;i++)
{
inf>>d[i].data;
cout<<setw(4)<<d[i].data;
}
cout<<endl;
cout<<"空闲分区:";
for(j=0;j<zone_num;j++)
{
inf>>T[j].data;
temp[j].data=T[j].data;
T[j].length=0;
temp[j].length=0;
cout<<setw(4)<<T[j].data;
}
cout<<endl;
}
void renew()
{
int j;
for(j=0;j<zone_num;j++)
{
T[j].data=temp[j].data;
T[j].length=temp[j].length;
}
}
void re()
{
int i;
for(i=0;i<zone_num;i++)
{
T[i].array[T[i].length]='#';
}
}
void show()
{
int i,j;
re();
for(i=0;i<zone_num;i++)
{
if(T[i].data==temp[i].data)
cout<<setw(4)<<T[i].data;
else
{
cout<<setiosflags(ios::right)<<setw(4)<<T[i].data<<setw(1);
for(j=0;j<T[i].length;j++)
{
if(T[i].array[j]=='#')
break;
else
cout<<setiosflags(ios::right)<<T[i].array[j];
}
}
}
cout<<endl;
}
void first_fit()
{
renew();
cout<<"fist fit:";
int i,j;
int tag=0;
for(i=0;i<work_num;i++)
{
for(j=0;j<zone_num;j++)
{
if(d[i].data<=T[j].data)
{
T[j].data=T[j].data - d[i].data;
T[j].array[T[j].length]=d[i].name;
T[j].length++;
tag=0;
break;
}
else
tag=1;
}
if(tag==1)
{
cout<<"作业太大,无满足条件分区!"<<endl;
break;
}
}
//re();
}
void next_fit()
{
renew();
cout<<"next fit:";
int i,j;
int m=0,tag=0,count=0;
for(i=0;i<work_num;i++)
{
for(j=m;j<zone_num;j++)
{
if(d[i].data<=T[j].data)
{
T[j].data=T[j].data - d[i].data;
T[j].array[T[j].length]=d[i].name;
T[j].length++;
tag=0;
m=j;
break;
}
else
{
tag=1;
count++;
}
}
while(tag==1 && count<zone_num)
{
for(j=0;j<m;j++)
{
if(d[i].data<=T[j].data)
{
T[j].data=T[j].data - d[i].data;
T[j].array[T[j].length]=d[i].name;
T[j].length++;
tag=0;
break;
}
else
{
tag=1;
count++;
}
}
}
if(tag==1 && count==zone_num)
{
cout<<"作业太大,无满足条件分区!"<<endl;
break;
}
}
//re();
}
void best_fit()
{
renew();
cout<<"best fit:";
int i,j,k,temp,m;
int tag=0,n=0;
for(i=0;i<work_num;i++)
{
for(j=0;j<zone_num;j++)
{
if(d[i].data<=T[j].data)
{
temp=T[j].data;
m=j;
int tag1=0;
for(k=m+1;k<=zone_num;k++)
{
if(T[k].data<temp)
{
if(T[k].data>=d[i].data)
{
temp=T[k].data;
n=k;
tag1=1;
}
}
else if(tag1==0)
n=j;
}
T[n].data=temp - d[i].data;
T[n].array[T[n].length]=d[i].name;
T[n].length++;
tag=0;
break;
}
else
tag=1;
}
if(tag==1)
{
cout<<"作业太大,无满足条件分区!"<<endl;
break;
}
}
//re();
}
void worst_fit()
{
renew();
cout<<"worst fit:";
int i,j,k,temp,m;
int tag=0,n=0;
for(i=0;i<work_num;i++)
{
for(j=0;j<zone_num;j++)
{
if(d[i].data<=T[j].data)
{
int tag1=0;
temp=T[j].data;
m=j;
for(k=m+1;k<=zone_num;k++)
{
if(T[k].data>temp)
{
if(T[k].data>=d[i].data)
{
temp=T[k].data;
n=k;
tag1=1;
}
}
else if(tag1==0)
n=j;
}
T[n].data=temp - d[i].data;
T[n].array[T[n].length]=d[i].name;
T[n].length++;
tag=0;
break;
}
else
tag=1;
}
if(tag==1)
{
cout<<"作业太大,无满足条件分区!"<<endl;
break;
}
}
//re();
}
void main()
{
Init();
first_fit();
show();
next_fit();
show();
best_fit();
show();
worst_fit();
show();
system("pause");
}
实验截图:
实验报告册课程计算机组装与维护姓名刘蓉学号101124004专业信息技术学院班级10网络指导老师赵秀英20xx至20xx学年第2学…
计算机科学与技术系实验报告课程名称计算机组装与维护实训实验名称硬盘的分区格式化姓名曹蓉学号124077031002日期成绩教师张毓…
计算机科学与技术系实验报告课程名称实验名称硬盘的分区格式化姓名王欢学号124077031045日期103031地点十二机房成绩教师…
实验报告册课程计算机组装与维护姓名刘蓉学号101124004专业信息技术学院班级10网络指导老师赵秀英20xx至20xx学年第2学…
计算机科学与技术系实验报告课程名称计算机组装与维护实训实验名称硬盘的分区格式化姓名曹蓉学号124077031002日期成绩教师张毓…
计算机科学与技术系实验报告课程名称实验名称硬盘的分区格式化姓名王欢学号124077031045日期103031地点十二机房成绩教师…