1、操作系统存储动态分区分配及回收算法附源码存储管理动态分区分配及回收算法课程名称:计算机操作系统 班级:信1-2实验者姓名:李琛 实验日期:218年月20日评分: 教师签名:一、实验目的分区管理是应用较广泛的一种存储管理技术。本实验要求用一种结构化高级语言构造 分区描述器,编制动态分区分配算法和回收算法模拟程序,并讨论不同分配算法的特点。二、实验要求1、编写:Firt Fitlgorithm 2、编写:Best i Algrihm 3、编写:空闲区回收算法三、实验过程(一)主程序1、定义分区描述器 node,包括 3个元素: (1)adr-分区首地址(2)size-分区大小 (3)next-指向
2、下一个分区的指针 2、定义3 个指向 nod 结构的指针变量:()head1空闲区队列首指针(2)bak-指向释放区 node 结构的指针 ()asign指向申请的内存分区node 结构的指针、定义 个整形变量: free用户申请存储区的大小(由用户键入)(二)过程 1、定义check 过程,用于检查指定的释放块(由用户键入)的合法性2、定义 siment1过程,实现 irs FitAlgit 3、定义 asgnet2 过程,实现 est FitAgrim、定义accepmn1 过程,实现 Firt Fi goithm 的回收算法 5、定义 acceptnt2过程,实现BtFt Alorthm
3、 的回收算法 、定义 prnt 过程,打印空闲区队列 (三)执行 程序首先申请一整块空闲区,其首址为 0,大小为 367;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。实验代码Main。cpp#inluetdio。hicluetdlib。h#includncldeoseamusng namesace std;defie X_SE 2767tyede structnont i;intdr;int size; tut node*net;oe;Nde *hea1, had, *ack1, ack2, ssi;int euet;it
4、 check(int add, int i, chr c) Ne *p,head; it ceck = ;if (addad) &( +szpad)) | (ad =padr) & (addpar + psie)) chck = 0; else = nex; if (check = 0)pint(”t输入释放区地址或大小有错误!);return chk;vidni()Node *; head1 =(o*)malc(szef(Noe);hea2 (ode*)maloc(sizeof(Node));p = (Nod*)alloc(sieof(Node);ead1t = p;ea2net = p;
5、psiz =AX_SIE; adr=0; pne NUL; pid 0;Nde* assgnment(it nm,nt re)Noe *before,*afe, as; as = (Node)malloc(sieo(ode)); before hd1;after= head1ext;assi um; asssie =r; hile (afteizereq)befor =fore-ne; after afte-next;i(ater =NUL) aa 1; ls if (aterize = eq) eorenext = afernext; assadr=after-ad; else after-
6、size - rq; ar = afteradr; ateradr += rq; etun as;voiacceptnt1(int aress, ntsz, trd) oe *before, after; nt nser 0;back1= (Node*)mall(szeo(Noe));fore =head1; aftr = heant;bc1-dr = dres;bac1ize= siz; ack1i = r;ck1next =NUL; whie (!nsr&ter)将要被回收的分区插入空闲区(按首址大小从小到大插入) f (afte = ULL) | (bck1-ad = afterd) &
7、 (bck = beore-ar))) efx= ack1; bac1nex= fter; insert = 1; else eorberenxt; after ter-nx; if(insert)if(back1adr= beforadr+ bfre-size) /和前边分区合并 ore-size += bck-sie; efoe-nx= bac1-nxt; free(bak1); ls if (ftr&ac1ad ack1sze=a-adr) /和后边分区合并 backz += afer-ize; bk1-next aterex; bac1id =afeid; free(aer); fte
8、r =bck1; ntf(t首先分配算法回收内存成功!n”); els pritf(”首先分配算法回收内存失败!);Nd anment2(int num, it req) Node befoe, af, ass, *; ss = (de*)malloc(izf(de)); q = (ode)mloc(sizof(ode));befor = ed2;fter=head2-next; asi m; asssize= rq; while (atesinext; if(afte = NUL)sad 1; else i(aftr-ie eq) bfrenxtafternext; as-adr afedr
9、; el afte; beforenext =e-nx; assadr q-adr; qsie - e; q-d += rq;befre = ead2; ater =had2ext; if (after = NU) beorenext=q; next =NULL; ee wi ((afer-e)(q-i) bfo=befoenet; after = afternext; eforenex = q; q-net afte; retn(s);vod cceptmnt(intadrss, int iz, n d) Noe eore, *aft;it nsrt =;ack = (Node)mallc(
10、sizeof(d));beore= h2;fter =ea2-ext; bckdr=adrs; bak-size= siz;back-id=rd;ack2-ne NUL; if (hdnext = NULL)/空闲队列为空 ad2ex = ak; eadsize= ack-ze; el/空闲队列不为空 wl(after) (back2dr =aer-ad +a-size) /和前边空闲分区合并 beoeext = fterxt; aftrs += back2sie; back2 =afte; ls ef = beforenext; after = ate-next; efre = he2; a
11、fter hed-xt; wie (af) if (aftear = bc2adr + c-s) /和后边空闲区合并 forenex = frnex; bak2ize += aferize; els bfre = befoe-nex;afer aternet; befoe ha; at head2-nex;i (!isrt) /将被回收的块插入到恰当的位置(按分区大小从小到大) if (te = ULL | (tr-sizak2-size) & (bore-sizebck2-size) efoent back2;ack2ext fte; iner 1; brea; es beforebefor
12、et; ater =ter-net; if (isert) print(”最佳适应算法回收内存成功!n);lepint(”最佳适应算法回收内存失败!!n);voirint(char chice)/输出空闲区队列信息Noe *; (chie = f | coice = F) headn; else p = 2et; i (p) pintf(n空闲区队列的情况为:); prinf(t编号t首址t终址t大小”);hi () printf(”dt%tdt%dn”, p-id, p-ad, adr + siz 1,psize); p= pnext; voidmenu()/菜单及主要过程 ch chose
13、; it ch, nu=, , ad, rd; ile () sstm(”cls”); pint(-存储管理动态分区分配及回收算法-n); prinf( F 最先适应算法); pitf( B 最佳适应算法); prnf(” E 退出程序); prif(”-); pinf(请选择算法:”); in hose; /scanf(%c”, chose); f (choe = | chose = E) it(0); ele ystem(cls”); hile() i (hose =f | cose =F) printf(”最先适应算法:n”); if (hos= b | ose = ) intf(最佳适
14、应算法:n); print(”-n); intf( 1 分配内存n”); printf( 2 回收内存n”); printf( 3查看内存n”); pint(” 4 返回n”); pritf(-n”); prntf(请选择:); scan(”, &c); fush(stdn); stc (h) case 1: printf(输入申请的分区大小:”); anf(”, ); if (hoe = f |chose =F) asgn= signet1(m, r); el assin assgnmen2(num, r); f (ssignd= ) print(”分配内存失败!”); els rintf(
15、”分配成功!分配的内存的首址为:%dn, asignr); reak; cse2: pin(输入释放的内存的首址:); af(d,&dd); prtf(”输入释放的内存的大小:); sanf(”%d, r);pin(输入释放的内存的编号:”); scf(%,&rd); f (chck(dd, , chose)) i (chose = f | chos=) accepe1(ad, r, rd); else acmt2(ad, , rd); brak; case 3:prnt(hos);eak; case4:menu();break; voidma()/主函数 init();me();四、实验结果五、实验总结通过这次实验我练习了存储管理动态分区分配及回收算法,对操作系统中动态可变分区存储管理有了更深刻的了解。刚开始编程时并没有什么思路,查阅相关书籍,浏览网上的论坛后,才对这次实验有了编程思路,在编程中总会遇到各种意想不到问题,这些问题一定要解决。在解决问题的同时,自己的编程能力也在提高。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1