高手进,请教一个C语言算法结构的问题

实际上是个动态分区的问题,操作系统中的首次适应算法,我用数组实现,毕竟是一个模拟过程,也没有用指针。
下面是源码。如果数组a[m]等于'f',表示还未被分配给作业,
#include<stdio.h>
#include<stdlib.h>
struct work
{int id;
int space;
int state;/*0未被分配,1已被分配*/
int first;/*job占用的数组中最末的元素的表示*/
};
struct work job[7]=
{
{1,130,0,0},
{2,60,0,0},
{3,100,0,0},
{4,200,0,0},
{5,140,0,0},
{6,60,0,0},
{7,50,0,0}
};
int i,j,m,n;
char a[640];
void alloc(int m)
{
for(i=0;i<640-job[m].space;i++)
{
{if(job[m].state==0)
for(j=i;j<i+job[m].space;j++)
{
if(a[j]=='f')
{
a[j]='t';
job[m].first=i;
}
}
job[m].state=1;//这一行是关键部分,控制着循环是否进行以及进行多少次
}
}
printf("作业%d的分区是%d-----%d\n",job[m].id,job[m].first,job[m].first+job[m].space-1);
}
void mfree(int n)/*释放空间*/
{
i=job[n].first;
job[n].state=0;
job[n].first=0;
for(j=job[m].first;j<job[m].first+job[n].space;j++)
{
a[j]='f';
}
printf("作业%d的分区%d-----%d被收回\n",job[n].id,job[m].first,job[m].first+job[m].space-1);
}
void main()
{
for(i=0;i<640;i++)
{
a[i]='f';
}
alloc(0);
getchar();
alloc(1);
getchar();
alloc(2);
getchar();
mfree(1);
getchar();
alloc(3);
getchar();
mfree(2);
getchar();
mfree(0);
getchar();
alloc(4);
getchar();
alloc(5);
getchar();
alloc(6);
getchar();
mfree(5);
getchar();
}
我的问题是void alloc(int m)里
if(job[m].state==0)和job[m].state=1;的位置如何放置,才能使内循环里的if语句对job[m].state=1;起到作用,而且job[m].state=1语句在a[j]='t'循环赋值全部进行完后只运行一次,也能和if(job[m].state==0)相互配合。
还有a[j]='t'语句我感觉没有起到作用,一个作业结束后下个作业循环仍从0开始,难道上个作业的循环里对a[j]的赋值失败?
程序运行结果应该是这样的:
作业1 0-129
作业2 130-189
作业3 190-289
作业4 290-489
作业5 0-139
作业6 140-199
作业7 200-249
如果按照我这个思路不能实现这个结果,各位大大能不能提供个能解决问题的法子,源码最好,思路也行!
原题:[计算机操作系统] 动态分区分配方式的模拟
简介:实验目的:了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态扮区存储管理方式及其实现过程的理解。 实验内容:1、分别实现首次适应算法和最佳适应算法的动态分区分配过程和回收过程。其中 ...实验目的:了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态扮区存储管理方式及其实现过程的理解。
实验内容:1、分别实现首次适应算法和最佳适应算法的动态分区分配过程和回收过程。其中,空闲分区通过空闲区链进行管理;进行内存分配时,系统优先使用空闲区低端的空间。
2、假设初试状态下,可用的内存空间为640KB,并有下列的请求序列:
作业1申请 130KB
作业2申请 60KB
作业3申请 100KB
作业2释放 60KB
作业4申请 200KB
作业3释放 100KB
作业1释放 130KB
作业5申请 140KB
作业6申请 60KB
作业7申请 50KB
作业6释放 60KB
3、每次分配和回收后显示空闲内存分区链情况。
PS:首次算法的思路是从内存低端开始扫描,作业使用找到的第一个符合作业大小要求的内存块

改好了
void alloc(int m)
{
for(i=0;i<640-job[m].space;i++)
{
if(job[m].state==0)
{
for(j=i;j<i+job[m].space;j++)
{
if(a[j]!='f') break;
}
if(j==i+job[m].space)//是否有足够的连续空间
{
for(j=job[m].first=i;j<i+job[m].space;j++)
{
a[j]='t';
}
job[m].state=1;//这一行是关键部分,控制着循环是否进行以及进行多少次
}
}
else break;
}
printf("作业%d的分区是%d-----%d\n",job[m].id,job[m].first,job[m].first+job[m].space-1);
}
void mfree(int n)/*释放空间*/
{
for(j=job[n].first;j<job[n].first+job[n].space;j++)
{
a[j]='f';
}
printf("作业%d的分区%d-----%d被收回\n",job[n].id,job[n].first,job[n].first+job[n].space-1);
job[n].state=0;
job[n].first=0;
}

参考资料:http://www.ut365.com/baogao/197.html

温馨提示:答案为网友推荐,仅供参考
相似回答