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

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

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

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

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

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

分享给朋友:

相关文章

学生排课系统

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

C# 系统计算器的制作(.net)

C# 系统计算器的制作(.net)

实验要求参照Windows系统提供的计算器功能,制作一个自己的计算器,至少能完成数据的加减乘除的基本功能。控件的焦点以及Tab键的设置和使用。多个控件(按钮)事件的共享。实现键盘输入。设计思路创建主体框架:建立程序的主要界面后,系统自动生成...

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

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

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

txt文件编码批量转换器

txt文件编码批量转换器

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

Windows系统任务栏图标修复工具 终结版

Windows系统任务栏图标修复工具 终结版

用于修复Windows XP /Vista/Windows 7 等系统中,右下角任务栏图标消失的问题。包括使用U盘时,usb删除图标没有显示的问题。点击修复按钮时,如果有360安全卫士或者瑞星卡卡助手弹出注册表写入警告,请点击允许。这是图标...

Discuz论坛批量发贴机

一、 Discuz论坛批量发贴机简介Discuz论坛批量发贴机,采用.net平台开发。该发贴机使用模块化开发,运用了多线程和xml存储技术。适用于通用的Discuz论坛程序的批量发帖。可以设置一个帖子发布到N个论坛,或者N个帖子发布到一个论...

发表评论

访客

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