内存管理实验Word文档格式.docx
《内存管理实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《内存管理实验Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
2.内存申请
3.内存申请失败
4.内存释放
5.内存紧缩前
6.内存紧缩后
五.源代码
#include<
stdio.h>
stdlib.h>
string.h>
#include<
sys/types.h>
unistd.h>
ctype.h>
pthread.h>
fcntl.h>
dirent.h>
semaphore.h>
#definePROCESS_NAME_LEN32/*杩涚▼鍚嶉暱搴?
/
#defineMIN_SLICE10/*鏈€灏忕鐗囩殑澶蟀?
*/
#defineDEFAULT_MEM_SIZE1024/*鍐呭瓨澶蟀?
#defineDEFAULT_MEM_START0/*璧峰浣嶇疆*/
/*鍐呭瓨鍒嗛厤绠楁硶*/
#defineMA_FF1
#defineMA_BF2
#defineMA_WF3
structfree_block_type*init_free_block(intmem_size);
intmem_size=DEFAULT_MEM_SIZE;
/*鍐呭瓨澶蟀?
1024*/
intma_algorithm=MA_FF;
/*褰撳墠鍒嗛厤绠楁硶*/
staticintpid=0;
/*鍒濆pid*/
intflag=0;
//闃叉閲嶅璁剧疆,1璁剧疆杩囷紝0鏈缃繃
/*鎻忚堪姣忎竴涓┖闂插潡鐨勬暟鎹粨鏋?
structfree_block_type{
intsize;
//澶蟀?
intstart_addr;
//璧峰鍦板潃
structfree_block_type*next;
};
/*鎸囧悜鍐呭瓨涓┖闂插潡閾捐〃鐨勯鎸囬拡*/
structfree_block_type*free_block;
/*姣忎釜杩涚▼鍒嗛厤鍒扮殑鍐呭瓨鍧楃殑鎻忚堪*/
structallocated_block{
intpid;
//杩涚▼PID
//杩涚▼鑾峰緱鍐呭瓨澶蟀?
//杩涚▼鐨勮捣濮嬪湴鍧€
charprocess_name[PROCESS_NAME_LEN];
//杩涚▼鐨勫悕绉?
structallocated_block*next;
};
/*杩涚▼鍒嗛厤鍐呭瓨鍧楅摼琛ㄧ殑棣栨寚閽?
structallocated_block*allocated_block_head=NULL;
intmain(){
charchoice[6];
pid=0;
free_block=init_free_block(mem_size);
//鍒濆鍖栫┖闂插偉灏忛粯璁傗负1024锛岃騂free_block鎸囧悜鍐呭瓨煱皴┖闂潎潡鑷漮乂鐨勯鶢鎸囬奼
while
(1){//泿幆鎵ö
display_menu();
//鏄剧ず鑿滃崟
fflush(stdin);
scanf("
%s"
choice);
//鑾峰彇鐢ㄦ埛杈撳叆
switch(choice[0]){
case'
1'
:
set_mem_size();
break;
//璁剧疆鍐呭瓨澶蟀?
2'
set_algorithm();
flag=1;
//璁剧疆绠楁硶
3'
new_process();
//鍒涘缓鏂拌繘绋?
4'
kill_process();
//鍒犻櫎杩涚▼
5'
display_mem_usage();
//鏄剧ず鍐呭瓨浣跨敤
0'
//do_exit();
exit(0);
//閲婃斁閾捐〃骞堕€€鍑?
default:
}
}
}
/*鍒濆鍖栫┖闂插潡锛岄粯璁や负涓€鍧楋紝鍙互鎸囧畾澶蟀忓強璧峰鍦板潃*/
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;
//璁剧疆鍒濆鍐呭瓨澶蟀忎?
?
024
start_addr=DEFAULT_MEM_START;
//璁剧疆鍐呭瓨璧峰鍦板潃涓?
next=NULL;
returnfb;
//杩斿洖褰撳墠鐢宠鍐呭瓨杩斿洖鐨勬寚閽?
/*鏄剧偢鑧滃浘*/
display_menu(){
\n"
1-Setmemorysize(default=%d)\n"
DEFAULT_MEM_SIZE);
//璁剧醖鍐呭瓨怸樿縂蟀忎?
2-Selectmemoryallocationalgorithm\n"
////璁剧疆绠楁硶
3-Newprocess\n"
4-Terminateaprocess\n"
5-Displaymemoryusage\n"
//鏄剧偢鍐呭瓨煰屪敤
0-Exit\n"
/*璁剧醖鍐呭瓨鐨勫偉灏?
intset_mem_size(){
if(flag!
=0){//鑺嵆駹墈嶅鴵璁剧醖
Cannotsetmemorysizeagain\n"
return0;
Totalmemorysize="
%d"
&
size);
//鐢ㄦ埛涔熷彲浠儓嚜泜辫騗缃騽竴煱饏唴鄆姃偉灏?
if(size>
0){
mem_size=size;
free_block->
//鐢ㄦ埛泜茬忡璁剧醖杩囧唴鄆姃偉灏忕殑鏍囧怐
return1;
/*璁剧醖褰撳墠鐨勫垎閰浲畻決?
set_algorithm(){
intalgorithm;
\t1-FirstFit\n"
\t2-BestFit\n"
\t3-WorstFit\n"
algorithm);
if(algorithm>
=1&
&
algorithm<
=3)
ma_algorithm=algorithm;
//鎸鸁寚瀹氱畻決曢撚鏂斉帓鍒楃┖闂潎尯鑷漮乂锛岄敊璇蜴緭鍏儐寜怸樿绠楁硶
rearrange(ma_algorithm);
/*鎸夋寚瀹氱殑绠楁硶鏁寸悊鍐呭瓨绌洪棽鍧楅摼琛?
rearrange(intalgorithm){
switch(algorithm){
caseMA_FF:
rearrange_FF();
caseMA_BF:
rearrange_BF();
caseMA_WF:
rearrange_WF();
/*鎸塅F绠楁硶閲嶆柊鏁寸悊鍐呭瓨绌洪棽鍧楅摼琛?
rearrange_FF(){//鎸夊湴鍧€鍦伴€掑閾炬帴
structfree_block_type*p0,*p1;
for(p0=free_block;
p0!
=NULL;
p0=p0->
next)
for(p1=p0->
next;
p1!
p1=p1->
next){
if(p0->
start_addr>
p1->
start_addr){//浜備崲
size=p1->
size;
start_addr=p1->
start_addr;
size=p0->
start_addr=p0->
p0->
size=size;
start_addr=start_addr;
/*鎸暬F绠楁硶墈嶆旳鏁悺鍐呭瓨绌峖棽鍧楅摼琛?
rearrange_BF(){//鎸氳閲忎粠灏忓埌澶魩掑?
size>
size){//浜備崲
/*鎸塛F绠楁硶墈嶆旳鏁悺鍐呭瓨绌峖棽鍧楅摼琛?
rearrange_WF(){//鎸氳閲忎粠澶髨板皬鎺掑?
size<
/*鍒涘缓鏂暞殑杩涚仴锛屼晉嚓佹槸鑥曯彇鍐呭瓨鐨勭揋璇锋暟墈?
intnew_process(){
structallocated_block*ab;
intret;
ab=(structallocated_block*)malloc(sizeof(structallocated_block));
if(!
ab)
exit(-5);
ab->
pid++;
sprintf(ab->
process_name,"
PROCESS-%02d"
pid);
//鎶婃牸椌忓寲鐨勬暟鑀騾孾鍏儐鸚煱瓧绗︿覆涓?
pid=pid;
Memoryfor%s:
"
ab->
process_name);
0)
//璁剧疆杩涚▼鍒嗛厤鐨勫唴瀛樺ぇ灏?
ret=allocate_mem(ab);
/*浠庣┖闂插尯鍒嗛厤鍐呭瓨锛宺et==1琛ㄧず鍒嗛厤ok*/
/*濡傛灉姝ゆ椂allocated_block_head灏氭湭璧嬪€硷紝鍒欒祴鍊?
if((ret==1)&
(allocated_block_head==NULL)){
allocated_block_head=ab;
/*鍒嗛厤鎴愬姛锛屽皢璇ュ凡鍒嗛厤鍧楃殑鎻忚堪鎻掑叆宸插垎閰嶉摼琛?
elseif(ret==1){//澶存彃娉?
next=allocated_block_head;
return2;
elseif(ret==-1){/*鍒嗛厤涓嶆垚鍔?
Allocationfail\n"
free(ab);
//閲婃斁鍐呭瓨
return-1;
return3;
/*鍒嗛厤鍐呭瓨妯″潡*/
intallocate_mem(structallocated_block*ab){
structfree_block_type*fbt,*pre;
intrequest_size=ab->
intsizesum=0;
//璁$畻鐜版湁鍐呭瓨涔嬪拰
intret=-1;
fbt=pre=free_block;
//绌洪棽閾炬寚閽?
//鏍规嵁褰撳墠绠楁硶鍦ㄧ┖闂插垎鍖洪摼琛ㄤ腑鎼滅储鍚堥€傜┖闂插垎鍖鸿繘琛屽垎閰嶏紝鍒嗛厤鏃舵敞鎰忎互涓嬫儏鍐碉細
//1.鎵惧埌鍙弧瓒崇┖闂插垎鍖轰笖鍒嗛厤鍚庡墿浣欑┖闂磋冻澶熷偉锛屽垯鍒嗗夡
//2.鎵湝埌鍙蜾屖瓒悞┖闂潎垎鐺轰笖煰嗗垎閰嶅湤鍓╀綑绌峖棿姣旇鉮灏忥紝鍒欎竴帏曯垎閰?
//3.鎵嬪笉鍙弧瓒抽渶瑕佺殑绌洪棽鍒嗗尯浣嗙┖闂插垎鍖轰箣鍜岃兘婊¤
冻闇€瑕侊紝鍒欓噰鐢ㄥ唴瀛樼揣缂╂妧鏈紝杩涜绌洪棽鍒嗗尯鐨勫悎骞讹紝鐒跺悗鍐嶅垎閰?
//4.鍦ㄦ垚鍔熷垎閰嶅唴瀛樺悗锛屽簲淇濇寔绌洪棽鍒嗗尯鎸夌収鐩稿簲绠楁硶鏈夊簭
//5.鍒嗛厤鎴愬姛鍒欒繑鍥?
锛屽惁鍒欒繑鍥?
1
while(pre!
=NULL){
if(pre->
size>
request_size&
(pre->
size-request_size)>
=MIN_SLICE){//1.鎵惧埌鍙弧瓒崇┖闂插垎鍖轰笖鍒嗛厤鍚庡墿浣欑┖闂磋冻澶熷偉锛屽垯鍒嗗夡
start_addr=pre->
//璁剧醖杩涚仴帏曯鍦板潃
pre->
size-=request_size;
//鏀瑰彉鍒嗗壊鍚庡ぇ灏?
start_addr+=request_size;
//鏀瑰彉鍒嗗壊鍚庤捣濮嬪湴鍧€
ret=1;
//鍒嗛厤鎴愬姛鏍囧織
elseif(pre->
=request_size&
size-request_size)<
MIN_SLICE){//2.鎵惧埌鍙弧瓒崇┖闂插垎鍖轰笖浣嗗垎閰嶅悗鍓╀綑绌洪棿姣旇緝灏忥紝鍒欎竴璧峰垎閰?
size=pre->
//閲嶆柊璁剧疆杩涚▼鍒嗛厤鐨勫唴瀛樺偉灏?
fbt->
next=pre->
if(pre==free_block&
free_block->
next==NULL){
start_addr=0;
size=0;
else
free(pre);
sizesum+=pre->
fbt=pre;
pre=pre->
if((-1)==ret&
sizesum>
=request_size){//鎬濇兂锛氬皢鐜版湁杩涚▼鐨勮捣濮嬪湴鍧€浠庯紣寮€濮嬩緷娆℃敼鍙?
//銆€鏈€鍚庡皢绌洪棽杩炵殑璧峰鍦板潃鏀瑰彉锛屽ぇ灏忓彉涓哄墿浣欏唴瀛樺ぇ灏忎箣鍜?
structallocated_block*pal;
structfree_block_type*p,*q;
intaddr=0;
//璁板綍褰撳墠鍒嗛厤鍐呭瓨鐨勮捣濮嬪湴鍧€
pal=allocated_block_head;
while(pal!
=NULL)
{
pal->
start_addr=addr;
addr=pal->
start_addr+pal->
pal=pal->
//閲婃斁褰撳墠绌洪棽鍧楃殑
q=free_block->
while(q!
next=q->
free(q);
if(NULL==free_block->
size=sizesum;
if(free_block->
size-request_size>
=MIN_SLICE){
start_addr=free_block->
//璁剧疆杩涚▼璧峰鍦板潃
else{
size=free_block->
if(ma_algorithm==MA_FF)
elseif(ma_algorithm==MA_BF)
returnret;
/*鏌儓pid瀵瑰簲鐨勭粨鐐?
structallocated_block*find_process(intpid){
structallocated_block*p,*q=NULL;
for(p=allocated_block_head;
p!
p=p->
if(pid==p->
pid)
q=p;
returnq;
/*鍒犻櫎杩涚▼锛屽綊杩樺垎閰嶇殑瀛樺偍绌洪棿锛屽苟鍒犻櫎鎻忚堪璇ヨ繘绋嬪唴瀛樺垎閰嶇殑鑺傜偣*/
kill_process(){
KillProcess,pid="
//杈撳叆鎵€瑕佸垹闄よ繘绋嬬殑pid
pid);
ab=find_process(pid);
if(ab!
free_mem(ab);
/*閲婃斁ab鎵€琛ㄧ偢鐨勫垎閰嶅尯*/
dispose(ab);
/*墈婃斁ab鏁斉嵁缁撴瀯鑺傜偣*/
璇儓繘绋沴搴旂殑杩涚▼鍙蜂笉瀛樺湪\n"
/*灏哸b鎵€琛ㄧ偢鐨勫杴鍒嗛厤鐺欪綊杩烎紝骞懩繘琛屽彲鑳奅殑鍚毮鋺*/
intfree_mem(structallocated_block*ab){
intalgorithm=ma_algorithm;
//褰撳墠鍒嗛厤绠楁硶鍊间负1锛?
锛?
structfree_block_type*fbt,*pre,*work;
fbt=(structfree_block_type*)malloc(sizeof(structfree_block_type));
fbt)
size=ab->
next=NULL;
start_addr=ab->
//杩摾鲫鍙蜴兘鐨勫悎骞讹紝鍩烘湰绛瀬暐擥旛笅
//1.灏嗘旳墈婃斁鐨勭忤鑐规彃鍏儏埌绌峖棽鍒嗗尯鑺熷毟鑉疸鄴
if(free_block==fbt)//缁忚銄圉冭瘯鍙戠涶擥傛灉鍐呭瓨鍒嗛厤瀹屽湤杩摾鲫鍐呭瓨鍥炴敹鑆懬秒消alloc钼芩豥麴酓詖胹眷珍铌€涓巉ree_block鍦板潃鐩稿悓
free_block=fbt;
pre=free_block;