内存管理实验文档格式.docx

上传人:聆听****声音 文档编号:474250 上传时间:2023-04-29 格式:DOCX 页数:18 大小:174.87KB
下载 相关 举报
内存管理实验文档格式.docx_第1页
第1页 / 共18页
内存管理实验文档格式.docx_第2页
第2页 / 共18页
内存管理实验文档格式.docx_第3页
第3页 / 共18页
内存管理实验文档格式.docx_第4页
第4页 / 共18页
内存管理实验文档格式.docx_第5页
第5页 / 共18页
内存管理实验文档格式.docx_第6页
第6页 / 共18页
内存管理实验文档格式.docx_第7页
第7页 / 共18页
内存管理实验文档格式.docx_第8页
第8页 / 共18页
内存管理实验文档格式.docx_第9页
第9页 / 共18页
内存管理实验文档格式.docx_第10页
第10页 / 共18页
内存管理实验文档格式.docx_第11页
第11页 / 共18页
内存管理实验文档格式.docx_第12页
第12页 / 共18页
内存管理实验文档格式.docx_第13页
第13页 / 共18页
内存管理实验文档格式.docx_第14页
第14页 / 共18页
内存管理实验文档格式.docx_第15页
第15页 / 共18页
内存管理实验文档格式.docx_第16页
第16页 / 共18页
内存管理实验文档格式.docx_第17页
第17页 / 共18页
内存管理实验文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

内存管理实验文档格式.docx

《内存管理实验文档格式.docx》由会员分享,可在线阅读,更多相关《内存管理实验文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

内存管理实验文档格式.docx

charprocess_name[PROCESS_NAME_LEN];

structallocated_block*next;

(1)Setmemorysize(default=1024):

这个模块是用来设置内存大小的,从键盘获取一个数字,并将它赋值给内存大小;

若没有设置,则默认内存的大小为1024。

(2)Set_algorithm:

这个模块是用来设置分配算法的,共有三种算法:

首次循环适配算法、最好适配算法、最差适配算法。

从键盘输入一种算法前的序号,根据算法点用不同的函数对内存进行分配;

(3)New_process:

此模块是用来创建进程的。

从键盘输入进程号,调用fork()创建进程并为其分配一定大小的内存,若分配成功,则将其连接到已分配链表中,否则分配失败;

(4)Kill_process:

此模块是用来杀死进程的。

从键盘输入一个进程号,先调用find_process()函数进行查找,若找到,则调用kill()函数将其杀死并释放内存空间;

(5)Display_mem_usage:

此模块是用来显示内存的使用情况的。

将每个进程的内存使用情况显示出来,包括起始地址和内存大小;

(6)Do_exit:

这个模块是用来结束程序的,直接调用exit()实现。

四.详细设计

1.功能函数的调用关系图

Set_mem_size()

Rearrange_FF()

Set_algorithm()

Rearrange_BF()

Rearrange_WF()

New_process()

Allocate_mem()

Kill_process()

Free_mem()

Display_mem_usage()

Do_exit()

exit()

2.各功能函数流程图

Set_algorithm():



开始

显示算法选择菜单

从键盘输入算法序号

Switch()

MA_FF MA_BF MA_WF

Rearrange_F Rearrange_B Rearrange_WF

从键盘获得一个进程号和为进程的分配的

内存大小

Size>

0?

Allocate_mem()为进程分配内存

判断是否分配成功

将此进程连接到已分配内存链表中

结束

New_process():

Fbt->

size>

=request_size

size-request_size>

M

IN_SLICE

将内存块分割后分配给进程

将内存块整体分配给进程

Allocate_mem():

Kill_process():

输入一个进程号

Find_process()查找该进程

是否找到?

Free_mem()释放内存

五.测试数据及运行结果

显示菜单:

设置内存空间大小:

创建进程:

杀死进程1:

选择内存分配算法菜单:

首次适应法:

六.调试情况设计技巧及体会

1.调试情况:

第一步:

对.c文件进行编译,生成目标文件(.o文件),使用的命令是gcc-ca.c(a

是文件名);

第二步:

编译.o文件生成可执行文件(.exe文件),使用的命令是gcc-oaa.o(a

第三步:

运行.exe文件查看结果,使用的命令是./a(a是文件名);

2.设计技巧及体会

这次实验让我们充分了解了内存分配的机制和管理内存的几种方法,从而更进一步对计算机操作系统有了更深的认识。

虽然在这次实验的过程中遇到了很多问题,对内存理解的不深刻,不太清楚计算机系统中是如何对内存进行管理的,但是通过这次实验,现在已经清楚地知道了内存的管理机制,对内存理解的更加透彻。

在以后的学习中能够更好的理解操作系统在计算机应用中起到的作用。

七.源代码

#include<

stdio.h>

#include<

stdlib.h>

#definePROCESS_NAME_LEN32#defineMIN_SLICE10

#defineDEFAULT_MEM_SIZE1024

#defineDEFAULT_MEM_START0

#defineMA_FF1#defineMA_BF2#defineMA_WF3

intmem_size=DEFAULT_MEM_SIZE;

intma_algorithm=MA_FF;

staticintpid=0;

intflag=0;

voiddisplay_menu(void);

structfree_block_type*init_free_block(intmem_size);

intset_mem_size();

voidset_algorithm();

voidrearrange(intalgorithm);

voidrearrange_FF();

voidrearrange_BF();

voidrearrange_WF();

voidswap(int*a,int*b);

intnew_process();

intdisplay_mem_usage();

voiddo_exit();

voidkill_process();

structallocated_block*find_process(intpid);

structfree_block_type

intsize;

structallocated_block

structfree_block_type*free_block;

structallocated_block*allocated_block_head=NULL;

intmain(void)

charchoice;

pid=0;

free_block=init_free_block(mem_size);

for(;

;

display_menu();

// fflush(stdin);

choice=getchar();

// getchar();

switch(choice)

case'

1'

:

set_mem_size();

break;

case'

2'

set_algorithm();

flag=1;

case'

3'

new_process();

4'

kill_process();

5'

display_mem_usage();

0'

do_exit();

exit(0);

default:

}

return0;

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;

start_addr=DEFAULT_MEM_START;

fb->

next=NULL;

returnfb;

intset_mem_size()

if(flag!

=0)

Cannotsetmemorysizeagain\n"

return0;

Totalmemorysize="

scanf("

%d"

&

size);

if(size>

0)

mem_size=size;

free_block->

return1;

voidset_algorithm()

intalgorithm;

\t1-FirstFit\n"

printf("

\t2-BestFit\n"

\t3-WorstFit\n"

algorithm);

if(algorithm>

=1&

&

algorithm<

=3)

ma_algorithm=algorithm;

rearrange(ma_algorithm);

voidrearrange(intalgorithm)

switch(algorithm)

caseMA_FF:

rearrange_FF();

caseMA_BF:

rearrange_BF();

caseMA_WF:

rearrange_WF();

voidrearrange_FF()

structfree_block_type*tmp,*work;

RearrangefreeblocksforFF\n"

tmp=free_block;

while(tmp!

=NULL)

work=tmp->

next;

while(work!

if(work->

start_addr<

tmp->

start_addr)

swap(&

work->

start_addr,&

start_addr);

swap(&

size,&

else

work=work->

tmp=tmp->

voidrearrange_BF()

printf("

RearrangefreeblocksforBF\n"

tmp=free_block;

%d,%d\n"

tmp->

start_addr,tmp->

while(tmp!

{

work=tmp->

while(work!

{

if(work->

size<

size)

{

swap(&

printf("

start_addr:

%d,size:

%d\n"

work->

start_addr,work->

}

else

work=work->

}

tmp=tmp->

}

voidrearrange_WF()

voidswap(int*a,int*b)

inttemp;

temp=*a;

*a=*b;

*b=temp;

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);

size=size;

ret=allocate_mem(ab);

if((ret==1)&

(allocated_block_head==NULL))

allocated_block_head=ab;

elseif(ret==1)

next=allocated_block_head;

allocated_block_head=ab;

return2;

elseif(ret==-1)

printf(Allocationfail\n)"

free(ab);

return-1;

return-3;

intallocate_mem(structallocated_block*ab)

structfree_block_type*fbt,*pre;

intrequest_size=ab->

size;

fbt=pre=free_block;

while(fbt!

if(fbt->

=request_size)

MIN_SLICE)

fbt->

size=fbt->

size-request_size;

//ab->

size=request_size;

start_addr=fbt->

start_addr;

start_addr+request_size;

%d,%d\n"

start_addr,ab->

//pre->

next=fbt->

ab->

if(fbt==free_block)

free_block=fbt->

free(fbt);

pre->

}

pre=fbt;

fbt=fbt->

voidkill_process()

intpid;

KillProcess,pid="

pid);

ab=find_process(pid);

if(ab!

free_mem(ab);

dispose(ab);

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)

size=ab->

start_addr=ab->

fbt->

next=free_block;

free_block=fbt;

rearrange(MA_FF);

fbt=free_block;

work=fbt->

if(work!

start_addr+fbt->

size==work->

size+work->

next=work->

free(work);

continue;

//rearrange(algorithm);

intdispose(structallocated_block*free_ab)

structallocated_block*pre,*ab;

if(free_ab==allocated_block_head)

allocated_block_head=allocated_block_head->

free(free_ab);

return1;

pre=allocated_block_head;

ab=allocated_block_head->

while(ab!

=free_ab)

pre=ab;

ab=ab->

next=ab->

return2;

intdisplay_mem_usage()

structfree_block_type*fbt=free_block;

structallocated_block*ab=allocated_block_head;

if(fbt==NULL)

\n"

FreeMemory:

\n"

%20s%20s\n"

"

start_addr"

size"

%20d%20d\n"

fbt->

start_addr,fbt->

fbt=fbt->

\nUsedMemory:

%10s%20s

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2