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

下載本文檔

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

文檔簡(jiǎn)介

操作系統(tǒng)實(shí)驗(yàn)報(bào)告院別:計(jì)算機(jī)學(xué)院班級(jí):學(xué)號(hào):序號(hào):姓名:劉洋實(shí)驗(yàn):內(nèi)存管理實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康耐ㄟ^本次試驗(yàn)體會(huì)操作系統(tǒng)中內(nèi)存的分配模式;掌握內(nèi)存分配的方法(FF,BF,WF);學(xué)會(huì)進(jìn)程的建立,當(dāng)一個(gè)進(jìn)程被終止時(shí)內(nèi)存是如何處理被釋放塊,并當(dāng)內(nèi)存不滿足進(jìn)程申請(qǐng)時(shí)是如何使用內(nèi)存緊湊;掌握內(nèi)存回收過程及實(shí)現(xiàn)方法;學(xué)會(huì)進(jìn)行內(nèi)存的申請(qǐng)釋放和管理;實(shí)驗(yàn)內(nèi)容附源代碼://memory.h====================================================#ifndefMEMORY_H#defineMEMORY_H#include<cstdio>#include<cstdlib>#include<malloc.h>#include<cstring>usingnamespacestd;#definePROCESS_NAME_LEN32/*進(jìn)程名長(zhǎng)度*/#defineMIN_SLICE10/*最小碎片的大小*/#defineDEFAULT_MEM_SIZE1024/*內(nèi)存大小*/#defineDEFAULT_MEM_START0/*起始位置*//*內(nèi)存分配算法*/#defineMA_FF1//首次適應(yīng)算法#defineMA_BF2//最佳適應(yīng)算法#defineMA_WF3//最壞適應(yīng)算法intmem_size;/*內(nèi)存大小*/intma_algorithm;/*當(dāng)前分配算法*/intpid;/*初始pid*/intflag;/*設(shè)置內(nèi)存大小標(biāo)志*//*描述每一個(gè)空閑塊的數(shù)據(jù)結(jié)構(gòu)*/structfree_block_type{intsize;intstart_addr;structfree_block_type*next;};/*指向內(nèi)存中空閑塊鏈表的首指針*/structfree_block_type*free_block_head;/*每個(gè)進(jìn)程分配到的內(nèi)存塊的描述*/structallocated_block{intpid;intsize;intstart_addr;charprocess_name[PROCESS_NAME_LEN];structallocated_block*next;};/*進(jìn)程分配內(nèi)存塊鏈表的首指針*/structallocated_block*allocated_block_head;/*初始化變量*/voidinit_parameter(void);/*初始化空閑塊,默認(rèn)為一塊,可以指定大小及起始地址*/structfree_block_type*init_free_block(intmem_size);/*顯示菜單*/voiddisplay_menu(void);/*設(shè)置內(nèi)存的大小*/intset_mem_size(void);/*設(shè)置當(dāng)前的分配算法*/intset_algorithm(void);voidrearrange(intalgorithm);/*按FF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_FF(void);/*按BF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_BF(void);/*按WF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_WF(void);/*創(chuàng)建新的進(jìn)程,主要是獲取內(nèi)存的申請(qǐng)數(shù)量*/intnew_process(void);/*分配內(nèi)存模塊*/intallocate_mem(structallocated_block*ab);/*緊縮內(nèi)存*/intfree_memory_rearrage(intmemory_size,intsize);/*刪除進(jìn)程,歸還分配的存儲(chǔ)空間,并刪除描述該進(jìn)程內(nèi)存分配的節(jié)點(diǎn)*/intkill_process(void);/*將ab所表示的已分配區(qū)歸還,并進(jìn)行可能的合并*/structallocated_block*find_process(intpid);intfree_mem(structallocated_block*ab);/*釋放ab數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)*/intdispose(structallocated_block*free_ab);/*顯示當(dāng)前內(nèi)存的使用情況,包括空閑區(qū)的情況和已經(jīng)分配的情況*/intdisplay_mem_usage(void);//釋放鏈表并退出voiddo_exit(void);#endif//memory_h//memory.cpp====================================================#include"memory.h"http://初始化變量voidinit_parameter(void){mem_size=DEFAULT_MEM_SIZE;ma_algorithm=MA_FF;pid=0;flag=0;free_block_head=(structfree_block_type*)malloc(sizeof(structfree_block_type));free_block_head->size=0;free_block_head->start_addr=0;free_block_head->next=NULL;allocated_block_head=NULL;}/*初始化空閑塊,默認(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){fprintf(stderr,"MemoryApplicationisFailed!\n");exit(EXIT_FAILURE);}fb->size=mem_size;fb->start_addr=DEFAULT_MEM_START;fb->next=NULL;returnfb;}/*顯示菜單*/voiddisplay_menu(void){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");}/*設(shè)置內(nèi)存的大小*/intset_mem_size(void){intsize;if(flag!=0){//防止重復(fù)設(shè)置fprintf(stderr,"Cannotsetmemorysizeagain\n");return0;}printf("Totalmemorysize=");scanf("%d",&size);if(size>0){mem_size=size;free_block_head->next->size=mem_size;}flag=1;return1;}/*設(shè)置當(dāng)前的分配算法*/intset_algorithm(void){intalgorithm;printf("\t1-FirstFit\n");printf("\t2-BestFit\n");printf("\t3-WorstFit\n");scanf("%d",&algorithm);if(algorithm>=1&&algorithm<=3)ma_algorithm=algorithm;else{printf("youchoiceiserror!\n");return0;}//按指定算法重新排列空閑區(qū)鏈表rearrange(ma_algorithm);return1;}/*按指定的算法整理內(nèi)存空閑塊鏈表*/voidrearrange(intalgorithm){switch(algorithm){caseMA_FF:rearrange_FF();break;caseMA_BF:rearrange_BF();break;caseMA_WF:rearrange_WF();break;}}/*按FF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_FF(void){structfree_block_type*pointer,*pointer1,*pointer2;pointer=free_block_head;pointer1=pointer2=pointer->next;/*使用插入法進(jìn)行排序*/while(pointer->next!=NULL){while(pointer2!=NULL){if(pointer->next->start_addr<=pointer2->start_addr){pointer1=pointer2;pointer2=pointer2->next;}else{pointer1->next=pointer2->next;pointer2->next=pointer->next;pointer->next=pointer2;break;}}pointer=pointer->next;pointer1=pointer2=pointer->next;}return1;}/*按BF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_BF(void){structfree_block_type*pointer,*pointer1,*pointer2;pointer=free_block_head;pointer1=pointer2=pointer->next;/*使用冒泡法進(jìn)行排序*/while(pointer->next!=NULL){while(pointer2!=NULL){if(pointer->next->size<=pointer2->size){pointer1=pointer2;pointer2=pointer2->next;}else{pointer1->next=pointer2->next;pointer2->next=pointer->next;pointer->next=pointer2;break;}}pointer=pointer->next;pointer1=pointer2=pointer->next;}return1;}/*按WF算法重新整理內(nèi)存空閑塊鏈表*/intrearrange_WF(void){structfree_block_type*pointer,*pointer1,*pointer2;pointer=free_block_head;pointer1=pointer2=pointer->next;/*使用冒泡法進(jìn)行排序*/while(pointer->next!=NULL){while(pointer2!=NULL){if(pointer->next->size>=pointer2->size){pointer1=pointer2;pointer2=pointer2->next;}else{pointer1->next=pointer2->next;pointer2->next=pointer->next;pointer->next=pointer2;break;}}pointer=pointer->next;pointer1=pointer2=pointer->next;}return1;}/*創(chuàng)建新的進(jìn)程,主要是獲取內(nèi)存的申請(qǐng)數(shù)量*/intnew_process(void){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>mem_size)|(size<0)){fprintf(stderr,"youmustinputcrrocetnumber!\n");exit(EXIT_FAILURE);}elseab->size=size;ret=allocate_mem(ab);/*從空閑區(qū)分配內(nèi)存,ret==1表示分配ok*//*如果此時(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;return1;}elseif(ret==-1){/*分配不成功*/printf("Allocationfail\n");free(ab);return-1;}return1;}/*分配內(nèi)存模塊*/intallocate_mem(structallocated_block*ab){structfree_block_type*fbt,*pre;intrequest_size;intmemory_count;memory_count=0;request_size=ab->size;fbt=pre=free_block_head;while((pre!=NULL)&&(request_size>pre->size)){//遍歷查找匹配空白區(qū)memory_count+=pre->size;fbt=pre;pre=pre->next;}if(!pre){if(memory_count>=request_size){free_memory_rearrage(memory_count-request_size,request_size);/*不可滿足,采用緊縮技術(shù)*/return0;}else{printf("thememoryallocatedisfailed!\n");return0;}}else{if((pre->size-request_size)>MIN_SLICE){//找到可滿足空閑分區(qū)且分配后剩余空間足夠大,則分割pre->size=pre->size-request_size;ab->start_addr=pre->start_addr+pre->size;}else{fbt->next=pre->next;//找到可滿足空閑分區(qū)且但分配后剩余空間比較小,則一起分配ab->start_addr=pre->start_addr;ab->size=pre->size;}}rearrange(ma_algorithm);//分配成功,按照相應(yīng)算法排序return1;}/*緊縮內(nèi)存*/intfree_memory_rearrage(intmemory_reduce_size,intsize){structfree_block_type*pointer1,*pointer2;structallocated_block*x1,*x2;x1=(structallocated_block*)malloc(sizeof(structallocated_block));pointer1=free_block_head->next;pointer2=pointer1->next;pointer1->start_addr=0;pointer1->size=memory_reduce_size;pointer1->next=NULL;while(pointer2!=NULL){pointer1=pointer2;pointer2=pointer2->next;free(pointer1);}x2=allocated_block_head;x1->pid=pid;x1->size=size;x1->start_addr=memory_reduce_size;sprintf(x1->process_name,"PROCESS-%02d",pid);//x2->process_name="theprocess";//x1->next=allocated_block_head->next;x1->next=allocated_block_head;//free(allocated_block_head);allocated_block_head=x1;x2=x1->next;while(x2!=NULL){x2->start_addr=x1->start_addr+x1->size;x1=x2;x2=x2->next;}return1;}/*刪除進(jìn)程,歸還分配的存儲(chǔ)空間,并刪除描述該進(jìn)程內(nèi)存分配的節(jié)點(diǎn)*/intkill_process(void){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)*/}return1;}structallocated_block*find_process(intpid){structallocated_block*pointer,*pointer1;pointer=pointer1=allocated_block_head;while(pointer1->next!=NULL){if(pointer1->pid==pid)break;else{pointer=pointer1;pointer1=pointer1->next;}}if(!pointer1){fprintf(stderr,"yourinputpidiswrong!\n");exit(EXIT_FAILURE);}returnpointer1;}/*將ab所表示的已分配區(qū)歸還,并進(jìn)行可能的合并*/intfree_mem(structallocated_block*ab){structfree_block_type*fbt,*pre,*work;pre=free_block_head;work=free_block_head->next;fbt=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(!fbt)return-1;fbt->size=ab->size;fbt->start_addr=ab->start_addr;fbt->next=NULL;rearrange(MA_FF);//按地址有序排列while((work!=NULL)&&(fbt->start_addr>work->start_addr)){pre=work;work=work->next;}if(free_block_head->next==NULL){free_block_head->next=fbt;gotoend;}//插入當(dāng)前節(jié)點(diǎn)if(!work){pre->next=fbt;if(fbt->start_addr==pre->start_addr+pre->size){pre->next=work;pre->size=pre->size+fbt->size;}}else{fbt->next=work;pre->next=fbt;//檢查并合并相鄰的空閑分區(qū)if((fbt->start_addr==pre->start_addr+pre->size)&&(fbt->start_addr+fbt->size==work->start_addr)){pre->next=work->next;pre->size=pre->size+fbt->size+work->size;}elseif(fbt->start_addr==pre->start_addr+pre->size){pre->next=work;pre->size=pre->size+fbt->size;}elseif(fbt->start_addr+fbt->size==work->start_addr){fbt->next=work->next;fbt->size=fbt->size+work->size;}}//將空閑鏈表重新按照當(dāng)前算法排序rearrange(ma_algorithm);end:return1;}/*釋放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);return1;}/*顯示當(dāng)前內(nèi)存的使用情況,包括空閑區(qū)的情況和已經(jīng)分配的情況*/intdisplay_mem_usage(void){structfree_block_type*fbt=free_block_head->next;structallocated_block*ab=allocated_block_head;if(fbt==NULL)printf("theblockisfull!\n");printf("----------------------------------------------------------\n");/*顯示空閑區(qū)*/printf("FreeMemory:\n");printf("%20s%20s\n","start_addr","size");while(fbt!=NULL){printf("%20d%20d\n",fbt->start_addr,fbt->size);fbt=fbt->next;}/*顯示已分配區(qū)*/printf("\nUsedMemory:\n");printf("%10s%20s%10s%10s\n","PID","ProcessName","start_addr","size");while(ab!=NULL){printf("%10d%20s%10d%10d\n",ab->pid,ab->process_name,ab->start_addr,ab->size);ab=ab->next;}printf("----------------------------------------------------------\n");return1;}//釋放鏈表并退出voiddo_exit(void){structfree_block_type*p1,*p2;structallocated_block

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論