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

下載本文檔

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

文檔簡介

1、內(nèi)存管理實(shí)驗(yàn)1. 通過本次實(shí)驗(yàn)體會操作系統(tǒng)中內(nèi)存的分配模式;2. 掌握內(nèi)存分配的方法;3. 學(xué)會進(jìn)程的建立,當(dāng)一個(gè)進(jìn)程被終止時(shí)內(nèi)存是如何處理被釋放塊,并當(dāng)內(nèi)存不 滿足進(jìn)程申請時(shí)是如何使用內(nèi)存緊湊;4. 掌握內(nèi)存回收過程及實(shí)現(xiàn)方法;5. 學(xué)會進(jìn)行內(nèi)存的申請釋放和管理;6. 掌握內(nèi)存分配FF, BF,WF策略及實(shí)現(xiàn)的思路;二. 實(shí)驗(yàn)內(nèi)容1.編寫程序?qū)崿F(xiàn)采用可變分區(qū)方法管理內(nèi)存。2. 在該實(shí)驗(yàn)中,采用可變分區(qū)方式完成對存儲空間的管理。3. 設(shè)計(jì)用來記錄主存使用情況的數(shù)據(jù)結(jié)構(gòu):已分區(qū)表和空閑分區(qū)表或鏈表。4. 在設(shè)計(jì)好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計(jì)一個(gè)主存分配算法。5. 在設(shè)計(jì)好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計(jì)一個(gè)主存回收算法。

2、其中,若回收的分區(qū)有上鄰空 閑分區(qū)和(或)下鄰空閑分區(qū),要求合并為一個(gè)空閑分區(qū)登記在空閑分區(qū)表的一 個(gè)表項(xiàng)里。.三.概要設(shè)計(jì)1.功能模塊圖Mai n()Set Select Termi nate New Exit Displaymemory memory a process process memory size allocati on usagealgorithm2.各個(gè)模塊詳細(xì)的功能描述主要數(shù)據(jù)結(jié)構(gòu):struct free_block_type /空閑塊int size;int start_addr;struct free_block_type *n ext;;struct allocat

3、ed_block /已分配的內(nèi)存塊int pid;int size;int start_addr;char process_ namePROCESS_NAME_LEN;struct allocated_block *n ext; ;(1) Set memory size (default=1024):這個(gè)模塊是用來設(shè)置內(nèi)存大小的,從鍵盤獲取一個(gè)數(shù)字,并將它賦值給內(nèi)存 大?。蝗魶]有設(shè)置,則默認(rèn)內(nèi)存的大小為1024。(2) Set_algorithm這個(gè)模塊是用來設(shè)置分配算法的,共有三種算法:首次循環(huán)適配算法、最好 根據(jù)算法點(diǎn)用不同的從鍵盤輸入一種算法前的序號,最差適配算法。適配算法、.函數(shù)對內(nèi)存

4、進(jìn)行分配;(3) New_process:此模塊是用來創(chuàng)建進(jìn)程的。從鍵盤輸入進(jìn)程號,調(diào)用fork ()創(chuàng)建進(jìn)程并為其分配一定大小的內(nèi)存,若分配成功,則將其連接到已分配鏈表中,否則分配失 敗; Kill_process:此模塊是用來殺死進(jìn)程的。從鍵盤輸入一個(gè)進(jìn)程號,先調(diào)用find_process () 函數(shù)進(jìn)行查找,若找到,則調(diào)用 kill ()函數(shù)將其殺死并釋放內(nèi)存空間;(5)Display_mem_usage:此模塊是用來顯示內(nèi)存的使用情況的。將每個(gè)進(jìn)程的內(nèi)存使用情況顯示出來, 包括起始地址和內(nèi)存大?。?Do_exit:這個(gè)模塊是用來結(jié)束程序的,直接調(diào)用exit()實(shí)現(xiàn)。四.詳細(xì)設(shè)計(jì)1 功能

5、函數(shù)的調(diào)用關(guān)系圖Set_mem_size()Rearra nge_FF()Rearra nge_BF() Set_algorithm()Rearra nge_WF()Mai n()Allocate_mem()New_process()Free_mem()Kill_process()Display_mem_usage()exit() Do_exit()2 各功能函數(shù)流程圖開Set_algorithm():從鍵盤輸入算法序Switch()MA_FFMA_BFMA_WFRearra nge_Rearra nge_WRearra nge_BNew_process():結(jié)從鍵盤獲得一個(gè)進(jìn)程號和為進(jìn)程的分

6、配內(nèi)存大小Size是Allocate_mem(為進(jìn)程分配內(nèi)存判斷是否分配成功否 是 將此進(jìn)程連接到已分配內(nèi)存鏈表中結(jié)束Allocate_mem ():Fbt->size>=request_size是Fbt->size-request_size>MIN_SLICE是將內(nèi)存塊分割后分配給進(jìn)將內(nèi)存塊整體分配給進(jìn)結(jié) Kill_process():開 輸入一個(gè)進(jìn)程Fin d_process(查找該進(jìn)程是否找到是Free_mem()釋放內(nèi)存結(jié)束五.測試數(shù)據(jù)及運(yùn)行結(jié)果顯示菜單:設(shè)置內(nèi)存空間大小:創(chuàng)建進(jìn)程:殺死進(jìn)程1:選擇內(nèi)存分配算法菜單:首次適應(yīng)法:1- Set nenory &am

7、p;ize(defa嘰2- Select memory allocation algorithm3- New process4- Terninate a process5- Display menorj/ usage O-ExttsizeFree Hemory;start_addr670sed Memory:II六.調(diào)試情況設(shè)計(jì)技巧及體會:1.調(diào)試情況a.c(agcc -c .o (文件),使用的命令是第一步:對.c文件進(jìn)行編譯,生成目標(biāo)文件);是文件名a.o(aa使 用的命令是gcc -o .exe 第二步:編譯.o文件生成可執(zhí)行文件(文件),;是 文件名);是文件名第三步:運(yùn)行.exe文件

8、查看結(jié)果,使用的命令是./a(a 2. 設(shè)計(jì)技巧及體會從而更進(jìn)這次實(shí)驗(yàn)讓我們充分了解了內(nèi)存分配的機(jī)制和管理內(nèi)存的幾種方法,雖然在這次實(shí)驗(yàn)的過程中遇到了很多問一步對計(jì)算機(jī)操作系統(tǒng) 有了更深的認(rèn)識。但不太清楚計(jì)算機(jī)系統(tǒng)中是如何對內(nèi)存進(jìn)行管理的,題,對內(nèi)存理解的不深刻,對內(nèi)存理解的更加透是通過這次實(shí)驗(yàn),現(xiàn)在已經(jīng)清楚地知道了內(nèi)存的管理機(jī)制, 徹。在以后的學(xué)習(xí)中能夠更好的理解操作系統(tǒng)在計(jì)算機(jī)應(yīng)用 中起到的作用。七源代碼#include<stdio.h>#include<stdlib.h>#define PROCESS_NAME_LEN 32#define MIN_SLICE 10

9、#define DEFAULT_MEM_SIZE 1024#define DEFAULT_MEM_START 0#define MA_FF 1#define MA_BF 2#define MA_WF 3int mem_size=DEFAULT_MEM_SIZE;int ma_algorithm=MA_FF;static int pid=0;int flag=0;void display_menu(void);struct free_block_type *init_free_block(int mem_size); int set_mem_size();void set_algorithm()

10、;void rearrange(int algorithm);void rearrange_FF();void rearrange_BF();void rearrange_WF();void swap(int *a,int *b);int new_process();int display_mem_usage();void do_exit();void kill_process();int display_mem_usage();struct allocated_block * find_process(int pid);struct free_block_typeint size;int s

11、tart_addr;struct free_block_type *next;struct allocated_blockint pid;int size;int start_addr;char process_namePROCESS_NAME_LEN;struct allocated_block *next;struct free_block_type * free_block;struct allocated_block * allocated_block_head=NULL;int main(void)char choice;pid=0;free_block=init_free_bloc

12、k(mem_size);for(;)display_menu();/ fflush(stdin);choice=getchar();/ getchar();switch(choice)case '1':set_mem_size();break;case '2':set_algorithm();flag=1;break;case '3':new_process();flag=1;break;case '4':kill_process();flag=1;break;case '5':display_mem_usage(

13、);flag=1;break;case '0':do_exit();exit(0);default:break;return 0; struct free_block_type * init_free_block(int mem_size)struct free_block_type *fb;fb=(struct free_block_type *)malloc(sizeof(struct free_block_type); if(fb=NULL)printf(No memn);return NULL; fb->size=mem_size; fb->start_ad

14、dr=DEFAULT_MEM_START; fb->next=NULL;return fb;int set_mem_size()int size;if(flag!=0)printf(Cannot set memory size againn);return 0; printf(Total memory size=); scanf(%d,&size);if(size>0)mem_size=size; free_block->size=mem_size;flag=1;return 1;void set_algorithm()int algorithm;printf(1-F

15、irst Fitn);printf(2-Best Fitn);printf(3-Worst Fitn);scanf(%d,&algorithm); if(algorithm>=1 && algorithm<=3)ma_algorithm=algorithm; rearrange(ma_algorithm);void rearrange(int algorithm)switch(algorithm)case MA_FF:rearrange_FF();break;case MA_BF:rearrange_BF();break;case MA_WF:rearran

16、ge_WF();break;void rearrange_FF()struct free_block_type *tmp,*work; printf(Rearrange free blocks for FFn); tmp=free_block;while(tmp!=NULL)work=tmp->next;while(work!=NULL) if(work->start_addr<tmp->start_addr)swap(&work->start_addr,&tmp->start_addr); swap(&work->size,&

17、amp;tmp->size);elsework=work->next;tmp=tmp->next;void rearrange_BF()struct free_block_type *tmp,*work; printf(Rearrange free blocks for BFn); tmp=free_block;printf(%d,%dn,tmp->start_addr,tmp->size); while(tmp!=NULL)work=tmp->next; while(work!=NULL) if(work->size<tmp->size)

18、swap(&work->start_addr,&tmp->start_addr); swap(&work->size,&tmp->size);printf(start_addr:%d,size:%dn,work->start_addr,work->size);else work=work->next; tmp=tmp->next;void rearrange_WF()struct free_block_type *tmp,*work; printf(Rearrange free blocks for FFn); t

19、mp=free_block; printf(%d,%dn,tmp->start_addr,tmp->size); while(tmp!=NULL)work=tmp->next; while(work!=NULL) if(work->size>tmp->size) swap(&work->start_addr,&tmp->start_addr); swap(&work->size,&tmp->size);printf(start_addr:%d,size:%dn,work->start_addr,w

20、ork->size); else work=work->next;tmp=tmp->next;void swap(int *a,int *b)int temp;temp=*a;*a=*b;*b=temp;int new_process()struct allocated_block *ab;int size;int ret;ab=(struct allocated_block *)malloc(sizeof(struct allocated_block); if(!ab)exit(-5);ab->next=NULL;pid+;sprintf(ab->process

21、_name,PROCESS-d,pid); ab->pid=pid;printf(Memory for %s:,ab->process_name); scanf(%d,&size);if(size>0)ab->size=size;ret=allocate_mem(ab);if(ret=1) &&(allocated_block_head=NULL)allocated_block_head=ab;return 1;else if(ret=1)ab->next=allocated_block_head; allocated_block_head

22、=ab;return 2;else if(ret=-1)printf(printf(Allocation failn);free(ab);return -1;return -3;int allocate_mem(struct allocated_block *ab)struct free_block_type *fbt,*pre;int request_size=ab->size;fbt=pre=free_block;while(fbt!=NULL)if(fbt->size>=request_size)if(fbt->size-request_size>MIN_S

23、LICE)fbt->size=fbt->size-request_size;/ ab->size=request_size;ab->start_addr=fbt->start_addr; fbt->start_addr=fbt->start_addr+request_size;printf(%d, %dn,ab->start_addr,ab->size);return 1;else/ pre->next=fbt->next;ab->size=fbt->size;ab->start_addr=fbt->st

24、art_addr;if(fbt=free_block)free_block=fbt->next;free(fbt);elsepre->next=fbt->next;free(fbt);printf(%d,%dn,ab->start_addr,ab->size);return 1;elsepre=fbt;fbt=fbt->next; return -1;void kill_process()struct allocated_block *ab;int pid;printf(Kill Process,pid=); scanf(%d,&pid);ab=fi

25、nd_process(pid); if(ab!=NULL)free_mem(ab); dispose(ab);int free_mem(struct allocated_block *ab)int algorithm=ma_algorithm;struct free_block_type *fbt,*pre,*work;fbt=(struct free_block_type *)malloc(sizeof(struct free_block_type); if(!fbt) return -1;fbt->size=ab->size; fbt->start_addr=ab->

26、;start_addr;fbt->next=free_block; free_block=fbt;rearrange(MA_FF); fbt=free_block;while(fbt!=NULL)work=fbt->next;if(work!=NULL)if(fbt->start_addr+fbt->size=work->start_addr) fbt->size=fbt->size+work->size;fbt->next=work->next;free(work);continue;fbt=fbt->next;rearran

27、ge(algorithm);/return 1;int dispose(struct allocated_block * free_ab)struct allocated_block *pre,*ab; if(free_ab=allocated_block_head)allocated_block_head=allocated_block_head->next; free(free_ab);return 1;pre=allocated_block_head; ab=allocated_block_head->next; while(ab!=free_ab)pre=ab; ab=ab->next; pre->next=ab->next; free(ab); return 2;int display_mem_usage()struct free_block_ty

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論