文章目录

  • 1:实验要求:
  • 2:代码实现
  • 3:实验分析:
  • 4:结果分析
    • 1:出现两个进程
    • 2:设置内存空间为256
    • 3:再重复一次上一步操作
    • 4:输入5,展示内存空间
    • 5:输入4,杀死2号进程。

1:实验要求:

一、实验目的
1、通过本次试验体会操作系统中内存的分配模式;
2、掌握内存分配的方法(首次适应(FF),最佳适应(BF),最差适应(WF));
3、学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;
4、掌握内存回收过程及实现方法;
5、学会进行内存的申请释放和管理;
二、实验要求
1.运行如下的内存申请与释放序列:先设置内存大小为2048k,进程1申请500k,进程2申请300k,进程1完成,进程3申请200k,进程4申请100k,进程5申请300k;
2.分别选择不同的内存分配算法,输出上述序列的内存分配结果;
3.在现有代码的基础上,实现循环首次适应算法,并输出上述序列采用该分配算法后的结果。

2:代码实现

/*
实验11:内存管理实验
一、实验目的
1、通过本次试验体会操作系统中内存的分配模式;
2、掌握内存分配的方法(首次适应(FF),最佳适应(BF),最差适应(WF));
3、学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;
4、掌握内存回收过程及实现方法;
5、学会进行内存的申请释放和管理;
二、实验要求
1.运行如下的内存申请与释放序列:先设置内存大小为2048k,进程1申请500k,进程2申请300k,进程1完成,进程3申请200k,进程4申请100k,进程5申请300k;
2.分别选择不同的内存分配算法,输出上述序列的内存分配结果;
3.在现有代码的基础上,实现循环首次适应算法,并输出上述序列采用该分配算法后的结果。*/#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>#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      3int mem_size=DEFAULT_MEM_SIZE;         /*内存大小*/
int ma_algorithm = MA_FF;              /*当前分配算法*/
int flag = 0;                         /*设置内存大小标志*/
static int pid = 0;                    /*初始pid*/
int algorithm;/*描述每一个空闲块的数据结构*/
struct free_block_type{int size;int start_addr;struct free_block_type *next;
};  /*指向内存中空闲块链表的首指针*/
struct free_block_type *free_block;/*每个进程分配到的内存块的描述*/
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;
struct allocated_block *find_process(int id)
{struct allocated_block *p;p=allocated_block_head;while(p!=NULL){if (p->pid==id)return p;}return NULL;
}void swap(int *p,int *q)
{int temp;temp  =  *p;*p  =  *q;*q  =  temp;return;
}void do_exit()
{exit(0);
}/*初始化空闲块,默认为一块,可以指定大小及起始地址*/
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;}fb->size = mem_size;fb->start_addr = DEFAULT_MEM_START;fb->next = NULL;return fb;
}/*显示菜单*/display_menu(){printf("\n");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");
}/*设置内存的大小*/
set_mem_size(){int size;if(flag!=0){  //防止重复设置printf("Cannot set memory size again\n");return 0;}printf("Total memory size =");scanf("%d", &size);if(size>0) {mem_size = size;free_block->size = mem_size;}flag=1;  return 1;}/*按FF算法重新整理内存空闲块链表*/
rearrange_FF(){struct free_block_type *tmp, *work;printf("Rearrange free blocks for FF \n");tmp = free_block;while(tmp!=NULL){ work = tmp->next;while(work!=NULL){if ( work->start_addr < tmp->start_addr){ /*地址递增*/swap(&work->start_addr, &tmp->start_addr);swap(&work->size, &tmp->size);}work=work->next;            }tmp = tmp -> next;}
}/*按BF最佳适应算法重新整理内存空闲块链表*/rearrange_BF(){struct free_block_type *tmp, *work;printf("Rearrange free blocks for BF \n");tmp = free_block;while(tmp!=NULL){ work = tmp->next;while(work!=NULL){if ( work->size > tmp->size) { /*地址递增*/swap(&work->start_addr, &tmp->start_addr);swap(&work->size, &tmp->size);}work=work->next;            }tmp = tmp -> next;}
}/*按WF算法重新整理内存空闲块链表*/rearrange_WF(){struct free_block_type *tmp, *work;printf("Rearrange free blocks for WF \n");tmp = free_block;while(tmp!=NULL){ work = tmp->next;while(work!=NULL){if ( work->size < tmp->size) { /*地址递增*/swap(&work->start_addr, &tmp->start_addr);swap(&work->size, &tmp->size);}else    work=work->next;            }tmp = tmp -> next;}
}/*按指定的算法整理内存空闲块链表*/
rearrange(int algorithm){switch(algorithm){case MA_FF:  rearrange_FF(); break;case MA_BF:  rearrange_BF(); break;case MA_WF:  rearrange_WF(); break;}
}/* 设置当前的分配算法 */
set_algorithm(){printf("\t1 - First Fit\n");printf("\t2 - Best Fit \n");printf("\t3 - Worst Fit \n");scanf("%d", &algorithm);if(algorithm>=1 && algorithm <=3) ma_algorithm=algorithm;//按指定算法重新排列空闲区链表rearrange(ma_algorithm); }/*分配内存模块*/
int allocate_mem(struct allocated_block *ab){struct free_block_type *fbt, *pre, *temp,*work; int request_size=ab->size;fbt = free_block;while(fbt!=NULL){if(fbt->size>=request_size){if (fbt->size - request_size >= MIN_SLICE) /*分配后空闲空间足够大,则分割*/{mem_size -= request_size;fbt->size -= request_size; ab->start_addr= fbt->start_addr;fbt->start_addr +=  request_size;}  else  if (((fbt->size - request_size) < MIN_SLICE)&&((fbt->size - request_size) > 0))/*分割后空闲区成为小碎片,一起分配*/{mem_size -= fbt->size;pre = fbt->next;ab->start_addr= fbt->start_addr;fbt->start_addr +=  fbt->size;free(fbt);}else {temp = free_block;while(temp!=NULL){work = temp->next;if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/{             if (temp->start_addr+temp->size == work->start_addr){ temp->size += work->size;temp->next = work->next;free(work);continue;}}temp = temp->next;}fbt = free_block;break;}rearrange(algorithm); /*重新按当前的算法排列空闲区*/ return 1;}pre = fbt;fbt = fbt->next;}return -1;
}/*创建新的进程,主要是获取内存的申请数量*/
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);ab->pid = pid;printf("Memory for %s:", ab->process_name);scanf("%d", &size);if(size>0) ab->size=size;ret = allocate_mem(ab);  /* 从空闲区分配内存,ret==1表示分配ok*/
/*如果此时allocated_block_head尚未赋值,则赋值*/if((ret==1) &&(allocated_block_head == NULL)){ 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;}/*将ab所表示的已分配区归还,并进行可能的合并*/
int free_mem(struct allocated_block *ab)
{int algorithm = ma_algorithm;struct free_block_type *fbt, *work;fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));if(!fbt) return -1;fbt->size = ab->size;fbt->start_addr = ab->start_addr;/*插入到空闲区链表的头部并将空闲区按地址递增的次序排列*/fbt->next = free_block;free_block=fbt;rearrange(MA_FF);fbt=free_block;while(fbt!=NULL){work = fbt->next;if(work!=NULL){/*如果当前空闲区与后面的空闲区相连,则合并*/if(fbt->start_addr+fbt->size == work->start_addr){ fbt->size += work->size;fbt->next = work->next;free(work);continue;}}fbt = fbt->next;}rearrange(algorithm); /*重新按当前的算法排列空闲区*/return 1;}/*释放ab数据结构节点*/
int dispose(struct allocated_block *free_ab){struct allocated_block *pre, *ab;if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/allocated_block_head = allocated_block_head->next;free(free_ab);return 1;}pre = allocated_block_head;  ab = allocated_block_head->next;while(ab!=free_ab){ pre = ab;  ab = ab->next; }pre->next = ab->next;free(ab);return 2;}/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
display_mem_usage(){struct free_block_type *fbt=free_block;struct allocated_block *ab=allocated_block_head;if(fbt==NULL) return(-1);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 0;}/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
kill_process()
{struct allocated_block *ab;int pid;printf("Kill Process, pid=");scanf("%d", &pid);ab=find_process(pid);if(ab!=NULL){free_mem(ab); /*释放ab所表示的分配区*/dispose(ab);  /*释放ab数据结构节点*/}
}main()
{char choice;pid=0;free_block = init_free_block(mem_size); //初始化空闲区for(;;){display_menu();    //显示菜单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);                break;     //释放链表并退出default: break;}}
}

3:实验分析:

4:结果分析

在这里插入图片描述

1:出现两个进程

2:设置内存空间为256

3:再重复一次上一步操作

4:输入5,展示内存空间

5:输入4,杀死2号进程。

操作系统实验11:内存管理实验(DAY 62)相关推荐

  1. linux内存实验,LINUX编程-实验五 内存管理实验

    实验五内存管理实验 1.目的要求 (1)学习使用内存管理库函数. (2)学习分析.改正内存错误. 2.实验内容 (1)内存库函数实验 ●malloc函数 原型:extern void *malloc( ...

  2. linux0.11—内存管理实验

    实验基本内容 用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制: 在 Ubuntu 上编写多进程的生产者-消费 ...

  3. java的内存管理_操作系统实验——java内存管理

    1.Test.java import java.util.Scanner; public class Test { public static void main(String[] args) { T ...

  4. Linux系统内存管理实验报告,linux内存管理实验报告

    <linux内存管理实验报告>由会员分享,可在线阅读,更多相关<linux内存管理实验报告(13页珍藏版)>请在人人文库网上搜索. 1.操作系统实验报告院别:XXXXXX班级: ...

  5. linux内存管理实验malloc,linux内存管理实验报告.doc

    linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...

  6. (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  7. 1709 ltsb 内存占用_「正点原子STM32Mini板资料连载」第三十二章 内存管理实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十二章 内存管理实验 上一章,我 ...

  8. 708-Linux内存管理实验

    Linux内存管理实验 一.实验内容 1.利用boches观测 linux0.11 下的 GDT 表和 LDT 表内容. 2.利用bochs观测 linux0.11 下的内存地址映射过程以及分页机制的 ...

  9. 利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法

    利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法. 内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault.OutOfMemory ...

最新文章

  1. 美多商城之购物车(购物车管理1)
  2. nginx重点优化合集一
  3. 我可以从iOS DeviceSupport中删除数据吗?
  4. 一个快速、完善的Android开发框架整合实践(QuickAndroid)
  5. 在51CTO安了家。。。。
  6. JS事件 鼠标移开事件(onmouseout)鼠标移开事件,当鼠标移开当前对象时,执行onmouseout调用的程序。...
  7. Tyvj-Begin P1029 Begin1 - Unit6 - 幼稚的把戏
  8. PHP服务缓存加速软件
  9. Open3D 点云包围盒
  10. Google Android Market电子市场/应用商店
  11. pdf.js插件在线预览pdf文件以及所遇问题解决方案(兼容IE)
  12. 数位板电脑绘画网课盘点(手绘动漫课程排名)
  13. Miktex 修改经验
  14. 46FPS+1080Px2超分+手机NPU,arm提出一种基于重参数化思想的超高效图像超分方案
  15. 用latex的tikz宏包mindmap包绘制mindmap
  16. Zookeeper源码解析 -- 本地事务日志持久化之FileTxnLog
  17. 429. N-ary Tree Level Order Traversal**
  18. 技术文档的写作规范总结
  19. ssl证书到期时间查询方法
  20. cs python课程 加州大学_【北美名校CS课程整理系列】10. 数据结构与算法分析

热门文章

  1. html+css实现菜单栏缓慢下拉效果
  2. 如何提升客服平均响应时间?电商行业的你需要知道这3点
  3. DuerOS - DuerOS对话式人工智能系统唤醒
  4. Unity 家居摆放系统设计 (一)
  5. 09年齐鲁软件设计大赛题目
  6. 程序员去卖水果和混沌理论
  7. c++类指针赋值表达式必须是可修改的左值_C生万物,编程之本!(c语言基础笔记)
  8. 安装包UI美化之路-打包过程中自动给安装包签名(防误报)
  9. 机器学习实验——单变量线性回归(披萨价格预测问题)
  10. Django——admin