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

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

piikee14年前 (2008-12-24)我的开发267
实验目的
了解用户程序分配内存以及回收所用内存的过程,加深对操作系统存储管理机制的理解。
实验内容
采用首次适应法、最佳适应法或最差适应法,编写一内存分配和回收模拟程序。
实验选取算法
实验选取的算法是首次适应算法,即分配第一个足够大的孔。查找可以从头开始,也可以从上次首次适应结束时开始。一旦找到足够大的空闲孔,就可以停止。
算法代码:
#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

分享给朋友:

相关文章

Windows XP 任务栏图标修复工具V1.1

Windows XP 任务栏图标修复工具V1.1

Windows XP下的任务栏右下角图标总是无缘无故的消失。有时候是音量图标,有时候是网络图标。最惨的是USB删除图标了,一插U盘或移动硬盘就无法弹出来了,找不到图标!到网上找了很多方法,有很多还是解决不了问题,最后总算找到了一个有效的解决...

Linux下基于GTK+的单词数值计算器

Linux下基于GTK+的单词数值计算器

一、 实验要求综合运用CTK+提供的函数,按照一定的规则(具体见实验报告)计算一个单词或者一组单词的数值,并输出到屏幕或文件中。1、 按照规则计算单词的值,如果 A B C D E F G H I J K L M N O P Q R S T...

邮件伪装者

邮件伪装者

C#.net开发的一个邮件发送软件,可以自定义发件人,伪装发件人发送邮件。用于垃圾邮件发送。。。使用不当后果自负。使用环境配置一,添加IIS服务器。开始菜单中打开“控制面板”,点击“添加添加或删除程序” ,左边面板选择“添加/删除windo...

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

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

txt文件编码批量转换器

txt文件编码批量转换器

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

windows7网卡MAC地址修改器测试版

1,只适用于windows7系统的网卡MAC地址修改。2,部分windows7下的无线网卡地址无法修改,理论上也可以使用本软件修改。3,修改MAC地址前,请先在开始菜单-运行,输入cmd打开控制台,输入getmac获取原来网卡MAC并记下来...

发表评论

访客

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