当前位置:
文档之家› 操作系统第二次实验first-fit, next-fit
操作系统第二次实验first-fit, next-fit
}
}
int array_release(int *p,int m)
{
for(int n=0;n<m;n++)
{
*p=0;
p++;
}
return 0;
}
int main()
{
int i=0;
for(;i<99;i++)
{
array[i]=0;
}
int m_array[20];
int *pp[20];
int t=0,tt=0;
首次适应策略的思路是,分配时在空闲块列表中搜索,找到第一个能够满足请求的块即停止搜索,然后把搜索到的块分割,一部分返回给请求者,另一部分仍然作为空闲块留在空闲列表的原来位置。首次适应策略的问题在于,链表头部区域的块倾向于被首先分割,经过一段时间后,空闲链表头部可能堆积大量小的空闲块,这会导致搜索时间的增加,因为当请求一个头部区域的小块无法满足的块时,需要顺次检查这些小块。
array_release(pp[tt], m_array[tt]);
printf("\n释放后®\n");
for(intk=0;k<99;k++)
{
printf("%d",array[k]);
}
}
else
{
printf("error\n");
}
}
return0;
}
运行截图如下:
(1)首先分配4块内存,内存大小由rand()随机数决定
while(count<n&&k<99 )//
{
if(*p==0)
{
count++;
p++;
}
elseif(*p==1)
{
count=0;
p++;
}
k++;
}
if(k==99)//
{
returnNULL;
}
else{
p=p-n;
int*point;
point=p;
for(inta=0;a<n;a++)
if(choice==1)
{
count++;
number++;
int r=0;
do{
r=rand();
}while(r>=15 || r<=2);
m_array[number]=r;
printf("\n第%d块内存的大小为%d \n",number,r);
pp[number]=array_request(m_array[number]);
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int array[99];
int *array_request(int n)
{
int count=0;
int *p=&array[0];
int *l=&array[99];
while(count<n && p!=l)
number++;
intr=0;
do
{
r=rand();
}while(r>=25||r<=2);
m_array[number]=r;
pp[number]=0;
printf("%d\n",number,r);
pp[number]=array_request(m_array[number]);
if(pp[number]==NULL)
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
intarray[999];
int*p=&array[0];
intcountt=0;
int*array_request(intn)
{
intcount=0;
int*l=&array[999];
int*t=&array[0];
{
intsuiji2=0;
do
{
suiji2=rand();
}while(suiji2>count||pp[suiji2]==NULL);
array_release(pp[suiji2], m_array[suiji2]);
count--;
}
}
}
return0;
}
试验截图如下:
Next_fit内存利用率实验程序:
{
printf("\n请输入要释放的内存块号数1-%d \n",number);
count--;
scanf("%d",&tt);
array_release(pp[tt],m_array[tt]);
printf("\ห้องสมุดไป่ตู้释放后\n");
for(int k=0;k<99;k++)
{
if(k%10==0)
printf(“\n”);
intk=0;
while(count<n&&k<999 )
{
if(p==l)
{
p=t;
count=0;
}
else
{
if(*p==0)
{
count++;
p++;
}
elseif(*p==1)
{
count=0;
countt++;
p++;
}
}
k++;
}
if(k==999)
{
returnNULL;
for(inta=0;a<n;a++)
{
*p=1;
p++;
}
returnpoint;
}
}
intarray_release(int*p,intm)
{
for(intn=0;n<m;n++)
{
*p=0;
p++;
}
*p=NULL;
return0;
}
intmain()
{
for(intc=0;c<999;c++)//
提高搜索效率。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
intarray[99];
int*p=&array[0];
int*array_request(intn)
{
intcount=0;
int*l=&array[99];
intk=0;
m_array[number]=r;
pp[number]=array_request(m_array[number]);
if(pp[number]==NULL)
{
printf("first_fit\n");
for(intn=0;n<999;n++)
{
printf("%d",array[n]);
}
doublea=0;
{
array[c]=0;
}
intm_array[999];
int*pp[999];
intnumber=0,count=0;
for(intc=0;c<999;c++)
{
m_array[c]=0;
pp[c]=0;
}
while(1)
{
if(count==0)
{
intr=0;
do
{
r=rand();
}while(r>=15||r<=2);
int*l=&array[999];
while(count<n&& p!=l )
{
if(*p==0)
{
count++;
p++;
}
else
{
count=0;
p++;
countt++;
}
}
if(count<n && p==l>
{
returnNULL;
}
else
{
p=p-n;
int*point;
point=p;
已分配过的内存置为1
未占用的内存置为0
4块内存的大小分别为8,12,3,9
(2)释放第2,3块内存,以使内存分裂成块
(3)继续写入内存,按照next fit的原理,靠前的内存块不做变化,继续分配较后的内存块
一直分配到内存近满
(3)继续分配内存块 ,指针绕道内存头部继续分配
(4)当所剩任何一个数据块都不够容纳数据时,报溢出错误,不够的数据块不再分配
if(pp[number]==NULL)
{
printf("溢出\n");
return 0;
}
else