可变分区方式下的最优适应调度算法(C++环境下实现)
来源:互联网 发布:电脑软件突然消失 编辑:程序博客网 时间:2024/04/29 10:18
#include <iostream>
#include <string>
#include <iomanip>
#define n 10 //假定系统允许的最大作业量n
#define m 10 //假定系统允许的空闲区表最大为m
#define minsize 100
using namespace std;
struct use
{ float address;
float length;
string flag;
char uname;
int next;
}usetable[n];
struct ok
{ int uhead;
int utail;
int fhead;
int ftail;
}point;
struct free
{ float address;
float length;
string flag;
char fname;
int next;
}freetable[m];
void allocate(char j,float xk)//采用最优分配法分配xk大小的空间
{ int i,k,p,c;
float ad;
k=-1;
i=point.fhead;
c=i;
do
{ if(freetable[i].length >=xk && freetable[i].flag=="可用")
if(k==-1||freetable[i].length<freetable[k].length)
{
k=i;
p=c;
}
c=i;
i=freetable[i].next;
}while(i!=-1);
if(k==-1)
{ cout<<"无可用空闲区"<<endl;
return;
}
if(freetable[k].length-xk<=minsize)
{
freetable[k].flag="空表目";
xk=freetable[k].length;
ad=freetable[k].address;
freetable[k].fname=' ';
freetable[k].length=0;
freetable[k].address=0;
if(k==point.fhead)
{
point.fhead=freetable[k].next;
}
if(k==point.ftail)
{
point.ftail=p;
}
if(k!=point.fhead && k!=point.ftail)
{
freetable[p].next=freetable[k].next;
}
}
else
{ freetable[k].length=freetable[k].length-xk;
ad=freetable[k].address;
freetable[k].address=freetable[k].address+xk;
freetable[k].fname=' ';
freetable[k].flag="可用";
}//修改已分配区表
i=0;
while (usetable[i].flag!="空表目"&&i<n)
i++;
if(i>=n)
{
cout<<"无目表填写已分区,错误"<<endl;
if(freetable[k].flag=="空目表")
freetable[k].flag="已分配";
else
freetable[k].length=freetable[k].length+xk;
return;
}
else
{
usetable[i].address=ad;
usetable[i].length=xk;
usetable[i].flag="已分配";
usetable[i].uname=j;
if(point.uhead==-1)
{
point.uhead=point.utail=i;
}
else
{
usetable[point.utail].next=i;
usetable[i].next=-1;
point.utail=i;
}
}
return;
}//主存分配函数结束
void reclaim(char J)
{
int i,k,j,s,t,p;
float S,L;
s=point.uhead;
t=s;
if(s==-1)
{
cout<<"没有找到该作业/n"<<endl;
return;
}
while (s!=-1)
{
if(usetable[s].uname==J&&s<n)
{p=t;
k=s;
break;
}
t=s;
s=usetable[s].next;
}
s=k;
if(s==-1)
{
cout<<"没有找到该作业/n"<<endl;
return;
}
if(s>=n)
{
cout<<"找不到该作业"<<endl;
return;
}
//修改已分配区表
usetable[s].flag="空表目";
usetable[s].uname=' ';
//取得归还分区的起始地址S和长度L
S=usetable[s].address;
L=usetable[s].length;
usetable[s].address=0;
usetable[s].length=0;
// usetable[s].next=-1;
if(s==point.uhead)
{
point.uhead=usetable[s].next;
usetable[s].next=-1;
}
if(s==point.utail)
{
point.utail=p;
usetable[s].next=-1;
usetable[p].next=-1;
}
if(s!=point.uhead&&s!=point.utail)
{
usetable[p].next=usetable[s].next;
usetable[s].next=-1;
}
//寻找回收分区的上下邻闲区,上邻表目k,下邻表目j
j=-1;k=-1;i=0;
while(i<m&&(j==-1||k==-1))
{
if(freetable[i].flag=="可用")
{
if (freetable[i].address+freetable[i].length==S)k=i;//找到上邻
if (freetable[i].address==S+L)j=i;//找到下邻
}
i++;
}//查找符合条件的可用单元
if(k!=-1)
if(j!=-1) //上邻空闲区,下邻空闲区,三项合并
{
freetable[k].length=freetable[j].length+freetable[k].length+L;
freetable[k].flag="可用";
freetable[k].fname=' ';
freetable[j].length=freetable[j].address=0;
freetable[j].fname=' ';
}
else //上邻非空闲区,下邻为空闲区,与下邻合并
{
freetable[k].length=freetable[k].length+L;
freetable[k].fname=' ';
}
else
if(j!=-1)
{
freetable[j].address=S;
freetable[j].length=freetable[j].length+L;
freetable[j].fname=' ';
}
else//上下邻均为非空闲区,回收区域直接填入
{//在空闲区表中寻找空栏目
t=0;
while(freetable[t].flag=="可用"&&t<m)
t++;
if(t>m)
{
cout<<"主空闲表没有空闲空间回收失败"<<endl;
return;
}
freetable[t].address=S;
freetable[t].length=L;
freetable[t].flag="可用";
freetable[t].fname=' ';
freetable[point.ftail].next=t;
point.ftail=t;
freetable[t].next=-1;
}
return;
}//主存归还函数结束
void main()
{
char name;
float xk;
//空闲表初始化
freetable[0].address=10240;
freetable[0].length=102400;
freetable[0].flag="可用";
freetable[0].next=-1;
int i,a;
point.uhead=point.utail=-1;
point.fhead=0;
point.ftail=0;
for(i=1;i<m;i++)
{
freetable[i].flag="空表目";
freetable[i].length=0;
freetable[i].address=0;
freetable[i].fname=' ';
freetable[i].next=-1;
}
//已分配区表初始化
for(i=0;i<n;i++)
{
usetable[i].flag="空表目";
usetable[i].length=0;
usetable[i].address=0;
usetable[i].uname=' ';
usetable[i].next=-1;
}
while(1)
{
cout<<endl<<"选择功能项(0-退出,1- 分配主存,2-回收主存,3-显示主存)"<<endl;
cout<<"选择功项(0--3)";
cin>>a;
switch(a)
{
case 0:exit(0);
case 1:
cout<<"输入作业名和作业所需长度: ";
cin>>name>>xk;
allocate(name,xk);
break;
case 2:
cout<<"输入要回收的作业名:";
cin>>name;
reclaim(name);
break;
case 3:
cout<<endl<<"输出空闲表区:/n项名 起始地址 分区长度 标志/n";
i=point.fhead;
while(i!=-1&&i<m)
{
cout<<setiosflags(ios::left)<<setw(7)<<i<<setw(8)<<setiosflags(ios::left)<<freetable[i].address<<setw(8)<<setiosflags(ios::left)<<freetable[i].length<<setw(8)<<setiosflags(ios::left)<<freetable[i].flag<<endl;
i=freetable[i].next;
}
cout<<endl<<"输出已分配区表:/n";
cout<<"项名 起始地址 分区长度 标志/n";
i=point.uhead;
while (i!=-1&&i<n)
{
cout<<setiosflags(ios::left)<<setw(7)<<usetable[i].uname<<setiosflags(ios::left)<<setw(8)<<usetable[i].address<<setiosflags(ios::left)<<setw(8)<<usetable[i].length<<setiosflags(ios::left)<<setw(8)<<usetable[i].flag<<endl;
i=usetable[i].next;
}
break;
defalut:cout<<"没有这个选项"<<endl;
}
}
}
- 可变分区方式下的最优适应调度算法(C++环境下实现)
- 操作系统可变分区用C语言实现按首次适应算法分配内存
- 操作系统可变分区用C语言实现按最佳适应算法分配内存
- 内存动态分配的首先适应、最优适应、最坏适应算法的实现(java 版)
- .Net 环境下实现可变大小的无标题窗口拖动
- .Net 环境下实现可变大小的无标题窗口拖动
- 适应各种开发,测试,线上,线下环境的Spring配置方式
- C 语言下的 可变参数列表函数实现
- 最优适应算法
- Linux环境下实现NTFS分区完全读写的方法
- C的方式实现可变参数函数
- 商城方式实现最优算法
- 内存动态分配的首先适应、最优适应、最坏适应算法的窗口演示(java版)
- linux下运用c实现队列调度
- 首先适应算法,最优适应算法,最坏适应算法
- 内存管理------最优适应算法
- Linux 下常见的进程调度算法
- 可变式分区的分配算法
- C语言高效编程的几招
- 成批更改sql server数据库所有者的对象
- 关于友情
- C语言之Main函数返回值问题
- C#多线程应用技术入门实例
- 可变分区方式下的最优适应调度算法(C++环境下实现)
- C# 多线程中集合数据同步
- 5-14
- .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0
- C# 多线程访问UI
- 语义分析课程设计
- 6-25
- 华为面试感想
- petshop4.0 详解