实验报告
实验名称 首次适应算法循环首次适应算法
实验目
理解连续分区动态存储理方式实现存空间分配回收
实验原理
首次适应(first fitFF)算法
FF算法求空闲分区链址递增次序链接分配存时链首开始序查找直找满足求空闲分区然作业该分区中划出块存空间分配请求者余空闲分区留空闲链中链首直链尾找满足求分区表明系统中已没足够存分配该进程存分配失败返回
循环首次适应(next fitNF)算法
避免低址部分留许空闲分区减少查找空闲分区开销循环首次适应算法进程分配存空间时次链首开始查找次找空闲分区空闲分区开始查找直找满足求空闲分区中划出块玉请求相等存空间分配作业
实验容
实现存空间分配回收:
1 采变式分区理首次适应算法实现存空间分配回收
2 采变式分区理循环首次适应算法实现存空间分配回收
数结构符号说明:
typedef struct PCB进程控制块
{
char ProgressName[10] 进程名称
int Startaddress 进程开始址
int ProgressSize 进程
int ProgressState 0 进程状态
}
typedef struct FREE 空闲区结构体
{
int Free_num 空闲区名称
int Startaddress 空闲区开始址
int Endaddress 空闲区结束址
int Free_Space 空闲区
}
算法流程图:
首次适应算法
循环首次适应算法
程序代码截图:
#include
#include
#include
#include
#define N 1024
typedef struct PCB进程控制块
{
char ProgressName[10] 进程名称
int Startaddress 进程开始址
int ProgressSize 进程
int ProgressState 0 进程状态
}
typedef struct FREE 空闲区结构体
{
int Free_num 空闲区名称
int Startaddress 空闲区开始址
int Endaddress 空闲区结束址
int Free_Space 空闲区
}
int count 0 前存中进程数
bool ROM[N]设置存块
int p 0循环首次需标记前空闲区块
FREE FREE[100]设置空闲区数组100
int FREE_counter 0空闲区数
PCB num[20] 作业队列
void init()初始化操作
{
for(int i0 i
}
void showProgress(PCB &a)
{
printf(\n)
printf(进程名\t\t开始址\t\t\t\t结束址\n)输出存信息
printf(\n)
for(int i0 i
{
a num[j]
num[j] num[j+1]
num[j+1] a
}
for(int i0 i
printf(s\t\td\t\t\td\t\td\t\t\nnum[i]ProgressNamenum[i]Startaddressnum[i]ProgressSizenum[i]ProgressSize+num[i]Startaddress1)
printf(\n)
}
void showFree()印空闲区情况
{
printf(\n)
printf( 空闲区名\t| 开始址\t| \t| 结束址\n)
printf(\n)
for (int i1 i< FREE_counter i++)
{
printf(\t1d\t8d\t11d\t d\nFREE[i]Free_numFREE[i]Startaddress FREE[i]Free_SpaceFREE[i]Endaddress)
printf(\n)
}
}
void find_FREE() 寻找空闲区
{
int ijp 计数值
FREE_counter 0预设空闲区数0
for(i 0 i < N i++)
if(ROM[i] 0)
{
p i
for(j i j < N j++)
{
if(ROM[j]0)未找空闲区j赋值i继续循环
{
i j
continue
}
if(ROM[j]1)找空闲区
{
FREE_counter++空闲区数+1
FREE[FREE_counter]Free_num FREE_counter设置空闲区编号
FREE[FREE_counter]Startaddress p
FREE[FREE_counter]Endaddress j1
FREE[FREE_counter]Free_Space jp
ij+1
break
}
}
if(j N && ROM[j1] 0)存进行特殊操作
{
FREE_counter++
FREE[ FREE_counter]Free_num FREE_counter空闲区进行处理
FREE[ FREE_counter]Startaddress p
FREE[ FREE_counter]Endaddress j1
FREE[ FREE_counter]Free_Space jp
}
}
}
void First_Fit(PCB &a)首次适应算法
{
int ijk
for(i0 i
{
for(ji j<(i+aProgressSize)&&j
{
i j + 1
break
}
if(ji+aProgressSize+1)
{
aStartaddress i设置作业开始址
aProgressState 1标记作业存中
for(ki k ROM[k]1
printf(进程s插入成功进程s初始址d结束址d\naProgressNameaProgressNameaStartaddressaStartaddress+aProgressSize1)
return
}
}
if(iN)未查询合适区域
printf(插入失败空间\n)
}
void Next_Fit(PCB &a)循环首次适应算法实现作业调度
{
int ijk
for(ip i
if(ROM[i]0)
{
for(ji j<(i+aProgressSize)&&j
{
i j+1
break
}
if(ji+aProgressSize+1)找合适空闲区
{
aStartaddressi
aProgressState1
for(ki k ROM[k]1
printf(插入成功进程s 初始址d结束址d\naProgressNameaStartaddressaStartaddress+aProgressSize1)
pi+aProgressSize
return
}
}
}
for(i0 i
if(ROM[i]0)
{
for(ji j<(i+aProgressSize)&&j
if(ROM[j]1)
{
ij+1
break
}
if(ji+aProgressSize+1)成功找结束标记前P现作业尾部
{
aStartaddressi
aProgressState1
for(ki k ROM[k]1
printf(插入成功进程s 初始址d\naProgressNameaStartaddress)
pi+aProgressSize
break
}
}
if(ip)查询两部分未找合适区域输出插入失败语句
printf(插入失败空间\n)
}
void Delete(PCB &a)删作业修改存信息初始化该作业信息
{
int i
for(iaStartaddress i
aProgressState0状态标记未
printf(进程s删成功\naProgressName)
}
int main()
{
int choose1choose
char ProgressName[10]
PCB a
init()
printf(\t存空间分配回收\n)
printf(\n)
printf(\t1首次适应算法\n)
printf(\t2循环首次适应算法\n)
printf(\n)
printf(请选择分配算法:)
scanf(d&choose1)
system(cls)
while(1)
{
wsystem(cls)
printf(前分配算法:)
if(choose1 1)
printf(首次适应算法\n)
else
printf(循环首次适应算法\n)
printf(\n)
printf(\t1插入进程\n)
printf(\t2删进程\n)
printf(\t3显示进程信息\n)
printf(\t4显示空闲区\n)
printf(\n)
printf(请输入:)
scanf(d&choose)
system(cls)
switch(choose)
{
case 1
printf(请输入进程名)
scanf(s&aProgressName)
printf(请输入进程:)
scanf(d&aProgressSize)
for(int i 0 i < count i++)
if(strcmp(num[i]ProgressNameaProgressName)0)
{
printf(已存名进程法插入\n)
system(pause)
goto w
}
if(choose11)首次适应算法
First_Fit(a)
else
Next_Fit(a)循环首次适应算法
num[count++]a
break
case 2
if(count 0)
{
printf(前没进程存中法删\n)
system(pause)
goto w
}
printf(输入删进程名字:)
scanf(s&ProgressName)
for(int i0 i
Delete(num[i])
else
printf(没找应进程请重新输入\n)
break
case 3
showProgress(a)
break
case 4
find_FREE()
showFree()
break
default
printf(\n效输入\n)
}
system(pause)
}
return 0
}
界面:
首次适应算法初始空闲区:
插入进程:
插入3进程:
空闲区信息:
删进程2:
删空闲区状况:
插入进程初始址100:
循环首次适应算法插入3进程
删进程2:
插入进程A发现次找空闲分区空闲分区开始查找初始址750200:
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档