/*使用首次适应算法的模拟,使用空闲分区链*/
#include "stdio.h"
#include "conio.h"
#define getpch(type,size) (type*)malloc(sizeof(type)*size)
#define MINSIZE sizeof(FQ)*2
int memsize;/*模拟的内存大小*/
char *memfirst; /*模拟的内存所占的首地址*/
int frees=-1;/*free指向模拟内存的空闲分区的首地址*/
struct fq/*分区链的结构*/
{
int link; /*指向前一个空闲分区块或者后一个空闲分区块*/
int size; /*空闲分区的大小*/
}*p=NULL;
typedef struct fq FQ;
int insert(int first,int fqsize)/*构造空闲分区时按空闲分区从小到大插入空闲分区*/
{
int a,f,l;
if(frees<0)/*空闲分区为空*/
{
frees=first;
p=(FQ*)(memfirst+first);/*在空闲分区的首部来记录该空闲分区的信息和前向指针*/
p->link=-1; /*因为是第一个,前向指针为-1*/
p->size=fqsize;
p=(FQ*)(memfirst+first+fqsize-sizeof(FQ)); /*在空闲分区的尾部来记录该空闲分区的信息和前向指针*/
p->size=fqsize;
p->link=-1; /*因为是第1个,所以后向指针也为-1*/
return 1;
}
else
{
a=frees;
while(a!=-1)/*判断是否有重叠*/
{
p=(FQ*)(memfirst+a);
p=(FQ*)(memfirst+a+p->size)-1;
l=p->link;
if(first<a&&first+fqsize>a||first<a+p->size&&first>a)
{
printf("空闲分区有部分重叠!");
return -1;
}
a=p->link;
}
a=frees;
while(a!=-1)/*判断是否可以跟现有空闲分区合并*/
{
p=(FQ*)(memfirst+a);
f=p->link;
p=(FQ*)(memfirst+a+p->size)-1;
l=p->link;
if(first+fqsize==a)
{
fqsize=p->size+fqsize;/*保存新的空闲分区大小*/
if(l!=-1)/*如果不是最后一个空闲分区*/
{
p=(FQ*)(memfirst+l);
p->link=f;
if(f!=-1)
{
p=(FQ*)(memfirst+f);
p->link=l;
}
else
{
frees=l;
}
}
else
{
if(f!=-1)
{
p=(FQ*)(memfirst+f);
p->link=-1;
}
else
{
frees=-1;
}
}
return insert(first,fqsize);
}
if(a+p->size==first)
{
fqsize=p->size+fqsize;/*保存新的空闲分区大小*/
if(l!=-1)/*如果不是最后一个空闲分区*/
{
p=(FQ*)(memfirst+l);
p->link=f;
if(f!=-1)
{
p=(FQ*)(memfirst+f);
p->link=l;
}
else
{
frees=l;
}
}
else
{
if(f!=-1)
{
p=(FQ*)(memfirst+f);
p->link=-1;
}
else
{
frees=-1;
}
}
return insert(a,fqsize);
}
a=p->link;
}/*判断是否可以跟现有空闲分区合并*/
p=(FQ*)(memfirst+frees);
if(fqsize<p->size) /*要插入的空闲分区的大小小于所空闲分区的大小*/
{
p=(FQ*)(memfirst+first);
p->size=fqsize;
p->link=-1;
p=(FQ*)(memfirst+first+fqsize)-1;
p->size=fqsize;
p->link=frees;
p=(FQ*)(memfirst+frees);
p->link=first+fqsize-sizeof(FQ);
frees=first;
return 1;
}
else
{
a=frees;
p=(FQ*)(memfirst+frees);
f=p->link;
p=(FQ*)(memfirst+frees+p->size)-1;
l=p->link;
while(fqsize>p->size&&l!=-1)
{
p=(FQ*)(memfirst+l);
f=p->link;
p=(FQ*)((char*)p+p->size)-1;
a=l;
l=p->link;
}
if(fqsize<=p->size)/*找到的合适插入的位置不在最后*/
{
p=(FQ*)(memfirst+first);
p->size=fqsize;
p->link=f;
p=(FQ*)(memfirst+first+p->size)-1;
p->size=fqsize;
p->link=a;
p=(FQ*)(memfirst+f);
p->link=first;
return 1;
}
else/*要插入的空闲分区的大小大于所有空闲分区的大小*/
{
p->link=first;
f=(char*)p-memfirst;
p=(FQ*)(memfirst+first);
p->size=fqsize;
p->link=f;
p=(FQ*)(memfirst+first+p->size)-1;
p->size=fqsize;
p->link=-1;
return 1;
}
}
}
return -1;
}
make()/*初始化空闲分区链*/
{
int first,fqsize;
char yn;
printf("请输入内存的空间大小(字节为单位):");
scanf("%d",&memsize);
memfirst=getpch(char,memsize);
printf("======下面开始构造空闲分区========\n");
while(1)
{
printf("请输入空闲分区的首地址:");
scanf("%d",&first);
if(first<0)
{
printf("首地址不能小于0!请重新输入!\n");
continue ;
}
printf("请输入空闲分区的大小:");
scanf("%d",&fqsize);
if(fqsize<MINSIZE)
{
printf("空闲分区大小不能小于%d!请重新输入!\n",MINSIZE);
continue ;
}
insert(first,fqsize);/*调用insert函数把空闲分区插入分区链*/
getchar();
printf("是否继续构造空闲分区表(Y/N)?");
scanf("%c",&yn);
if(yn!='y'&&yn!='Y') break;
}
}
display()/*显示目前的空闲分区状态*/
{
int next;
FQ * hou;
printf("======当前空闲分区的状态========\n首地址 \t大小\n");
if(frees==-1) return;
p=(FQ*)(memfirst+frees);
hou=(FQ*)((char*)p+p->size)-1;
next=hou->link ;
while(next!=-1)
{
printf("%d\t\t%d\n",(char*)p-memfirst,p->size);
p=(FQ*)(memfirst+hou->link);
hou=(FQ*)((char*)p+p->size)-1;
next=hou->link;
}
printf("%d\t\t%d\n",(char*)p-memfirst,p->size);
}
int freemem()/*回收内存*/
{
int first,size,res;
printf("请输入要回收的内存的首址:");
scanf("%d",&first);
printf("请输入要回收的内存的大小:");
scanf("%d",&size);
res=insert(first,size);/*回收就是把这个分区插入到空闲分区链*/
if(res==1)
{
printf("首址为:%d,大小为:%d有内存已成功回收!\n",first,size);
return 1;
}
return -1;
}
int requestmen()/*分配内存*/
{
int size,f,l,a,b;
printf("请输入要分配的内存大小:");
scanf("%d",&size);
if(size<0||size>memsize)
{
printf("要分配的内存大小太大或太小!\n");
return ;
}
p=(FQ*)(memfirst+frees);
a=frees;
f=p->link;
p=(FQ*)((char*)p+p->size)-1;
l=p->link;
while(p->size<size&&p->link!=-1)/*找到合适分配的空闲分区*/
{
f=(char*)p-memfirst;
p=(FQ*)(memfirst+l);
a=l;
p=(FQ*)((char*)p+p->size)-1;
l=p->link;
}
if(p->size>=size)/*如果找到合适的空闲分区*/
{
if(p->size-size>=2*sizeof(FQ))/*如果空闲分配分配后还有剩余*/
{
size=p->size-size;
b=(char*)(p+1)-memfirst-size;/*保存分配后空闲分区的首地址*/
if(l!=-1)/*如果不是最后一个空闲分区*/
{
p=(FQ*)(memfirst+l);
p->link=f;
if(f!=-1)
{
p=(FQ*)(memfirst+f);
p->link=l;
}
else
{
frees=l;
}
}
else
{
if(f!=-1)
{
p=(FQ*)(memfirst+a);
p->link=l;
}
else
{
frees=-1;
}
}
if(insert(b,size)==1)
{return a; }
else
return -1;
}
else
{
p=(FQ*)(memfirst+l);
p->link=f;
p=(FQ*)(memfirst+f);
p->link=l;
return a;
}
}
else
{
if(p->link==-1)
{
printf("没有足够大的内存可分配!\n");
return -1;
}
}
return -1;
}
main()
{
char yn;
int res;
make();/*初始化空闲分区链*/
displ
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验代码 单多道处理程序作业
共9个文件
c:9个
5星 · 超过95%的资源 需积分: 14 15 下载量 155 浏览量
2011-06-11
20:36:26
上传
评论
收藏 16KB RAR 举报
温馨提示
单道处理程序作业 多道处理程序作业 最高优先数优先.c 最佳适应算法.c 等
资源推荐
资源详情
资源评论
收起资源包目录
操作系统实验代码.rar (9个子文件)
文件系统.c 9KB
最高优先数优先.c 3KB
单道处理程序作业.c 7KB
首次适应.c 8KB
最佳适应算法.c 9KB
简单轮转法.c 3KB
循环首次适应.c 9KB
构造目录.c 2KB
多道处理程序作业.c 5KB
共 9 条
- 1
资源评论
- whiteeat822014-03-02不错,顶一个~
- JerryFoudation2012-11-14很好用的代码! 很适用初学者
morticia
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功