存儲管理動態(tài)分區(qū)分配算法的模擬_第1頁
存儲管理動態(tài)分區(qū)分配算法的模擬_第2頁
存儲管理動態(tài)分區(qū)分配算法的模擬_第3頁
存儲管理動態(tài)分區(qū)分配算法的模擬_第4頁
存儲管理動態(tài)分區(qū)分配算法的模擬_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、課程設(shè)計書第 頁第 頁、設(shè)計任務(wù)完成存儲器動態(tài)分區(qū)分配算法的模擬實現(xiàn)。二、設(shè)計思想在對數(shù)據(jù)結(jié)構(gòu)有一定掌握程度的情況下設(shè)計合理的數(shù)據(jù)結(jié)構(gòu)來描述存儲空間,實現(xiàn)分區(qū)存儲管理的內(nèi)存分配功能,應(yīng)該選擇最合適的適應(yīng)算法(首次適應(yīng)算法,最佳適應(yīng)算法,最后適應(yīng)算法,最壞適應(yīng)算法),實現(xiàn)分區(qū)存儲管理的內(nèi)存回收算法,在這些存儲管理中間必然會有碎片的產(chǎn)生,當(dāng)碎片產(chǎn)生時,進(jìn)行碎片的拼接,等等相關(guān)的內(nèi)容。三、預(yù)期目的讓我們了解操作系統(tǒng)的基本概念,理解計算機(jī)系統(tǒng)的資源如何組織,操作系統(tǒng)如何有效地管理這些系統(tǒng)資源,用戶如何通過操作系統(tǒng)與計算機(jī)系統(tǒng)打交道。通過課程設(shè)計,我們可以進(jìn)一步理解在計算機(jī)系統(tǒng)上運(yùn)行的其它各類操作系統(tǒng),

2、并懂得在操作系統(tǒng)的支持下建立自己的應(yīng)用系統(tǒng)。操作系統(tǒng)課程設(shè)計,對于訓(xùn)練學(xué)生掌握程序設(shè)計、熟悉上機(jī)操作和程序調(diào)試技術(shù)都有重要作用。重點培養(yǎng)學(xué)生的思維能力、設(shè)計能力、創(chuàng)新能力和排錯能力。四、設(shè)計方案首先是對相關(guān)知識的掌握,例如數(shù)據(jù)結(jié)構(gòu),計算方法,組成原理以及操作系統(tǒng)等。在這些基本知識的基礎(chǔ)上進(jìn)行擴(kuò)展,用語言的形式從函數(shù),數(shù)據(jù)結(jié)構(gòu)原代碼,原程序等方面來達(dá)到自己想要的目的。該設(shè)計就是要達(dá)到對各個細(xì)節(jié)的問題的解決將各個數(shù)據(jù)塊連接起來,最終達(dá)到存儲器動態(tài)分區(qū)分配算法的模擬實現(xiàn)。五、數(shù)據(jù)結(jié)構(gòu)1設(shè)計合理的數(shù)據(jù)結(jié)構(gòu)來描述存儲空間:對于未分配出去的部分,用空閑分區(qū)鏈表來描述。structfreeListintst

3、artAddress;/*分區(qū)起始地址*/intsize;/*分區(qū)大小*/structfreeList*next;/*分區(qū)鏈表指針*/對于已經(jīng)分配出去的部分,由裝入內(nèi)存的作業(yè)占據(jù)。structusedList/*分區(qū)起始地址*/*分區(qū)中存放作業(yè)ID*/*分區(qū)鏈表指針*/intstartAddress;intjobID;structusedList*next;將作業(yè)組織成鏈表。structjobListintid;/*作業(yè)ID*/intsize;/*作業(yè)大小(需要的存儲空間大?。?/intstatus;/*作業(yè)狀態(tài)0:newjob,1:inthememory,2:finished.*/struc

4、tjobList*next;/*作業(yè)鏈表指針*/以上將存儲空間分為空閑可占用兩部分,在usedlist中設(shè)joblD而不設(shè)size,可以在不增加空間復(fù)雜度(與freelist相比)的同時更方便的實現(xiàn)可變分區(qū)存儲管理(從后面的一些函數(shù)的實現(xiàn)上可以得出這個結(jié)論)。盡管設(shè)置joblist增加了空間復(fù)雜度,但它的存在,使得該程序可以方便的直接利用D盤中的JOB文件。該文件可以認(rèn)為是一個和其他進(jìn)程共享的資源。通過這個文件,其他進(jìn)程寫入數(shù)據(jù)供讀取。這中思想在操作系統(tǒng)設(shè)計中體現(xiàn)的很多。2實現(xiàn)分區(qū)存儲管理的內(nèi)存分配功能,選擇適應(yīng)算法(首次適應(yīng)算法,最佳適應(yīng)算法,最后適應(yīng)算法,最壞適應(yīng)算法)?;驹矸治觯?)

5、Bestfit:將空閑分區(qū)按大小從小到大排序,從頭找到大小合適的分區(qū)。2)Worstfit:將空閑分區(qū)按大小從大到小排序,從頭找到大小合適的分區(qū)。3)Firstfit:將空閑分區(qū)按起始地址大小從小到大排序,4)Lastfit:將空閑分區(qū)按起始地址大小從大到小排序,由此,可將空閑分區(qū)先做合適的排序后用對應(yīng)的適應(yīng)算法給作業(yè)分配存儲空間。排序函數(shù)order(bySize為零則按分區(qū)大小排序,否則按分區(qū)起始地址;inc為零從小到大排序,否則從大到小排序;通過empty指針返回結(jié)果)。voidorder(structfreeList*empty,intbySize,intinc)structfreeLi

6、st*p,*q,*temp;intstartAddress,size;for(p=(*empty)-next;p;p=p-next)/*按bySize和inc兩個參數(shù)尋找合適的節(jié)點,用temp指向它*/for(temp=q=p;q;q=q-next)switch(bySize)case0:switch(inc)case0:if(q-sizesize)temp=q;break;default:if(q-sizetemp-size)temp=q;break;break;default:switch(inc)case0:if(q-startAddressstartAddress)temp=q;bre

7、ak;default:if(q-startAddresstemp-startAddress)temp=q;break;break;/*交換節(jié)點的成員值*/if(temp!=p)startAddress=p-startAddress;size=p-size;p-startAddress=temp-startAddress;p-size=temp-size;temp-startAddress=startAddress;temp-size=size;3實現(xiàn)分區(qū)存儲管理的內(nèi)存回收算法。voidinsertFreeNode(structfreeList*empty,intstartAddress,int

8、size)插入回收的空節(jié)點分區(qū),處理回收分區(qū)與空閑分區(qū)的四種鄰接關(guān)系。structfreeList*p,*q,*r;for(p=*empty;p-next;p=p-next);/*處理鏈表尾部的鄰接情況*/if(p=*empty|p-startAddress+p-sizenext=p-next;/*插入獨(dú)立的空閑節(jié)點*/p-next=r;return;if(p-startAddress+p-size=startAddress)/*與尾部上鄰*/p-size+=size;/*合并尾部節(jié)點*/return;q=(*empty)-next;/*處理鏈表首節(jié)點的鄰接情況*/if(startAddres

9、s+size=q-startAddress)/*與首節(jié)點下鄰*/q-startAddress=startAddress;/*合并首節(jié)點*/q-size+=size;elseif(startAddress+sizestartAddress)/*與首節(jié)點不相鄰*/makeFreeNode(&r,startAddress,size);r-next=(*empty)-next;(*empty)-next=r;else/*處理鏈表中間的鄰接情況*/while(q-next&q-startAddressnext;if(p-startAddress+p-size=startAddress&q-startAd

10、dress=startAddress+size)/*上下鄰,合并節(jié)點*/p-size+=size+q-size;p-next=q-next;程設(shè)計書程設(shè)計書第 頁第 #頁/*刪除多余節(jié)點*/課free(q);elseif(p-startAddress+p-size=startAddress&q-startAddress!=startAddress+size)/*上鄰,增加節(jié)點的大小*/p-size+=size;elseif(p-startAddress+p-size!=startAddress&q-startAddress=startAddress+size)/*下鄰*/q-startAddr

11、ess=startAddress;/*修改節(jié)點起始地址*/q-size+=size;/*修改節(jié)點的大小*/else/*上下不相鄰*/makeFreeNode(&r,startAddress,size);r-next=p-next;p-next=r;4當(dāng)碎片產(chǎn)生時,進(jìn)行碎片的拼接。voidmoveFragment(structjobList*jobs,structfreeList*empty,structusedList*used)intsize,status;structusedList*p;intaddress=memoryStartAddress;/*全局變量,初始化時分配存儲空間始址*/

12、if(*empty)-next=NULL)/*空閑分區(qū)鏈表為空,提示并返回*/printf(nThememorywasusedoutatall.nMaybeyoushouldfinishsomejobsfirstorpressanykeytotryagain!);getch();return;for(p=(*used)-next;p;p=p-next)/*循環(huán)的修改占用分區(qū)的始址*/p-startAddress=address;課程設(shè)計書課程設(shè)計書第 頁第 頁getjoblnfo(jobs,p-joblD,&size,&status);/*由作業(yè)ID獲得作業(yè)大小*/address+=size;

13、(*empty)-next-startAddress=address;/*修改空閑分區(qū)的首節(jié)點始址、大小*/(*empty)-next-size=memorySize-(address-memoryStartAddress);(*empty)-next-next=NULL;/*刪除首節(jié)點后的所有節(jié)點*/5空閑分區(qū)隊列顯示:intshowFreeList(structfreeList*empty)6作業(yè)占用鏈表顯示intshowUsedList(structjobList*jobs,structusedList*used)從頭到尾顯示used鏈,同時通過其中的作業(yè)ID在jobs中查對應(yīng)的大小。7

14、從鍵盤輸入作業(yè)到D盤的JOB文件:voidinputjob(void)8從JOB文件中讀出作業(yè)并創(chuàng)建作業(yè)鏈表:intmakejobList(structjobList*jobs)9顯示作業(yè)鏈表:intshowjobList(structjobList*jobs)更新作業(yè)鏈表中作業(yè)的狀態(tài):intupdatejobFile(structjobList*jobs)根據(jù)作業(yè)鏈表更新JOB文件:intupdatejobFile(structjobList*jobs)為作業(yè)分配存儲空間、狀態(tài)必須為0:intallocate(structfreeList*empty,intsize)結(jié)束一個作業(yè)號為id的作

15、業(yè),釋放存儲空間(由*startAddress返回空間的起始地址):intfinishjob(struetusedList*used,intid,int*startAddress)插入釋放的空間到used鏈表中(作業(yè)號為id,startAddress由函數(shù)13返回):voidinsertUsedNode(struetusedList*used,intid,intstartAddress)15.獲取作業(yè)的信息:voidgetJobInfo(structjobList*jobs,intid,int*size,int*status)16.初始化存儲空間起始地址、大?。簐oidiniMemory(vo

16、id)17.選擇適應(yīng)算法:charselectFitMethod(void)18根據(jù)參數(shù)startAddress、size創(chuàng)建空閑節(jié)點,由empty指針返回:voidmakeFreeNode(structfreeList*empty,intstartAddress,intsize)19.以要求的方式打開文件:voidopenFile(FILE*fp,char*filename,char*mode)20.出現(xiàn)嚴(yán)重錯誤時顯示信息并結(jié)束程序;voiderrorMessage(void)六、算法流程1、DynamicZonalMemoryManagement其中1、Initializiation.按順

17、序利用了openFile()、iniMemory()、makeFreeNode()、inputjob()(選擇利用D盤JOB文件時提供作業(yè)信息)、makeJobList()、allocate()、insertUsedNode()(選擇利用D盤JOB文件時先將狀態(tài)為1的作業(yè)放到存儲空間中,以恢復(fù)上次的模擬實驗,或使本次模擬時不出錯)selectFitMethod(等自編函數(shù)。2、Putjobintomemory(allocatememory)按順序利用了showJobList()(選手動逐個為作業(yè)分配存儲空間時)、openFile()、order()、allocate()、errorMessag

18、e()、insertUsedNode()、updateJobStatus()updateJobFile()函數(shù)3、Finishjob(reusememory)按順序利用了openFile()、showUsedList()、getJobInfo()、insertFreeNode()、updateJobStatus()、updateJobFile()、errorMessage()等自編函數(shù)。4、Showcurrentfreelist按順序利用了openFile()、showFreeList()函數(shù)。5、Showcurrentmemoryusedbyjobs按順序利用了openFile()、show

19、UsedList()函數(shù)。6、Movefragmenttogether按順序利用了openFile()、moveFragment()函數(shù)。7、Exit按順序利用了openFile()、exit(0)函數(shù)。七、程序清單1、原程序#include#include#includeintmemoryStartAddressintmemorySizestructjobListintintint/*id;size;status;作業(yè)狀態(tài)0-1;=-1;/*作業(yè)ID*/*作業(yè)大?。ㄐ枰拇鎯臻g大小)*/:newjob*next;structjobList;structfreeListintstartAdd

20、ress;intsize;,1:inthememory,2:finished.*/*作業(yè)鏈表指針*/structfreeList*next;/*分區(qū)起始地址*/*分區(qū)大小*/*分區(qū)鏈表指針*/課程設(shè)計書課程設(shè)計書第 頁第 頁;structusedList/*分區(qū)起始地址*/*分區(qū)中存放作業(yè)ID*/*分區(qū)鏈表指針*/*出現(xiàn)嚴(yán)重錯誤時顯示信息并結(jié)束程序*/intstartAddress;intjobID;structusedList*next;voiderrorMessage(void)printf(ntError!a);printf(nPressanykeytoexit!);getch();ex

21、it(1);voidopenFile(FILE*fp,char*filename,char*mode)/*以要求的方式打開文件*/if(*fp=fopen(filename,mode)=NULL)printf(nCantopen%sinmode%s.,filename,mode);errorMessage();voidmakeFreeNode(structfreeList*empty,intstartAddress,intsize)/*根據(jù)參數(shù)startAddress、size創(chuàng)建空閑節(jié)點,由empty指針返回*/if(*empty=malloc(sizeof(structfreeList)=

22、NULL)printf(nNotenoughtoallocateforthefreenode.);errorMessage();(*empty)-startAddress=startAddress;(*empty)-size=size;(*empty)-next=NULL;voidiniMemory(void)/*初始化存儲空間起始地址、大小*/charMSA10,MS10;printf(nPleaseinputthestartaddressofthememory!);scanf(%s,MSA);memoryStartAddress=atoi(MSA);printf(nPleaseinputt

23、hesizeofthememory!);scanf(%s,MS);memorySize=atoi(MS);charselectFitMethod(void)/*選擇適應(yīng)算法*/FILE*fp;charfitMethod;doprintf(nnPleaseinputacharasfallowtoselectthefitmethod!n1(Bestfit)n2(Worstfit)n3(Firstfit)n4(Lastfit)n)fitMethod=getche();while(fitMethod4);openFile(&fp,d:result.cl,a);switch(fitMethod),1,c

24、ase1:fprintf(fp,nnnntBestfit);fprintf(fp,n*);break;case2:fprintf(fp,nnnntWorstfit);fprintf(fp,n*);break;,o5case3:fprintf(fp,nnnntFirstfit);fprintf(fp,n*);break;case4:fprintf(fp,nnnntLastfit);fprintf(fp,n*);break;fclose(fp);returnfitMethod;voidinputJob(void)/*從鍵盤輸入作業(yè)到D盤的JOB文件*/int/*id,size,*/status=0

25、,jobnum=0;FILE*fp;charid10,size10;openFile(&fp,d:job.cl,w);fprintf(fp,job_IDtsizetstatus);printf(nnnnPleaseinputthejobsasfallow!nEnteraintegersmallerthan1toquit.njob_IDtsizen);do/*scanf(%d%d,&id,&size);*/scanf(%st%s,id,size);if(atoi(id)0&atoi(size)0)fprintf(fp,n%st%st%d,id,size,status);/*fprintf(fp,

26、n%dt%dt%d,id,size,status);*/jobnum+;elsebreak;while(1);if(jobnum)printf(nFinishedtoinputthejobs!);elseprintf(nNojobwasgiven.);errorMessage();intfclose(fp);makeJobList(structjobList*jobs)/*從JOB文件中讀出作業(yè)并創(chuàng)建作業(yè)鏈表*/charjobID10,size10,status10;structjobList*rear;FILE*fp;openFile(&fp,d:job.cl,r);fscanf(fp,%s

27、%s%s,jobID,size,status);if(*jobs=malloc(sizeof(structjobList)=NULL)printf(nNotenoughtoallocateforthejob.);fclose(fp);errorMessage();rear=*jobs;(*jobs)-next=NULL;while(!feof(fp)structjobList*p;fscanf(fp,%s%s%s,jobID,size,status);if(p=malloc(sizeof(structjobList)=NULL)printf(nNotenoughtoallocateforthe

28、job.);fclose(fp);errorMessage();next=rear-next;-next=p;rear-next;id=atoi(jobID);size=atoi(size);status=atoi(status);-prearrear-rearrearrearfclose(fp);return0;intupdateJobFile(structjobList*jobs)/*更新作業(yè)鏈表中作業(yè)的狀態(tài)*/FILE*fp;structjobList*p;openFile(&fp,d:job.cl,w);fprintf(fp,job_IDtsizetstatus);for(p=jobs

29、-next;p;p=p-next)fprintf(fp,n%dt%dt%d,p-id,p-size,p-status);fclose(fp);return0;intshowFreeList(structfreeList*empty)/*空閑分區(qū)隊列顯示*/FILE*fp;structfreeList*p=empty-next;intcount=0;openFile(&fp,d:result.cl,a);fprintf(fp,nnNowshowthefreelist.);printf(nnNowshowthefreelist.);if(p)fprintf(fp,nnumbertsizetstar

30、tAddress);printf(nnumbertsizetstartAddress);for(;p;p=p-next)fprintf(fp,n%dt%dt%d,+count,p-size,p-startAddress);printf(n%dt%dt%d,count,p-size,p-startAddress);fclose(fp);return1;elsefprintf(fp,nThememorywasusedout!);printf(nThememorywasusedout!);fclose(fp);return0;voidgetJobInfo(structjobList*jobs,int

31、id,int*size,int*status)/*獲取作業(yè)的信息*/structjobList*p=jobs-next;while(p&p-id!=id)p=p-next;if(p=NULL)printf(nCantfindthejobwhichidis:%d.,id);errorMessage();else*size=p-size;*status=p-status;voidupdateJobStatus(structjobList*jobs,intid,intstatus)structjobList*p=(*jobs)-next;while(p&p-id!=id)p=p-next;if(p=

32、NULL)printf(nCantfindthejobwhichidis:%d.,id);errorMessage();elsep-status=status;intshowUsedList(structjobList*jobs,structusedList*used)/*作業(yè)占用鏈表顯示*/FILE*fp;structusedList*p=used-next;intcount=0,size,status;openFile(&fp,d:result.cl,a);fprintf(fp,nnNowshowtheusedlist.);printf(nnNowshowtheusedlist.);if(

33、p)fprintf(fp,nnumbertjobIDtsizetstartAddress);printf(nnumbertjobIDtsizetstartAddress);for(;p;p=p-next)getJobInfo(jobs,p-jobID,&size,&status);fprintf(fp,n%dt%dt%dt%d,+count,p-jobID,size,p-startAddress);printf(n%dt%dt%dt%d,count,p-jobID,size,p-startAddress);fclose(fp);return1;elsefprintf(fp,nNojobinth

34、ememory!Youshouldinputsomejobstoit.);printf(nNojobinthememory!Youshouldinputsomejobstoit.);fclose(fp);return0;intshowJobList(structjobList*jobs)/*顯示作業(yè)鏈表*/structjobList*p;p=jobs-next;if(p=NULL)printf(nNojobinthelist!Tryagainnexttime.);return0;printf(nnThejoblistisasfallow:njob_IDtsizetstatus);while(p

35、)printf(n%dt%dt%d,p-id,p-size,p-status);p=p-next;return1;voidmoveFragment(structjobList*jobs,structfreeList*empty,structusedList*used)intsize,status;structusedList*p;intaddress=memoryStartAddress;/*全局變量,初始化時分配存儲空間始址*/if(*empty)-next=NULL)/*空閑分區(qū)鏈表為空,提示并返回*/printf(nThememorywasusedoutatall.nMaybeyoush

36、ouldfinishsomejobsfirstorpressanykeytotryagain!);getch();return;for(p=(*used)-next;p;p=p-next)/*循環(huán)的修改占用分區(qū)的始址*/p-startAddress=address;getJobInfo(jobs,p-jobID,&size,&status);/*由作業(yè)ID獲得作業(yè)大小*/address+=size;(*empty)-next-startAddress=address;/*修改空閑分區(qū)的首節(jié)點始址、大小*/(*empty)-next-size=memorySize-(address-memory

37、StartAddress);(*empty)-next-next=NULL;/*刪除首節(jié)點后的所有節(jié)點*/voidorder(structfreeList*empty,intbySize,intinc)structfreeList*p,*q,*temp;intstartAddress,size;for(p=(*empty)-next;p;p=p-next)/*按bySize和inc兩個參數(shù)尋找合適的節(jié)點,用temp指向它*/for(temp=q=p;q;q=q-next)switch(bySize)case0:switch(inc)case0:if(q-sizesize)temp=q;brea

38、k;default:if(q-sizetemp-size)temp=q;break;break;default:switch(inc)case0:if(q-startAddressstartAddress)temp=q;break;default:if(q-startAddresstemp-startAddress)temp=q;break;break;/*交換節(jié)點的成員值*/if(temp!=p)startAddress=p-startAddress;size=p-size;p-startAddress=temp-startAddress;p-size=temp-size;temp-star

39、tAddress=startAddress;temp-size=size;intallocate(structfreeList*empty,intsize)/*為作業(yè)分配存儲空間、狀態(tài)必須為0*/structfreeList*p,*prep;intstartAddress=-1;p=(*empty)-next;while(p&p-sizenext;if(p!=NULL)if(p-sizesize)startAddress=p-startAddress;p-startAddress+=size;p-size-=size;elsestartAddress=p-startAddress;prep=*

40、empty;while(prep-next!=p)prep=prep-next;prep-next二p-next;free(p);elseprintf(nMaybeyoushouldmovethefragmenttogether.);/*Unsuccessful!*/returnstartAddress;voidinsertUsedNode(structusedList*used,intid,intstartAddress)/*插入釋放的空間到used鏈表中(作業(yè)號為id,startAddress由函數(shù)13返回)*/structusedList*q,*r,*prer;if(q=malloc(s

41、izeof(structusedList)=NULL)printf(nNotenoughtoallocatefortheusednode.);errorMessage();q-startAddress=startAddress;q-jobID=id;prer=*used;r=(*used)-next;while(r&r-startAddressnext;q-next=prer-next;prer-next=q;intfinishJob(structusedList*used,intid,int*startAddress)/*結(jié)束一個作業(yè)號為id的作業(yè),釋放存儲空間(由*startAddress

42、返回空間的起始地址)*/structusedList*p,*prep;prep=*used;p=prep-next;while(p&p-jobID!=id)prep=p;p=p-next;if(p=NULL)printf(nThejobwhichidis:%disnotinthememory!,id);return0;else*startAddress=p-startAddress;prep-next=p-next;free(p);return1;voidinsertFreeNode(structfreeList*empty,intstartAddress,intsize)/*插入回收的空節(jié)點

43、分區(qū),處理回收分區(qū)與空閑分區(qū)的四種鄰接關(guān)系。*/structfreeList*p,*q,*r;for(p=*empty;p-next;p=p-next);/*處理鏈表尾部的鄰接情況*/if(p=*empty|p-startAddress+p-sizenext=p-next;/*插入獨(dú)立的空閑節(jié)點*/p-next=r;return;if(p-startAddress+p-size=startAddress)/*與尾部上鄰*/p-size+=size;/*合并尾部節(jié)點*/return;q=(*empty)-next;/*處理鏈表首節(jié)點的鄰接情況*/if(startAddress+size=q-st

44、artAddress)/*與首節(jié)點下鄰*/q-startAddress=startAddress;/*合并首節(jié)點*/q-size+=size;elseif(startAddress+sizestartAddress)/*與首節(jié)點不相鄰*/makeFreeNode(&r,startAddress,size);r-next=(*empty)-next;(*empty)-next=r;else/*處理鏈表中間的鄰接情況*/while(q-next&q-startAddressnext;if(p-startAddress+p-size=startAddress&q-startAddress=start

45、Address+size)/*上下鄰,合并節(jié)點*/p-size+=size+q-size;p-next=q-next;free(q);/*刪除多余節(jié)點*/elseif(p-startAddress+p-size=startAddress&q-startAddress!=startAddress+size)/*上鄰,增加節(jié)點的大小*/p-size+=size;elseif(p-startAddress+p-size!=startAddress&q-startAddress=startAddress+size)/*下鄰*/q-startAddress=startAddress;/*修改節(jié)點起始地址

46、*/q-size+=size;/*修改節(jié)點的大小*/else/*上下不相鄰*/makeFreeNode(&r,startAddress,size);r-next=p-next;p-next=r;voidmain(void)charfitMethod;FILE*fp;structjobList*jobs;structfreeList*empty;structusedList*used;if(used=malloc(sizeof(structusedList)=NULL)printf(nNotenoughtoallocatefortheusednode.);errorMessage();used-

47、next=NULL;remove(d:result.cl);makeFreeNode(&empty,0,0);while(1)charch,step;intid,size,startAddress,status;structjobList*q;printf(n1Initializiation.n2Putjobintomemory(allocatememory).n3Finishjob(reusememory).n4Showcurrentfreelist.n5Showcurrentmemoryusedbyjobs.n6Movefragmenttogether.n7Exit.);printf(nP

48、leaseselectadigittocontinue.n);step=getche();printf(n);switch(step),1,case1:openFile(&fp,d:result.cl,a);fprintf(fp,nntInitializiation:);used-next=NULL;empty-next=NULL;iniMemory();makeFreeNode(&(empty-next),memoryStartAddress,memorySize);fprintf(fp,nnnDoyouwanttouseyourjobfiledirectly?nDefaultisN.Y/N

49、:);printf(nnnDoyouwanttouseyourjobfiledirectly?nDefaultisN.Y/N:n);課程設(shè)計書課程設(shè)計書第 頁第 頁ch=getche();fprintf(fp,n%c,ch);fclose(fp);if(ch!=Y&ch!=y)inputJob();makeJobList(&jobs);if(ch=Y|ch=y)for(q=jobs-next;q;q=q-next)if(q-status=1)startAddress=allocate(&empty,q-size);if(startAddress!=-1)insertUsedNode(&used

50、,q-id,startAddress);fitMethod=selectFitMethod();break;case2:if(memoryStartAddress0|memorySizenext;q;q=q-next)if(q-status=0)switch(fitMethod)case1:order(&empty,0,0);break;case2:order(&empty,0,1);break;case3:order(&empty,1,0);break;case4:order(&empty,1,1);break;startAddress=allocate(&empty,q-size);if(

51、startAddress!=-1)insertUsedNode(&used,q-id,startAddress);updateJobStatus(&jobs,q-id,1);updateJobFile(jobs);elseshowJobList(jobs);openFile(&fp,d:result.cl,a);fprintf(fp,nPleaseinputajobidfromabove.);printf(nPleaseinputajobidfromabove.);scanf(%d,&id);fprintf(fp,%dn,id);getJobInfo(jobs,id,&size,&status

52、);switch(status)case0:printf(nOk!Thejobsstatusiscorrect!);fprintf(fp,nOk!Thejobsstatusiscorrect!);fclose(fp);break;case1:printf(nThejobwasinthememory!);fprintf(fp,nThejobwasinthememory!);fclose(fp);gotolabel;case2:printf(nThejobwasfinished!);fprintf(fp,nThejobwasfinished!);fclose(fp);gotolabel;default:printf(nUnexpectedjobstatus.Pleasecheckyoujobfile.);fprintf(fp,nUnexpectedjobstatus.Pleasecheckyoujobfile.);fclose(fp);errorMessage();switch(fitMethod)case1:order(&empty,0,0);break;case2:order(&empty,0,1);break;case3:order(&empty,1,0);break;case4:order(&empty,1,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論