文档库 最新最全的文档下载
当前位置:文档库 › 操作系统实验内存分配

操作系统实验内存分配

操作系统实验内存分配
操作系统实验内存分配

西安邮电大学

(计算机学院)

课内实验报告

实验名称:内存管理

专业名称:软件工程

班级:

学生姓名:

学号(8位):

指导教师:

实验日期:

实验五:进程

1.实验目的

通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。

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

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

(3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

2.实验要求:

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

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

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

3.实验过程:

创建进程:

删除其中几个进程:(默认以ff首次适应算法方式排列)

Bf最佳适应算法排列方式:

wf最差匹配算法排列方式:

4.实验心得:

这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义:

①首次适应算法。在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。

②循环首次适应算法。该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。

③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。

④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。

实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。

5.程序源代码:

#include

#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 free_block_type *free_block = NULL;

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

struct allocated_block

{

int pid; //进程标识符

int size; //进程大小

int start_addr; //进程分配到的内存块的起始地址

char process_name[PROCESS_NAME_LEN]; //进程名

struct allocated_block *next; //指向下一个进程控制块

};

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

struct allocated_block *allocated_block_head = NULL;

int free_block_count = 0; //空闲块个数

int mem_size = DEFAULT_MEM_SIZE; //内存大小

int current_free_mem_size = 0; //当前空闲内存大小

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

static int pid = 0; //初始PID

int flag = 0; //设置内存大小标志,表示内存大小是否设置

/*函数声明*/

struct free_block_type* init_free_block(int mem_size);

void display_menu();

int set_mem_size();

void set_algorithm();

void rearrange(int algorithm);

int rearrange_WF();

int rearrange_BF();

int rearrange_FF();

int new_process();

int allocate_mem(struct allocated_block *ab);

void kill_process();

int free_mem(struct allocated_block *ab);

int dispose(struct allocated_block *free_ab);

int display_mem_usage();

struct allocated_block *find_process(int pid);

int do_exit();

int allocate_FF(struct allocated_block *ab);

int allocate_BF(struct allocated_block *ab);

int allocate_WF(struct allocated_block *ab);

int allocate(struct free_block_type *pre, struct free_block_type *allocate_free_nlock, struct allocated_block *ab);

int mem_retrench(struct allocated_block *ab);

// 通过内存紧缩技术给新进程分配内存空间

int mem_retrench(struct allocated_block *ab)

{

struct allocated_block *allocated_work, *allocated_pre = allocated_block_head;

struct free_block_type *free_work, *free_pre = free_block->next;

if(allocated_pre == NULL)

return -1;

allocated_pre->start_addr = 0;

allocated_work = allocated_pre->next;

while(allocated_work != NULL)

{

allocated_work->start_addr = allocated_pre->start_addr + allocated_pre->size;

allocated_pre = allocated_work;

allocated_work = allocated_work->next;

}

free_block->start_addr = allocated_pre->start_addr + allocated_pre->size;

free_block->size = current_free_mem_size;

free_block->next = NULL;

free_work = free_pre;

while(free_pre != NULL)

{

free(free_pre);

free_pre = free_work;

if(free_pre != NULL)

free_work = free_work->next;

}

allocate(NULL, free_block, ab);

return 1;

}

// 给新进程分配内存空间

int allocate(struct free_block_type *pre, struct free_block_type *allocate_free_block, struct allocated_block *ab)

{

struct allocated_block *p = allocated_block_head;

ab->start_addr = allocate_free_block->start_addr;

if(allocate_free_block->size - ab->size < MIN_SLICE)

{

ab->size = allocate_free_block->size;

if(pre != NULL)

{

pre->next = allocate_free_block;

}

else

{

free_block = allocate_free_block->next;

}

free(allocate_free_block);

}

else

{

allocate_free_block->start_addr += ab->size;

allocate_free_block->size -= ab->size;

}

if(p == NULL)

{

allocated_block_head = ab;

}

else

{

while(p->next != NULL)

p = p->next;

p->next = ab;

}

current_free_mem_size -= ab->size;

if(current_free_mem_size == 0)

free_block = NULL;

return 0;

}

//按照最坏适应算法给新进程分配内存空间

int allocate_WF(struct allocated_block *ab)

{

int ret;

struct free_block_type *wf = free_block;

if(wf == NULL)

return -1;

if(wf->size >= ab->size)

allocate(NULL, wf, ab);

else if(current_free_mem_size >= ab->size)

ret = mem_retrench(ab);

else

ret = -2;

rearrange_WF();

return ret;

}

// 按照最佳适应算法给新进程分配内存空间

int allocate_BF(struct allocated_block *ab)

{

int ret;

struct free_block_type *pre = NULL, *bf = free_block;

if(bf == NULL)

return -1;

while(bf != NULL)

{

if(bf->size >= ab->size)

{

ret = allocate(pre, bf,ab);

break;

}

pre = bf;

pre = pre->next;

}

if(bf == NULL && current_free_mem_size > ab->size) ret = mem_retrench(ab);

else

ret = -2;

rearrange_BF();

return ret;

}

// 按照首次适应算法给新进程分配内存空间

int allocate_FF(struct allocated_block *ab)

{

int ret;

struct free_block_type *pre = NULL, *ff = free_block;

if(ff == NULL)

return -1;

while(ff != NULL)

{

if(ff->size >= ab->size)

{

ret = allocate(pre, ff,ab);

break;

}

pre = ff;

pre = pre->next;

}

if(ff == NULL && current_free_mem_size > ab->size) ret = mem_retrench(ab);

else

ret = -2;

rearrange_FF();

return ret;

}

//分配内存模块

int allocate_mem(struct allocated_block *ab)

{

int ret ;

struct free_block_type *fbt, *pre;

int request_size = ab->size;

fbt = pre = free_block;

switch(ma_algorithm)

{

case MA_FF :

ret = allocate_FF(ab);

break;

case MA_BF :

ret = allocate_BF(ab);

break;

case MA_WF :

ret = allocate_WF(ab);

break;

default :

break;

}

return ret;

}

// 创建一个新的进程。

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_name, "PROCESS-%02d", pid); //sprintf()函数将格式化的数据写入某字符串中

ab->pid = pid;

printf("Memory for %s:", ab->process_name);

for(; ; )

{

scanf("%d", &size);

getchar();

if(size > 0)

{

ab->size = size;

break;

}

else

printf("The size have to greater than zero! Please input again!");

}

ret = allocate_mem(ab); //从空闲区分配内存,ret==1表示分配ok

if((ret == 1) && (allocated_block_head == NULL)) //如果此时allocated_block_head尚未赋值,则赋值

{ //进程分配链表为空

allocated_block_head = ab;

return 1;

}

else if(ret == 1) //分配成功,将该已分配块的描述插入已分配链表

{

ab->next = allocated_block_head; //头插法

allocated_block_head = ab;

return 2;

}

else if(ret == -1) //分配不成功

{

printf("Allocation fail\n");

free(ab);

return -1;

}

return 3;

}

//退出程序并释放内存空间。

int do_exit()

{

struct allocated_block *allocated_ab, *allocated_pre;

struct free_block_type *free_ab, *free_pre;

free_pre = free_block;

allocated_pre = allocated_block_head;

if(free_pre != NULL)

{

free_ab = free_pre->next;

while(free_ab != NULL)

{

free(free_pre);

free_pre = free_ab;

free_ab = free_ab->next;

}

}

if(allocated_pre != NULL)

{

allocated_ab = allocated_pre->next;

while(allocated_ab != NULL)

{

free(allocated_pre);

allocated_pre = allocated_ab;

allocated_ab = allocated_ab->next;

}

}

allocated_ab = allocated_ab->next;

return 0;

}

//在进程分配链表中寻找指定进程。

struct allocated_block *find_process(int pid)

{

struct allocated_block *ab = allocated_block_head;

if(ab == NULL)

{

printf("Here??????111111111\n");

return NULL;

}

while(ab->pid != pid && ab->next != NULL)

ab = ab->next;

if(ab->next == NULL && ab->pid != pid)

{

printf("Here??????2222222\n");

return NULL;

}

return ab;

}

//显示当前内存的使用情况,包括空闲区的情况和已经分配的情况。

int display_mem_usage()

{

struct free_block_type *fbt = free_block;

struct allocated_block *ab = allocated_block_head;

printf("----------------------------------------------------------\n");

//显示空闲区

printf("Free Memory:\n");

printf("%20s %20s\n", " start_addr", " size");

while(fbt != NULL)

{

printf("%20d %20d\n", fbt->start_addr, fbt->size);

fbt = fbt->next;

}

//显示已分配区

printf("\nUsed Memory:\n");

printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");

while(ab != NULL)

{

printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);

ab = ab->next;

}

printf("----------------------------------------------------------\n");

return 1;

}

// 释放ab数据结构节点。

int dispose(struct allocated_block *free_ab)

{

struct allocated_block *pre, *ab;

if(free_block == NULL)

return -1;

if(free_ab == allocated_block_head) //如果要释放第一个节点{

allocated_block_head = allocated_block_head->next;

free(free_ab);

}

else

{

pre = allocated_block_head;

ab = allocated_block_head->next;

//找到free_ab

while(ab != free_ab)

{

pre = ab;

ab = ab->next;

}

pre->next = ab->next;

free(ab);

}

return 1;

}

/*将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;

pre = free_block;

fbt->start_addr = ab->start_addr;

fbt->size = ab->size;

fbt->next = NULL;

if(pre != NULL)

{

while(pre->next != NULL)

pre = pre->next;

pre->next = fbt;

}

else

{

free_block = fbt;

}

rearrange_FF();

pre = free_block;

work = pre->next;

while(work != NULL)

{

if(pre->start_addr + pre->size == work->start_addr)

{

pre->size += work->size;

free(work);

work = pre->next;

}

else

{

pre = work;

work = work->next;

}

}

current_free_mem_size += ab->size;

return 1;

}

// 删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点。void kill_process()

{

struct allocated_block *ab;

int pid;

printf("Kill Process, pid=");

scanf("%d", &pid);

getchar();

ab = find_process(pid);

if(ab != NULL)

{

free_mem(ab); /*释放ab所表示的分配区*/

dispose(ab); /*释放ab数据结构节点*/

}

}

//按FF算法重新整理内存空闲块链表,按空闲块首地址排序。

int rearrange_FF()

{

struct free_block_type *head = free_block;

struct free_block_type *forehand, *pre, *rear;

int i;

if(head == NULL)

return -1;

//冒泡排序

for(i = 0; i < free_block_count-1; i++)

{

forehand = head;

pre = forehand->next;

rear = pre->next;

while(pre->next != NULL)

{

if(forehand == head && forehand->start_addr >= pre->start_addr) //比较空闲链表中第一个空闲块与第二个空闲块的开始地址的大小

{

head->next = pre->next;

pre->next = head;

head = pre;

forehand = head->next;

pre = forehand->next;

rear = pre->next;

}

else if(pre->start_addr >= rear->start_addr) //比较链表中其他相邻两节点的开始地址的大小

{

pre->next = rear->next;

forehand->next = rear;

rear->next = pre;

forehand = rear;

rear = pre->next;

}

else

{

forehand = pre;

pre = rear;

rear = rear->next;

}

}

}

return 0;

}

// 按BF算法重新整理内存空闲块链表,按空闲块大小从小到大排序。

int rearrange_BF()

{

struct free_block_type *head = free_block;

struct free_block_type *forehand, *pre, *rear;

int i;

if(head == NULL)

return -1;

//冒泡排序

for(i = 0; i < free_block_count-1; i++)

{

forehand = head;

pre = forehand->next;

rear = pre->next;

while(pre->next != NULL)

{

if(forehand == head && forehand->size <= pre->size) //比较空闲链表中第一个空闲块与第二个空闲块的空间的大小

{

head->next = pre->next;

pre->next = head;

head = pre;

forehand = head->next;

pre = forehand->next;

rear = pre->next;

}

else if(pre->size <= rear->size) //比较链表中其他相邻两节点的空间的大小

{

pre->next = rear->next;

forehand->next = rear;

rear->next = pre;

forehand = rear;

rear = pre->next;

}

else

{

forehand = pre;

pre = rear;

rear = rear->next;

}

}

}

return 0;

}

//按WF算法重新整理内存空闲块链表,按空闲块大小从大到小排序。

int rearrange_WF()

{

struct free_block_type *head = free_block;

struct free_block_type *forehand, *pre, *rear;

int i;

if(head == NULL)

return -1;

//冒泡排序

for(i = 0; i < free_block_count-1; i++)

{

forehand = head;

pre = forehand->next;

rear = pre->next;

while(pre->next != NULL)

{

if(forehand == head && forehand->size >= pre->size) //比较空闲链表中第一个空闲块与第二个空闲块空间的大小

{

head->next = pre->next;

pre->next = head;

head = pre;

forehand = head->next;

pre = forehand->next;

rear = pre->next;

}

else if(pre->size >= rear->size) //比较链表中其他相邻两节点的空间的大小

{

pre->next = rear->next;

forehand->next = rear;

rear->next = pre;

forehand = rear;

rear = pre->next;

}

else

{

forehand = pre;

pre = rear;

rear = rear->next;

}

}

}

return 0;

}

//按指定的算法整理内存空闲块链表。

void rearrange(int algorithm)

{

switch(algorithm)

{

case MA_FF:

rearrange_FF();

break;

case MA_BF:

rearrange_BF();

break;

case MA_WF:

rearrange_WF();

break;

}

}

//设置当前的分配算法

void set_algorithm()

{

int algorithm;

//system("clear");

printf("\t1 - First Fit\n"); //首次适应算法

printf("\t2 - Best Fit \n"); //最佳适应算法

printf("\t3 - Worst Fit \n"); //最坏适应算法

printf("\nPlease choose(1~3):");

for(; ; )

{

scanf("%d", &algorithm);

getchar();

if(algorithm >= 1 && algorithm <= 3)

{

ma_algorithm = algorithm;

break;

}

else

{

printf("\nCannot input %d, Please input 1~3 : ", algorithm);

}

}

//按指定算法重新排列空闲区链表

rearrange(ma_algorithm);

}

//设置内存的大小

int set_mem_size()

{

int size;

if(flag != 0) //防止重复设置

{

printf("Cannot set memory size again\n");

return 0;

}

printf("Total memory size = ");

for(; ; )

{

scanf("%d", &size);

getchar();

if(size > 0)

{

current_free_mem_size = size;

mem_size = size; //设置内存大小为size

free_block->size = mem_size; //设置空闲块大小为size

break;

}

else

{

printf("The size must greater than zero! Please input again:");

}

}

flag = 1; //内存大小已经设置

return 1;

}

//显示主菜单

void display_menu()

{

printf("\n");

//system("clear");

printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);

printf("2 - Select memory allocation algorithm\n");

printf("3 - New process \n");

printf("4 - Terminate a process \n");

printf("5 - Display memory usage \n");

printf("0 - Exit\n");

}

// 初始化空闲块,默认为一块,可以指定大小及起始地址

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 mem\n");

return NULL;

}

current_free_mem_size = mem_size;

fb->size = mem_size; //设置空闲块大小

fb->start_addr = DEFAULT_MEM_START; //空闲块起始地址

fb->next = NULL; //首地址指向NULL

return fb;

}

/*主函数*/

int main(void)

{

char choice;

pid = 0;

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

while(1)

{

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

2014-2015(1)操作系统实验

实验项目名称:进程的同步(实验一) 1、实验目的 (1) 掌握进程和线程基本概念和属性; (2) 掌握用PV操作解决并发进程的同步问题; (3) 掌握用于同步的信号量初值的设置; (4) 掌握如何处理共享资源的直接制约关系。 2、实验内容 (1) 设计一个模拟若干售票网点的售票程序。界面可以参考图1。还应设计多个后台售票线程并发运行。 图1售票 (2) 模拟:桌上有一只盘子,每次只能放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放桔子,一个女儿专等吃盘子里的苹果,一个儿子专等吃盘子里的桔子。只要盘子空则爸爸或妈妈都可以向盘子放一个水果,仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。放-取水果的几种情况如图2(a)~(f)所示,可以参照进行设计。 (a)盘子空时取水果 (b)父亲放入苹果

(c) 儿子取水果 (d) 女儿取水果 (e)儿子取走桔子 (f)盘子满时放水果 图2 放-取水果 (3) 自选其它能反映进程互斥问题的应用。 实验项目名称:处理机调度(实验二) 1、实验目的 (1) 掌握几种处理机调度算法的基本思想和特点; (2) 理解并发与并行的区别; (3) 比较几种算法的特点。 2、实验内容 编写程序模拟处理机调度,参照图3。 (1) 时间片轮转 (2) 动态优先权调度 (3) 高响应比优先调度

图3 模拟处理机调度 实验项目名称:银行家算法(实验三) 1、实验目的 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、实验内容 (1) 设计进程对各类资源最大申请表示及初值确定。 (2) 设定系统提供资源初始状况。 (3) 设定每次某个进程对各类资源的申请表示。 (4) 编制程序,依据银行家算法,决定其申请是否得到满足。 具体设计可参照图4(a)~(c) 进行。

操作系统实验动态分区分配算法

操作系统实验报告实验2 动态分区分配算法 报告日期:2016-6-15 姓名: 学号: 班级: 任课教师:

5k 10k 14k 26k 32k 512k 实验2 动态分区分配算法 一、实验内容 编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。 二、实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理 解在可变分区管理方式下应怎样实现主存空间的分配和回收。 三、实验原理 模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。 (1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如: 为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下: 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。

计算机操作系统内存分配实验报告记录

计算机操作系统内存分配实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。 设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。 设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明

操作系统实验内存分配

西安邮电大学 (计算机学院) 课内实验报告 实验名称:内存管理 专业名称:软件工程 班级: 学生姓名: 学号(8位): 指导教师: 实验日期:

实验五:进程 1.实验目的 通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。 (1)掌握内存分配FF,BF,WF策略及实现的思路; (2)掌握内存回收过程及实现思路; (3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 3.实验过程: 创建进程:

删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式:

wf最差匹配算法排列方式: 4.实验心得: 这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义: ①首次适应算法。在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。 ②循环首次适应算法。该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。 ③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。 ④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #include #include

操作系统实验内存分配

精心整理西安邮电大学 (计算机学院) 课内实验报告 1. (1 (2 (3 原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

3.实验过程: 创建进程: 删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式: wf最差匹配算法排列方式: 4.实验心得: 明 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #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 { }; /* /* { }; /* /* void display_menu(); int set_mem_size(); void set_algorithm(); void rearrange(int algorithm); int rearrange_WF(); int rearrange_BF(); int rearrange_FF(); int new_process(); int allocate_mem(struct allocated_block *ab);

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

操作系统内存动态分配模拟算法

实验四存分配算法 1.实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助学生理解在动态分区管理方式下应怎样实现主存空间的分配和回收。 背景知识: 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离、主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。 2.实验容 采用首次适应算法或循环首次算法或最佳适应算法分配主存空间。 由于本实验是模拟主存的分配,所以当把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。(即输出当时的空闲区说明表及其存分配表) 利用VC++6.0实现上述程序设计和调试操作。 3.实验代码 #include #include using namespace std; //定义存的大小 const int SIZE=64; //作业结构体,保存作业信息 struct Project{ int number; int length; }; //存块结构体,保存存块信息 struct Block{

可变分区存储管理方式的内存分配和回收实验报告

一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方 案的理解,熟悉可变分区存储管理的内存分配和回收。 二.实验内容 1.确定内存空间分配表; 2.采用最优适应算法完成内存空间的分配和回收; 3.编写主函数对所做工作进行测试。 三.实验背景材料 实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。 首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。 由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。分配内存时查找空闲区进行分配,然后填写己分

配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,内存的分配和回收主要是对空闲区的操作。这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数。 “已分分区表”的结构定义 #definen10//假定系统允许的最大作业数量为n struct {floataddress;//已分分区起始地址 floatlength;//已分分区长度、单位为字节 intflag;//已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名 }used_table[n];//已分分区表 “空闲区表”的结构定义 #definem10//假定系统允许的空闲区最大为m struct {floataddress;//空闲区起始地址

操作系统课程设计内存管理

内存管理模拟 实验目标: 本实验的目的是从不同侧面了解Windows 2000/XP 对用户进程的虚拟内存空间的管理、分配方法。同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。对Windows分配虚拟内存、改变内存状态,以及对物理内存(physical memory)和页面文件(pagefile)状态查询的API 函数的功能、参数限制、使用规则要进一步了解。 默认情况下,32 位Windows 2000/XP 上每个用户进程可以占有2GB 的私有地址空间,操作系统占有剩下的2GB。Windows 2000/XP 在X86 体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个32 位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。 实验要求: 使用Windows 2000/XP 的API 函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容: 时间:操作等待时间。 块数:分配内存的粒度。 操作:包括保留(reserve)一个区域、提交(commit)一个区域、释放(release)一个区域、回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。保留是指保留进程的虚拟地址空间,而不分配物理 存储空间。提交在内存中分配物理存储空间。回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。释放是指将物理存储和虚拟地址空间全部释放,它与保留(reserve)相对应,即可以释放已经保留的内存块。 大小:块的大小。 访问权限:共五种,分别为PAGE_READONLY,PAGE_READWRITE ,PAGE_EXECUTE,PAGE_EXECUTE_READ 和PAGE EXETUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。

实验操作系统存储管理实验报告

实验四操作系统存储管理实验报告 一、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二、实验内容 (1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。 页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。 在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。 (2)produce_addstream通过随机数产生一个指令序列,共320条指令。 A、指令的地址按下述原则生成: 1)50%的指令是顺序执行的 2)25%的指令是均匀分布在前地址部分 3)25%的指令是均匀分布在后地址部分 B、具体的实施方法是: 1)在[0,319]的指令地址之间随机选取一起点m; 2)顺序执行一条指令,即执行地址为m+1的指令; 3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’; 4)顺序执行一条指令,地址为m’+1的指令 5)在后地址[m’+2,319]中随机选取一条指令并执行; 6)重复上述步骤1)~5),直到执行320次指令 C、将指令序列变换称为页地址流

在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中 的存放方式为: 第0条~第9条指令为第0页<对应虚存地址为[0,9]); 第10条~第19条指令为第1页<对应虚存地址为[10,19]); 。。。。。。 第310条~第319条指令为第31页<对应虚存地址为[310,319]); 按以上方式,用户指令可组成32页。 (3)计算并输出下属算法在不同内存容量下的命中率。 1)先进先出的算法

计算机操作系统内存分配实验报告

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下.如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配.就是解决多道作业或多进程如何共享主存空间的问题。所谓回收.就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区.使分区大小正好适合作业的需求.并且分区个数是可以调整的。当要装入一个作业时.根据作业需要的主存量查看是否有足够的空闲空间.若有.则按需要量分割一个分区分配给该作业;若无.则作业不能装入.作业等待。随着作业的装入、完成.主存空间被分成许多大大小小的分区.有的分区被作业占用.而有的分区是空闲的。 实验要求使用可变分区存储管理方式.分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行.分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时.要求设计一个实用友好的用户界面.并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理.在系统运行当然开始.假设初始状态下.可用的内存空间为640KB.存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后.分给作业1(130KB).随着作业1、2、3的进入.分别分配60KB、100KB.经过一段时间的运行后.作业2运行完毕.释放所占内存。此时.作业4进入系统.要求分配200KB内存。作业3、1运行完毕.释放所占内存。此时又有作业5申请140KB.作业6申请60KB.作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理.使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链.为了实现对空闲分区的分配和链接.在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针.由状态位指示该分区是否分配出去了;同时.在分区尾部还设置有一后向指针.用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间.当该分区分配出去后.状态位就由“0”置为“1”。 设置一个内存空闲分区链.内存空间分区通过空闲分区链来管理.在进行内存分配时.系统优先使用空闲低端的空间。 设计一个空闲分区说明链.设计一个某时刻主存空间占用情况表.作为主存当前使用基础。初始化空间区和已分配区说明链的值.设计作业申请队列以及作业完成后释放顺序.实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。

实验4内存管理资料讲解

实验 4 内存管理

实验4内存管理 学校:FJUT 学号:3131903229 班级:计算机1302姓名:姜峰 注:其中LFU和NRU算法运行结果可能与其他人不同,只是实现方式不同,基本思路符合就可以。 .实验学时与类型 学时:2,课外学时:自定 实验类型:设计性实验二.实验目的 模拟实现请求页式存储管理中常用页面置换算法,理会操作系统对内存的 调度管理。 三?实验内容 要求:各算法要给出详细流程图以及执行结果截图。 假设有一程序某次运行访问的页面依次是: 0,124,3,4,5,1,2,5,1,2,3,4,5,6 ,请给出采用下列各页面置换算法时页面的换进换出情况,并计算各调度算法的命中率(命中率二非缺页次数/总访问次数),初始物理内存为空,物理内存可在4?20页中选择。 (1)FIFO :最先进入的页被淘汰; (2)LRU :最近最少使用的页被淘汰; (3)OPT :最不常用的页被淘汰;(选做) ⑷LFU :访问次数最少的页被淘汰(LFU)。(选做)

源代码: #i nclude #include #in elude #i nclude #defi ne MAXNUM 100 struct Phy_Memory{ //定义一个物理内存结构体 char Page; int time; }; char *OutPut; struct Phy_Memory *Phy_Page; void Print(char *PageStr,int Phy_PageNum,int absence){ // 打印图解函数int i,j; for(i=0;iPage!=*Temp;i++); if(i

操作系统 内存管理实验报告

同组同学学号: 同组同学姓名: 实验日期:交报告日期: 实验(No. 4 )题目:编程与调试:内存管理 实验目的及要求: 实验目的: 操作系统的发展使得系统完成了大部分的内存管理工作,对于程序员而言,这些内存管理的过程是完全透明不可见的。因此,程序员开发时从不关心系统如何为自己分配内存,而且永远认为系统可以分配给程序所需的内存。在程序开发时,程序员真正需要做的就是:申请内存、使用内存、释放内存。其它一概无需过问。本章的3个实验程序帮助同学们更好地理解从程序员的角度应如何使用内存。 实验要求: 练习一:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果,分析遇到的问题和解决方法。 练习二:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 练习三:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 改编实验中的程序,并运行出结果。 实验设备:多媒体电脑 实验内容以及步骤: 在虚拟机中编写好以下程序: #include #include #include int main(void) { char *str; /* 为字符串申请分配一块内存*/ if ((str = (char *) malloc(10)) == NULL) { printf("Not enough memory to allocate buffer\n"); return(1); /* 若失败则结束程序*/ } /* 拷贝字符串“Hello”到已分配的内存空间*/ strcpy(str, "Hello"); /* 显示该字符串*/ printf("String is %s\n", str); /* 内存使用完毕,释放它*/ free(str); return 0; } 调试过后得出的结果截图如下:(由图可看出我将此程序以aa.c为文件名保存,调试后出现aa1文件,调试结果出现语句“String is Hello”)

内存最佳分配实验报告

一.实验名称 模拟实现动态分区存储管理 二.实验要求 编写程序实现动态分区存储管理方式的主存分配与回收。具体内容包括:先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试。 三.解决方案 实现动态分区的分配与回收,主要考虑两个问题:第一,设计记录主存使用情况的数据结构,用来记录空闲区和作业占用的区域;第二,在该数据结构基础上设计主存分配算法和主存回收算法。 由于动态分区的大小是由作业需求量决定的,故分区的长度预先不能固定,且分区的个数也随主存分配和回收变动。总之,所有分区的情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时,空闲区有时会变成两个分区(空闲区和已分配区),回收主存分区时,可能会合并空闲区,这样如果整个主存采用一张表格记录已分配区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区。由此可见,主存的分配与回收主要是对空闲区的操作。这样为了便于对主存空间的分配与回收,可建立两张分区表记录主存使用情况:“已分配区表”记录作业占用分区,“空闲区表”记录空闲区。 然后在数据结构上进行主存的分配,其主存分配算法采用最优适应算法,即按祖业要求挑选一个能满足作业要求的最小空闲区分配。具体实现时,把空闲区按长度以某种方式(递增方式)登记在“空闲区表”中,分配时顺序查找“空闲区表”,查到的第一个空闲区就是满足作业要求的最小分区。在实现回收时,先在“已分配区表”中找到将作业归还的区域,且变为空,检查“空闲区”表中未分配区域,查找是否有相邻空闲区,最后合并空闲区,修改“空闲区表”。设计程序时可选择进行主存分配或主存回收,所需参数为:若是主存分配。输入作业名和所需主存空间大小;若是回收,输入回收作业的作业名,以循环进行主存分配和回收。 四.实验代码 #include #include #define n 10 /*定义系统允许的最大作业数*/ #define m 10 /*定义系统允许的空闲区表最大值*/ #define minisize 100 struct /*已分配区表的定义*/ { float address; float length; int flag; }used_table[n]; struct {float address; float length; int flag; }free_table[m];

内存管理实验报告

内存管理实验报告

信息科学与技术学院实验报告 课程名称: 实验项目: 实验地点:指导教师: 日期: 实验类型:(验证性实验综合性实验设计性实验) 专业: 计算机外包班级: 14外三姓名: 周鹏飞学号: 1414104033 一、实验目的及要求 通过此次实验,加深对内存管理的认识,进一步掌握内存的分配,回收算法的思想。 二、实验仪器、设备或软件 Windows操作系统PC一台;VC++6.0 三、实验内容及原理 原理:设计程序模拟内存的动态分区内存管理方法。内存空闲区使用空闲分区表进行管理,采用最先适应算法从空闲分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲分区的合并。 假定系统的内存共640k,初始状态为操作系统本身占用40k.t1时刻,为作业A,B,C分配80k,60k,100k的内存空间;t2时刻作业B完成;t3时刻为作业D分配50k的内存空间;t4时刻作业C,A完成;t5时刻作业D完成。要求编程序分别输出t1,t2,t3,t4,t5时刻内存的空闲区的状态。 实验内容: #include #include #define maxPCB 6 //最大进程数 #define maxPart 6 //最大空闲分区数

#define size 10 //不再切割剩余分区的大小 typedef struct PCB_type { char name;//进程名 int address;//进程所占分区首地址 int len;//进程所占分区的长度 int valid;//PCB标识符(有效,无效) }PCB; Typedef struct seqlist //进程信息队列 { PCB PCBelem[maxPCB];// maxPCB为为系统中允许的最多进程数 int total; //系统中实际的进程数 }PCBseql;//分区类型的描述 typedef struct Partition { int address;//分区起址 int len;//分区的长度 int valid;//有标识符(有效,无效) }Part;//内存空闲分区表(顺序表)描述 typedef struct Partlist //空白分区链 { Part Partelem[maxPart];//maxPart为系统中可能的最多空闲分区数 int sum;//系统中世纪的分区数 }Partseql;//全局变量 PCBseql *pcbl;//进程队列指针 Partseql *part1;//空闲队列指针 #intclude “MainManager.h” void initpcb() //初始化进程表vpcb1 { int i; pcb1->PCBelem[0].address=0; pcb1->PCBelem[0].len=0; pcb1->PCBelem[0].name=’s’; pcb1->PCBelem[0].valid=1; pcb1->total=0; for(i=1;i

操作系统实验报告--内存管理

操作系统课程设计 实验报告 学院:信息学院 班级:计1109班 姓名:林海慧 学号:XXXXXXXXXXXXX 指导老师:XXXX

实验三、内存管理 一、[问题描述] 设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。 二、[基本要求] 页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化, 页表结构: ,块号分别为0、1、2,页框管理表(空闲块表): 任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。 每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满,则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况; 存储管理算法的流程图如下:

三、源代码 #include #include #define BUSY 1 #define NOTBUSY 0 struct PageB{ int PNumber; //页号

int BNumber; //物理块号 int Count; //计数器,在内存驻留时间 bool State; //状态位 } ; PageB Page[6]={{0,-1,0,false},{1,-1,0,false},{2,-1,0,false},{3,-1,0,false},{4,-1,0,false},{5,-1,0,false}}; int queye=0; struct Physical{ int BNumber; //物理块号 int State; //状态位 }Physical[3]={{0,0},{1,0},{2,0}}; int MaxSzie, MaxCount = 0; bool IsInPage(int P)//判断是否在内存 { int i=0; int flag=0; for (i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == true) { printf("\n页在主存,打印页表:"); printf("\n页号:%d 物理块号:%d 状态:%d(true)",Page[i].PNumber,Page[i].BNumber,Page[i].State); flag=1; } } if(flag==1) return true; else return false; } void FIFO(int P)//FIFO页面置换算法 { int i, j, k; int BNumber;//暂存物理块号 for(i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == false) { printf("页号%d在辅存\n",P); //分配给该进程的物理块均被占

实验五 Windows XP 虚拟内存管理 结果

实验五 Windows XP 虚拟内存管理 一实验目的 1) 了解存储器管理以及虚拟存储器管理的基本原理 2)了解和学习Windows系统管理工具中关于内存管理的设置和使用; 二实验环境 需要准备一台运行Windows XP操作系统的计算机。 三背景知识 虚拟存储器技术是当代计算机中广泛采用的内存管理方案,在Windows XP中合理的进行虚拟内存的设置,可以更有效的提高系统的工作效率。利用系统自带的系统监视器可以查看虚拟内存的使用情况,根据使用情况可以灵活的进行虚拟内存的管理。 四实验内容与步骤 启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。 步骤1:当前机器中由你打开,正在运行的应用程序有: 1) 实验五Windows XP虚拟内存管理 步骤2:单击“进程”选项卡,一共显示了41个进程。请试着区分一下,其中: 系统 (SYSTEM) 进程有25个 服务 (SERVICE) 进程有4个 用户进程有12个。 图2-0 实验记录

步骤3:查看本机的物理内存容量为 3144812K,点击任务管理器中性能标签,再查看一下,物理内存可用数,核心内存总数58200K,核心内存为操作系统所占的内存,可将以上表格中所填写的各进程所占内存数与步骤3中填写的数字做下比较。 步骤4:用鼠标右键点击“我的电脑”,选择“属性”,弹出系统属性窗口,选择“高级”标签,点击“性能”下面的“设置”按钮,再选择高级标签,查看本机的虚拟内存大小为 2048M,点击更改按钮,本系统所用的虚拟内存设置在E分区,初始大小2048MB,最大值2048MB,当前已分配2048MB,页面大小4606MB。 步骤5:请在Windows2000(XP)目录下查找一个名为pagefile.sys的系统文件(Windows98下为Win386.swp),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,pagefile.sys 是Windows下的一个虚拟内存,请观察一下目前该文件大小为 1560576KB 。 步骤6:观察虚拟内存的使用情况,并进行重新设置 1)在控制面板中的管理工具中打开性能监视器,展开左侧的性能日志和警报,并点击选择记数器日志,在右侧的面板中空白处点击鼠标右键,选择新建日志设置,并命名为Pagefile,然后回车确认。 2)在常规选项卡下,点击添加记数器按钮,在新弹出的窗口的性能对象下拉菜单中选择Paging File,并选择“从列表选择记数器”,然后点击% Usage Peak,在范例中选择“_Total”,并接着点击“添加”按钮。 3)然后关闭这个窗口,并点击图三中的“确定”按钮。点击“是”创建日志文件。接着打开“日志文件”选项卡,在日志文件类型下拉菜单中选则“文本文件(逗号分隔)”,然后记住“例如”框中显示的日志文件的路径。 4)这样,点击确定后这个记数器已经开始运行了,你可以在电脑上进行你的日常操作,并尽可能多

相关文档
相关文档 最新文档