


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、內(nèi)存管理實驗1. 通過本次實驗體會操作系統(tǒng)中內(nèi)存的分配模式;2. 掌握內(nèi)存分配的方法;3. 學(xué)會進程的建立,當(dāng)一個進程被終止時內(nèi)存是如何處理被釋放塊,并當(dāng)內(nèi)存不 滿足進程申請時是如何使用內(nèi)存緊湊;4. 掌握內(nèi)存回收過程及實現(xiàn)方法;5. 學(xué)會進行內(nèi)存的申請釋放和管理;6. 掌握內(nèi)存分配FF, BF,WF策略及實現(xiàn)的思路;二. 實驗內(nèi)容1.編寫程序?qū)崿F(xiàn)采用可變分區(qū)方法管理內(nèi)存。2. 在該實驗中,采用可變分區(qū)方式完成對存儲空間的管理。3. 設(shè)計用來記錄主存使用情況的數(shù)據(jù)結(jié)構(gòu):已分區(qū)表和空閑分區(qū)表或鏈表。4. 在設(shè)計好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計一個主存分配算法。5. 在設(shè)計好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計一個主存回收算法。
2、其中,若回收的分區(qū)有上鄰空 閑分區(qū)和(或)下鄰空閑分區(qū),要求合并為一個空閑分區(qū)登記在空閑分區(qū)表的一 個表項里。.三.概要設(shè)計1.功能模塊圖Mai n()Set Select Termi nate New Exit Displaymemory memory a process process memory size allocati on usagealgorithm2.各個模塊詳細的功能描述主要數(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):這個模塊是用來設(shè)置內(nèi)存大小的,從鍵盤獲取一個數(shù)字,并將它賦值給內(nèi)存 大?。蝗魶]有設(shè)置,則默認(rèn)內(nèi)存的大小為1024。(2) Set_algorithm這個模塊是用來設(shè)置分配算法的,共有三種算法:首次循環(huán)適配算法、最好 根據(jù)算法點用不同的從鍵盤輸入一種算法前的序號,最差適配算法。適配算法、.函數(shù)對內(nèi)存
4、進行分配;(3) New_process:此模塊是用來創(chuàng)建進程的。從鍵盤輸入進程號,調(diào)用fork ()創(chuàng)建進程并為其分配一定大小的內(nèi)存,若分配成功,則將其連接到已分配鏈表中,否則分配失 ?。?Kill_process:此模塊是用來殺死進程的。從鍵盤輸入一個進程號,先調(diào)用find_process () 函數(shù)進行查找,若找到,則調(diào)用 kill ()函數(shù)將其殺死并釋放內(nèi)存空間;(5)Display_mem_usage:此模塊是用來顯示內(nèi)存的使用情況的。將每個進程的內(nèi)存使用情況顯示出來, 包括起始地址和內(nèi)存大??; Do_exit:這個模塊是用來結(jié)束程序的,直接調(diào)用exit()實現(xiàn)。四.詳細設(shè)計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é)從鍵盤獲得一個進程號和為進程的分
6、配內(nèi)存大小Size是Allocate_mem(為進程分配內(nèi)存判斷是否分配成功否 是 將此進程連接到已分配內(nèi)存鏈表中結(jié)束Allocate_mem ():Fbt->size>=request_size是Fbt->size-request_size>MIN_SLICE是將內(nèi)存塊分割后分配給進將內(nèi)存塊整體分配給進結(jié) Kill_process():開 輸入一個進程Fin d_process(查找該進程是否找到是Free_mem()釋放內(nèi)存結(jié)束五.測試數(shù)據(jù)及運行結(jié)果顯示菜單:設(shè)置內(nèi)存空間大小:創(chuàng)建進程:殺死進程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è)計技巧及體會:1.調(diào)試情況a.c(agcc -c .o (文件),使用的命令是第一步:對.c文件進行編譯,生成目標(biāo)文件);是文件名a.o(aa使 用的命令是gcc -o .exe 第二步:編譯.o文件生成可執(zhí)行文件(文件),;是 文件名);是文件名第三步:運行.exe文件
8、查看結(jié)果,使用的命令是./a(a 2. 設(shè)計技巧及體會從而更進這次實驗讓我們充分了解了內(nèi)存分配的機制和管理內(nèi)存的幾種方法,雖然在這次實驗的過程中遇到了很多問一步對計算機操作系統(tǒng) 有了更深的認(rèn)識。但不太清楚計算機系統(tǒng)中是如何對內(nèi)存進行管理的,題,對內(nèi)存理解的不深刻,對內(nèi)存理解的更加透是通過這次實驗,現(xiàn)在已經(jīng)清楚地知道了內(nèi)存的管理機制, 徹。在以后的學(xué)習(xí)中能夠更好的理解操作系統(tǒng)在計算機應(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國五金制品件項目投資可行性研究分析報告
- 2025-2030年中國老板椅腳輪行業(yè)深度研究分析報告
- 2025-2030年中國羅紅霉素干混懸劑行業(yè)深度研究分析報告
- 2025-2030年中國玫瑰美白軟膜粉項目投資可行性研究分析報告
- 2025-2030年中國車載CD機芯行業(yè)深度研究分析報告
- 農(nóng)村個人承包山林合同
- 工程采購合同范本
- 橘子買賣合同
- 2025合同成立的兩個步驟
- 2025年合作共贏股份合同協(xié)議書
- 軟式內(nèi)鏡清洗消毒技術(shù)規(guī)范-WS-507-2016
- 第2課++生涯規(guī)劃+筑夢未來(課時1)【中職專用】中職思想政治《心理健康與職業(yè)生涯》高效課堂 (高教版基礎(chǔ)模塊)
- 哈工大陣列信號處理第一次作業(yè)
- 走進物理-走向統(tǒng)一的自然力(上)智慧樹知到答案2024年廣西師范大學(xué)
- 2024年全國一級注冊建筑師之建筑設(shè)計考試重點試題附答案
- 小學(xué)三年級數(shù)學(xué)兩位數(shù)乘兩位數(shù)筆算能力測驗練習(xí)題
- 打掃衛(wèi)生勞動合同范本
- 新疆伊犁哈薩克自治州2023-2024學(xué)年下學(xué)期七年級期中英語試卷
- 人教PEP六年級英語下冊Unit1Howtallareyou大單元整體教學(xué)設(shè)計
- 個體工商戶公司章程模板
- 心理發(fā)展與教育智慧樹知到期末考試答案章節(jié)答案2024年浙江師范大學(xué)
評論
0/150
提交評論