內(nèi)存管理實(shí)驗(yàn)()_第1頁(yè)
內(nèi)存管理實(shí)驗(yàn)()_第2頁(yè)
內(nèi)存管理實(shí)驗(yàn)()_第3頁(yè)
內(nèi)存管理實(shí)驗(yàn)()_第4頁(yè)
內(nèi)存管理實(shí)驗(yàn)()_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

操作系統(tǒng)內(nèi)存管理1.功能介紹1-Setmemorysize(default=1024)2-Selectmemoryallocationalgorithm3-Newprocess4-Terminateaprocess5-Displaymemoryusage0-Exit2.主要數(shù)據(jù)結(jié)構(gòu)-1內(nèi)存空閑分區(qū)的描述/*描述每一個(gè)空閑塊的數(shù)據(jù)結(jié)構(gòu)*/struct

free_block_type{

intsize;

int

start_addr;

struct

free_block_type*next;};/*指向內(nèi)存中空閑塊鏈表的首指針*/struct

free_block_type*free_block;2.主要數(shù)據(jù)結(jié)構(gòu)-2描述已分配的內(nèi)存塊/*每個(gè)進(jìn)程分配到的內(nèi)存塊的描述*/struct

allocated_block{

int

pid;intsize;

int

start_addr;charprocess_name[PROCESS_NAME_LEN];

struct

allocated_block*next;};/*進(jìn)程分配內(nèi)存塊鏈表的首指針*/struct

allocated_block*allocated_block_head=NULL;2.主要數(shù)據(jù)結(jié)構(gòu)–3常量定義#definePROCESS_NAME_LEN32/*進(jìn)程名長(zhǎng)度*/#defineMIN_SLICE10/*最小碎片的大小*/#defineDEFAULT_MEM_SIZE1024/*內(nèi)存大小*/#defineDEFAULT_MEM_START0/*起始位置*//*內(nèi)存分配算法*/#defineMA_FF1#defineMA_BF2#defineMA_WF3int

mem_size=DEFAULT_MEM_SIZE;/*內(nèi)存大小*/int

ma_algorithm=MA_FF;/*當(dāng)前分配算法*/staticint

pid=0;/*初始pid*/intflag=0;/*設(shè)置內(nèi)存大小標(biāo)志*/3.主要模塊介紹main()函數(shù)main(){charchoice;pid=0;free_block=init_free_block(mem_size);//初始化空閑區(qū)while(1){display_menu(); //顯示菜單fflush(stdin);choice=getchar(); //獲取用戶輸入switch(choice){case‘1’:set_mem_size();break; //設(shè)置內(nèi)存大小case‘2’:set_algorithm();flag=1;break;//設(shè)置算法case‘3’:new_process();flag=1;break;//創(chuàng)建新進(jìn)程case‘4’:kill_process();flag=1;break;//刪除進(jìn)程case‘5’:display_mem_usage();flag=1;break; //顯示內(nèi)存使用case‘0’:do_exit();exit(0); /釋放鏈表并退出default:break;}}}init_free_block(intmem_size);/*初始化空閑塊,默認(rèn)為一塊,可以指定大小及起始地址*/structfree_block_type*init_free_block(intmem_size){structfree_block_type*fb;fb=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(fb==NULL){printf("Nomem\n");returnNULL;}fb->size=mem_size;fb->start_addr=DEFAULT_MEM_START;fb->next=NULL;returnfb;}display_menu()/*顯示菜單*/display_menu(){printf("\n");printf("1-Setmemorysize(default=%d)\n",DEFAULT_MEM_SIZE);printf("2-Selectmemoryallocationalgorithm\n");printf("3-Newprocess\n");printf("4-Terminateaprocess\n");printf("5-Displaymemoryusage\n");printf("0-Exit\n");}set_mem_size();/*設(shè)置內(nèi)存的大小*/set_mem_size(){intsize;if(flag!=0){//防止重復(fù)設(shè)置printf("Cannotsetmemorysizeagain\n");return0;}printf("Totalmemorysize=");scanf("%d",&size);if(size>0){mem_size=size;free_block->size=mem_size;}flag=1;return1;}set_algorithm()/*設(shè)置當(dāng)前的分配算法*/set_algorithm(){intalgorithm;printf("\t1-FirstFit\n");printf("\t2-BestFit\n");printf("\t3-WorstFit\n");scanf("%d",&algorithm);if(algorithm>=1&&algorithm<=3)ma_algorithm=algorithm;

//按指定算法重新排列空閑區(qū)鏈表rearrange(ma_algorithm);}rearrange(intalgorithm)/*按指定的算法整理內(nèi)存空閑塊鏈表*/rearrange(intalgorithm){switch(algorithm){caseMA_FF:rearrange_FF();break;caseMA_BF:rearrange_BF();break;caseMA_WF:rearrange_WF();break;}}/*按FF算法重新整理內(nèi)存空閑塊鏈表*/rearrange_FF(){

//請(qǐng)自行補(bǔ)充}/*按BF算法重新整理內(nèi)存空閑塊鏈表*/rearrange_BF(){

//請(qǐng)自行補(bǔ)充}/*按WF算法重新整理內(nèi)存空閑塊鏈表*/rearrange_WF(){

//請(qǐng)自行補(bǔ)充}new_process()/*創(chuàng)建新的進(jìn)程,主要是獲取內(nèi)存的申請(qǐng)數(shù)量*/new_process(){structallocated_block*ab;intsize;intret;ab=(structallocated_block*)malloc(sizeof(structallocated_block));if(!ab)exit(-5);ab->next=NULL;pid++;sprintf(ab->process_name,"PROCESS-%02d",pid);ab->pid=pid;printf("Memoryfor%s:",ab->process_name);scanf("%d",&size);if(size>0)ab->size=size;ret=allocate_mem(ab);/*從空閑區(qū)分配內(nèi)存,ret==1表示分配ok*/new_process() -cont./*如果此時(shí)allocated_block_head尚未賦值,則賦值*/if((ret==1)&&(allocated_block_head==NULL)){allocated_block_head=ab;return1;}

/*分配成功,將該已分配塊的描述插入已分配鏈表*/elseif(ret==1){ab->next=allocated_block_head;allocated_block_head=ab;return2;}elseif(ret==-1){/*分配不成功*/printf("Allocationfail\n");free(ab);return-1;}return3;}intallocate_mem(structallocated_block*ab)/*分配內(nèi)存模塊*/intallocate_mem(structallocated_block*ab){structfree_block_type*fbt,*pre;intrequest_size=ab->size;fbt=pre=free_block;

//根據(jù)當(dāng)前算法在空閑分區(qū)鏈表中搜索合適空閑分區(qū)進(jìn)行分配,分配時(shí)注意以下情況://1.找到可滿足空閑分區(qū)且分配后剩余空間足夠大,則分割//2.找到可滿足空閑分區(qū)且但分配后剩余空間比較小,則一起分配//3.找不可滿足需要的空閑分區(qū)但空閑分區(qū)之和能滿足需要,則采用內(nèi)存緊縮技術(shù),進(jìn)行空閑分區(qū)的合并,然后再分配//4.在成功分配內(nèi)存后,應(yīng)保持空閑分區(qū)按照相應(yīng)算法有序//5.分配成功則返回1,否則返回-1請(qǐng)自行補(bǔ)充。。。。。}kill_process()/*刪除進(jìn)程,歸還分配的存儲(chǔ)空間,并刪除描述該進(jìn)程內(nèi)存分配的節(jié)點(diǎn)*/kill_process(){structallocated_block*ab;intpid;printf("KillProcess,pid=");scanf("%d",&pid);ab=find_process(pid);if(ab!=NULL){free_mem(ab);/*釋放ab所表示的分配區(qū)*/dispose(ab);/*釋放ab數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)*/}}intfree_mem(structallocated_block*ab)/*將ab所表示的已分配區(qū)歸還,并進(jìn)行可能的合并*/intfree_mem(structallocated_block*ab){intalgorithm=ma_algorithm;structfree_block_type*fbt,*pre,*work;fbt=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(!fbt)return-1;//進(jìn)行可能的合并,基本策略如下//1.將新釋放的結(jié)點(diǎn)插入到空閑分區(qū)隊(duì)列末尾//2.對(duì)空閑鏈表按照地址有序排列//3.檢查并合并相鄰的空閑分區(qū)//4.將空閑鏈表重新按照當(dāng)前算法排序

請(qǐng)自行補(bǔ)充……return1;}intdispose

(structallocated_block*free_ab)/*釋放ab數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)*/intdispose(structallocated_block*free_ab){structallocated_block*pre,*ab;if(free_ab==allocated_block_head){/*如果要釋放第一個(gè)節(jié)點(diǎn)*/allocated_block_head=allocated_block_head->next;free(free_ab);return1;}pre=allocated_block_head;ab=allocated_block_head->next;while(ab!=free_ab){pre=ab;ab=ab->next;}pre->next=ab->next;free(ab);return2;}display_mem_usage()/*顯示當(dāng)前內(nèi)存的使用情況,包括空閑區(qū)的情況和已經(jīng)分配的情況*/display_mem_usage(){structfree_block_type*fbt=free_block;structallocated_block*ab=allocated_block_head;if(fbt==NULL)return(-1);printf("----------------------------------------------------------\n");

/*顯

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論