资源描述
操作系统实验四
【实验题目】:动态分区分配算法
【实验学时】:4学时
【实验目得】
通过这次实验,加深对动态分区分配算法得理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法与最坏适应算法得实现方法。
【实验内容及要求】
问题描述:
设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法与最坏适应算法得工作过程。假设内存中空闲分区个数为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");
}
实验截图:
展开阅读全文