操作系统_内存分配与回收实验报告

  • 格式:doc
  • 大小:2.33 MB
  • 文档页数:23

西 安 邮 电 大 学

(计算机学院)

课内实验报告

实验名称: 内存分配与回收

专业名称: 计算机科学与技术

班 级: 计科1503

学生姓名: ***

学号(8位): ********

指导教师: ***

实验日期: 2016年5月23日---2016年6月6日

一. 实验目的及实验环境

1.实验目的

掌握内存分配FF,BF,WF策略及实现的思路;

掌握内存回收过程及实现思路;

实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

2.实验环境

(1)硬件

 CPU:I7-6500

 内存:8G

 显示器:笔记本显示器

 硬盘空间:1TB

(2)软件

 虚拟机名称及版本:Vmware

 操作系统名称及版本:Ubuntu Kylin 16.04

 编译器:gcc

二. 实验内容

1、实验前准备工作

阅读参考资料,掌握操作系统内存管理的过程,并熟悉FF,BF,WF内存分配策略以及内存回收策略。

2、实验内容

根据下发ppt内容,内存分配与回收程序要求完成如下功能,具体详细设计要求见ppt。

1 -Set memory size (default=1024)//设置内存大小

2 - Select memory allocation algorithm//选择内存分配算法FF、BF、WF

3 - New process//创建新进程,分配内存

4 - Terminate a process//终止进程,回收内存

5 - Display memory usage//显示内存当前使用情况

0 – Exit//程序退出

三.方案设计

1.功能模块图及解释

2.核心数据结构及解释

struct free_block_type //空闲块

{

int size;

int start_addr;

struct free_block_type *next;

};

struct allocated_block //已分配的内存块

{

int pid;

int size;

int start_addr;

char process_name[PROCESS_NAME_LEN];

struct allocated_block *next;

};

1. Set memory size (default=1024):这个模块是用来设置内存大小的,从键盘获取一个数字,并将它赋值给内存大小;若没有设置,则默认内存的大小为1024。

2. Set_algorithm:这个模块是用来设置分配算法的,共有三种算法:首次循环适配算法、最好适配算法、最差适配算法。从键盘输入一种算法前的序号,根据算法点用不同的函数对内存进行分配;

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

4. Kill_process:此模块是用来杀死进程的。从键盘输入一个进程号,先调用find_process()函数进行查找,若找到,则调用kill()函数将其杀死并释放内存空间。

5. Display_mem_usage:此模块是用来显示内存的使用情况的。将每个进

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

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

3.主要算法流程图及解释

算法调用图

四.测试数据及运行结果

1.正常测试数据(3组)及运行结果;

2.非正常测试数据(2组)及运行结果。

五.总结

1.实验过程中遇到的问题及解决办法;

实验过程中不会实现最佳适应算法,然后通过网上查阅别人的算法,自己研究,解决了这个问题。

2.对设计及调试过程的心得体会。

这次实验让我充分了解了内存管理的机制,进一步加深了对计算机的了解,对于以后系统的研究学习计算机起到了至关重要的作用。

六.附录:源代码(电子版)

#include

#include

#include

/*常量定义*/

#define PROCESS_NAME_LEN 32 /*进程名长度*/

#define MIN_SLICE 10 /*最小碎片的大小*/

#define DEFAULT_MEM_SIZE 1024 /*内存大小*/

#define DEFAULT_MEM_START 0 /*起始位置*/

/* 内存分配算法 */

#define MA_FF 1

#define MA_BF 2

#define MA_WF 3

/*描述每一个空闲块的数据结构*/

struct free_block_type{

int size;

int start_addr;

struct free_block_type *next;

};

/*每个进程分配到的内存块的描述*/

struct allocated_block{

int pid;

int size;

int start_addr;

char process_name[PROCESS_NAME_LEN];

struct allocated_block *next;

};

/*指向内存中空闲块链表的首指针*/

struct free_block_type *free_block;

/*进程分配内存块链表的首指针*/

struct allocated_block *allocated_block_head = NULL;

int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/

int ma_algorithm = MA_FF; /*当前分配算法*/

static int pid = 0; /*初始pid*/

int flag = 0; /*设置内存大小标志,防止重复设置*/

void display_menu();

void do_exit();

struct free_block_type *init_free_block(int mem_size);

void set_mem_size();

void set_algorithm();

void new_process();

void kill_process();

void display_mem_usage();

void rearrange(int choice);

void abc();

void rearrage_BF();

void rearrage_WF();

main(){

char choice;

pid=0;

free_block = init_free_block(mem_size); //初始化空闲区

display_menu();

while(1) {

printf("Please choice: ");

fflush(stdin);

choice=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();//显示内存使用flag=1; break;

case '0':do_exit();//释放链表并退出exit(0);

default: break;

}

choice=getchar();

}

}

//紧缩处理

void free_memory_rearrage(int memory_reduce_size,int allocated_size)

{

struct free_block_type *p1,*p2;

struct allocated_block *a1,*a2;

if(memory_reduce_size!=0) //分配完还有小块空间

{

p1=free_block;

p2=p1->next;

p1->start_addr=0;

p1->size=memory_reduce_size;

p1->next=NULL;

mem_size=memory_reduce_size; //