操作系统_内存分配与回收实验报告
- 格式: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; //