当前位置:首页 > 计算机相关 > 我的开发 > 正文内容

模拟内存分配--操作系统课程设计

piikee14年前 (2008-12-24)我的开发192
实验目的
了解用户程序分配内存以及回收所用内存的过程,加深对操作系统存储管理机制的理解。
实验内容
采用首次适应法、最佳适应法或最差适应法,编写一内存分配和回收模拟程序。
实验选取算法
实验选取的算法是首次适应算法,即分配第一个足够大的孔。查找可以从头开始,也可以从上次首次适应结束时开始。一旦找到足够大的空闲孔,就可以停止。
算法代码:
#include "stdio.h"
#include"stdlib.h"
/* 定义内存分配队列 */
struct fenpei
{
int flag; /* 进程占用  0表示空闲,其他数值表示相应进程 */
int add; /* 起始地址 */
int length; /* 占有长度 */
};
struct fenpei freeq[13];
/* 请求和释放的结构体*/
struct af
{
int num; /*进程ID*/
int af; /* a表示申请,f表示释放 */
int length; /*占用长度*/
};
struct af allocq[13];
/* 首次适应算法函数*/
void go(struct af allowqnow,int *ptotal,struct fenpei *pfreeq)
{
int i,j,num;
int temp_num,temp_add,temp_length;
struct fenpei temp_f1,temp_f2;
/* 申请空间 */
if (allowqnow.af=='a')
{
for (i=0;i<13;i++) /*在所有空间中找到可以增加的空位*/
{
if((pfreeq[i].flag==0)&(pfreeq[i].length>allowqnow.length)) /*空间空闲(flag=0)且空间大于需求*/
{
temp_num=pfreeq[i].flag;
temp_add=pfreeq[i].add+allowqnow.length;
temp_length=pfreeq[i].length-allowqnow.length;
pfreeq[i].flag=allowqnow.num;
pfreeq[i].length=allowqnow.length;
if (pfreeq[i+1].length==0)
{
pfreeq[i+1].flag=temp_num;
pfreeq[i+1].add=temp_add;
pfreeq[i+1].length=temp_length;
}
else
if (pfreeq[i+1].add!=temp_add)
{
temp_f1.flag=temp_num; temp_f1.add=temp_add; temp_f1.length=temp_length;
temp_f2=pfreeq[i+1];
for (j=i+1;pfreeq[j].length!=0;j++)
{
pfreeq[j]=temp_f1;
temp_f1=temp_f2;
temp_f2=pfreeq[j+1];
}
pfreeq[j]=temp_f1;
}
break;
}
}
}
/* 释放空间if (allowqnow.af=='f')*/
else
{
for (i=0;i<13;i++)
{
if (pfreeq[i].flag==allowqnow.num)
{
if ((pfreeq[i-1].flag==0)&(pfreeq[i+1].flag==0)&(i>0))
{
pfreeq[i-1].length=pfreeq[i-1].length+allowqnow.length+pfreeq[i+1].length;
for (j=i;pfreeq[j].length!=0;j++)
{
pfreeq[j].flag=pfreeq[j+2].flag;
pfreeq[j].add=pfreeq[j].add;
pfreeq[j].length=pfreeq[j].length;
}
}
else if ((pfreeq[i-1].flag==0)&(i>0))
{
pfreeq[i-1].length=pfreeq[i-1].length+allowqnow.length;
for (j=i;pfreeq[j].length!=0;j++)
{
pfreeq[j].flag=pfreeq[j+1].flag;
pfreeq[j].add=pfreeq[j+1].add;
pfreeq[j].length=pfreeq[j+1].length;
}
}
else if (pfreeq[i+1].flag==0)
{
pfreeq[i].flag=0;
pfreeq[i].length=allowqnow.length+pfreeq[i+1].length;
for (j=i+1;pfreeq[j].length!=0;j++)
{
pfreeq[j].flag=pfreeq[j+1].flag;
pfreeq[j].add=pfreeq[j+1].add;
pfreeq[j].length=pfreeq[j+1].length;
}
}
else
{
pfreeq[i].flag=0;
}
}
}
}
num=0; /* 统计空闲块*/
for (i=0;pfreeq[i].length!=0;i++)
if (pfreeq[i].flag==0) num++;
*ptotal=num;
}
/*主函数*/
main()
{
int i,j; char p;
int Freetotal=1;
/*a1,a2,f1,a3,f2,a4,a5,a6,f5,a7,a8,f7,a9*最后3,4,6,8,9存在内存中,  rand()%201产生随机进程占用长度*/
allocq[0].num=1;
allocq[0].af='a';
allocq[0].length=rand()%201;
allocq[1].num=2;
allocq[1].af='a';
allocq[1].length=rand()%201;
allocq[2].num=1;
allocq[2].af='f';
allocq[2].length=allocq[0].length;
allocq[3].num=3;
allocq[3].af='a';
allocq[3].length=rand()%201;
allocq[4].num=2;
allocq[4].af='f';
allocq[4].length=allocq[1].length;
allocq[5].num=4;
allocq[5].af='a';
allocq[5].length=rand()%201;
allocq[6].num=5;
allocq[6].af='a';
allocq[6].length=rand()%201;
allocq[7].num=6;
allocq[7].af='a';
allocq[7].length=rand()%201;
allocq[8].num=5;
allocq[8].af='f';
allocq[8].length=allocq[6].length;
allocq[9].num=7;
allocq[9].af='a';
allocq[9].length=rand()%201;
allocq[10].num=8;
allocq[10].af='a';
allocq[10].length=rand()%201;
allocq[11].num=7;
allocq[11].af='f';
allocq[11].length=allocq[9].length;
allocq[12].num=9;
allocq[12].af='a';
allocq[12].length=rand()%201;
freeq[0].flag=0;
freeq[0].add=0;
freeq[0].length=900;
printf("                         ***************************\n");
printf("                         *                         *\n");
printf("                         *首次适应方法模拟内存分配 *\n");
printf("                         ***************************\n\n");
for(i=0;i<13;i++)
{
go(allocq[i],&Freetotal,freeq);
printf("\n                    总共有%d个空闲区 ",Freetotal) ;
printf("\n                    进程占用(0表示空闲)   起始地址   长度");
for(j=0;freeq[j].length!=0;j++)
printf( "\n                    %5d           %10d   %10d",freeq[j].flag,freeq[j].add,freeq[j].length);
printf("\n                    ***************************************\n\n");
}
printf("                    班级:*****\n\n                    姓名:piikee\n\n                    学号:***********\n\n");
printf("选择Y结束程序\n");
p=getchar();
}
版权所有,请勿用于商业用途!

扫描二维码推送至手机访问。

版权声明:本文由萍客小居发布,如需转载请注明出处。

本文链接:https://www.piikee.net/172.html

分享给朋友:

相关文章

学生排课系统

系统实现的功能用户输入一个数字(1~8),代表要在多少个学期内修完所有给出的课程,程序根据“lessonlist.txt”中的课程,对每个学期的课程合理地分配,并输出每个学期的课程表。所作的工作根据各个课程必修的前后顺序,用拓扑序方法,得出...

flex小程序(算算你在这个世界上存活了多少天)

flex代码<code><?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxm...

U盘禁用小精灵

U盘禁用小精灵

C#.net开发的小工具,使用者电脑必须安装.net平台才可以使用。.net平台下载地址见:.NET Framework 微软官方地址 http://download.microsoft.com/download/3/F/0/3F0A922...

txt文件编码批量转换器

txt文件编码批量转换器

用于批量转换txt文本文档的编码格式。通常我们电脑里的txt文件都是ASNI编码,放到手机,MP3等设备里面,打开看到的都是乱码。所以我们必须先把它们转换为Unicode格式,才能够在手机和MP3上面打开。如果有大量的文件,一个一个打开另存...

伪原创生成工具

伪原创生成工具

伪原创,生成工具--站长必备的工具。通过替换字符的设置,还有关键字的设置,伪原创生成工具可以把原文生成一篇伪原创文章,让搜索引擎认为你的文章是网络上独一无二的文章,从而提高你网站的权重。其次,伪原创生成会根据你设置的关键字,在文章中添加上你...

IP地址修改器bat文件

把以下内容拷入一个记事本,并把文件后缀改为.bat即可。@echo           ################################################@echo           #####      I...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。