1、start(5)结束位置:end(6)进程名称:name(7)进程大小:capactity(8)分区使用标记flag 设计思路:(1) 程序首先定义了进程数目number=100,以及对内存块大小和分区数目进行了初始化。(2) 从main函数开始,并分别定义了功能菜单menu()函数,内存初始化init-neicun()函数,内存分配fenpei()函数,首次适应算法first-fit() 函数,内存回收memory-recovery()函数,进程显示showit()函数,以 及退出系统exit()函数,这些算法函数对内存的查看、分配和回收等进 行了计算。4、 主要功能模块(1) main()
2、函数(2) menu()函数(3) init-neicun()函数(4) fenpei()函数(5) first-fit()函数(6) memory-recovery()函数(7) showit()函数(8) exit()函数5、 模块的输入输出(1) main()函数:整型输入,调用两个函数,返回0;(2) menu()函数:功能菜单,输入对功能菜单的选择select(1-4),它们分别是1添加进程,2 回收内存,3查看内存分配,4退出。并通过switch方法实现对各函数的调用。(3) init-neicun()函数:输入内存大小,并对第i个进程的名称name、开始位置start、结束位置e
3、nd、大小capactity以及标记位flag等进行了初始化。(4) fenpei()函数:为内存分配内存,输入所需添加进程的名称和大小,并调用first-fit()算法。(5) first-fit()函数:当某一分区不在使用时,如果内存空间大于进程长度,则分配内存,并输出该内存的名称name和大小size,并通过检验标记位flag是否等于1来输出是否能为该进程成功分配内存。(6) memory-recovery()函数:回收之前分配给进程的内存,输入需回收内存的进程名称,标记位flag表示回收是否成功,0代表失败,1代表成功,根据flag的值输出内存是否回收成功。此外,将连续的已回收的内存区
4、合并。(7) showit()函数:显示进程情况,即输出各个进程的名称,开始位置,结束位置,进程大小。并根据flag的值来判断一进程是已使用、未使用还是尾部。(8) exit()函数:整型输入,返回0;通过exit(0)方法来退出程序。6、 程序流程图7、实验截图 8、源代码#include string.hiostream#define number 100/进程数量int neicun=200;/内存块默认大小int fqNum=1;/已使用分区数目,进程数目=fqNum-1/结构类型struct fqinfo/分区信息 int start;/开始位置 int end;/结束位置 char
5、 name;/进程名称 int capactity;/进程大小或者分区块大小 int flag;/分区使用标记,0:未使用 1:已使用 2:回收或者合并的分区 3:尾部fqlistnumber;/fqlist分区列表/函数定义int menu();/功能菜单int init_neicun();/初始化内存大小int fenpei();/为进程分配内存int first_fit(char name,int size);/首次适应算法int Memory_recovery();/内存回收int showit();/显示进程int exit();/退出系统/功能菜单menuint menu() in
6、t select; printf(n-n); 1: 添加进程 2: 回收内存n 3: 查看内存分配 4: 退出nplease input your choice: scanf(%d,&select); switch(select) case 1:fenpei();break; case 2:Memory_recovery(); case 3:showit(); case 4:exit(); menu(); return 0;int init_neicun() for(int i=0;isize)/如果内存空间大于进程长度 if(ii;j-) fqlistj=fqlistj-1; fqlisti
7、+1.name= fqlisti+1.start=sum+size; fqlisti+1.end=fqlisti.end; fqlisti+1.capactity=fqlisti.capactity-size; fqlisti+1.flag=fqlisti.flag; fqlisti.name=jname; fqlisti.start=sum; fqlisti.end=sum+size-1; fqlisti.capactity=size; fqlisti.flag=1; fqNum+;/进程数目增1 /需要把以后的分区块往后一个位置 flag=1; else /当未使用的分区块大小不足时 su
8、m=sum+fqlisti.capactity; else/当该分区块在使用时 sum=sum+fqlisti.capactity; if(flag=1) printf(已为进程%c分配内存区!n,jname); else为进程%c分配内存区失败!/回收内存int Memory_recovery()/标记回收是否成功 0:失败 1:成功 int sflag=0;/ int tflag=0; char jname=z/吸收空白键请输入进程名称:%cjname); if(fqlisti.name=jname) fqlisti.name= fqlisti.flag=2;/表示为回收的内存区 flag
9、=1; fqNum-;进程%c结束,内存回收成功!进程%c无法结束,内存回收失败! /将连续的已回收的内存区合并 while(flag3) for(i=0;number-1; if(fqlisti.flag=0|fqlisti.flag=2) if(fqlisti+1.flag!=1) if(fqlisti+1.flag=3) fqlisti.end=fqlisti+1.end; fqlisti.capactity=fqlisti.capactity+fqlisti+1.capactity; fqlisti.flag=fqlisti+1.flag; for(int j=i+1;jj+) fql
10、istj=fqlistj+1; i=number; flag+; else flag+;/显示进程情况int showit() int count=0;进程名称 开始位置 结束位置 进程大小 状态nnumber-1&countfqNum;i+) %5c%10d%12d%10d,fqlisti.name,fqlisti.start,fqlisti.end,fqlisti.capactity); if(fqlisti.flag=1) printf( 已使用n count+; else if(fqlisti.flag=3) 尾部n else if(fqlisti.flag=2) 未使用n else if(fqlisti.flag=0)/退出int exit() 按任意键退出.n exit(0);/主函数int main() init_neicun();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1