使用一个一维数组来模拟内存储空间,建立内存块来记录内存分配使用情况,通过随机产生进程及其所需要的内存来模拟真实的进程。通过给进程分配内存及回收来实现对动态不等长存储管理方法。
代码

#include "math.h"
#include "stdio.h"
#include "stdlib.h"
typedef struct MEMORY_BLOCK
{int name;//进程名称 int address;//地址空间 int length;int flag;//判断是否被占用 1为被占用   ,0为空闲 MEMORY_BLOCK *next;
}MEMORY_BLOCK;
int allocation(MEMORY_BLOCK *Header,int name,int time);//使用
int reclaim(int processname, MEMORY_BLOCK *Header);//回收
int selectRecycle(int processname, MEMORY_BLOCK *Header);//选择
int main()
{   #define NUM 10    //定义了10个进程 int time,i;MEMORY_BLOCK *Header,*t;Header=new MEMORY_BLOCK;  //初始化存储空间Header->name=-1;Header->address=0;Header->length=100;Header->flag=0;Header->next=NULL;srand(100);for(i=0;i<NUM;i++){time=rand()%20;   // 随机产生0~19的整数 allocation(Header,i,time);}t=Header;while(t!=NULL){printf("process name %d, address=%d, length=%d,flag=%d\n",t->name,t->address,t->length,t->flag);t=t->next;}int choose;while(1){printf("请输入你要回收的进程(按0结束):\n");scanf("%d",&choose);switch(choose){case 0:return 0;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:selectRecycle(choose,Header);break;default:printf("error!");}}return 1;
}
int selectRecycle(int processname, MEMORY_BLOCK *Header){MEMORY_BLOCK *temp,*t,*tt;t=Header;printf("回收 process name %d\n",processname);reclaim(processname,Header);t=Header;while(t!=0){printf("process name %d, address=%d, length=%d,flag=%d\n",t->name,t->address,t->length,t->flag);t=t->next;}
}
int reclaim(int processname, MEMORY_BLOCK *Header)
{MEMORY_BLOCK *temp,*t,*tt;t=Header;temp=t;while(t->name!=processname){temp=t;t=t->next;} if(t==0) {printf("no process");return 0;}else{ if(t->next!=NULL)if(temp->flag==0&&t->next->flag==0)//左右为空{  temp->name=-1;temp->length=temp->length+t->length+t->next->length;tt=t->next;temp->next=tt->next;delete tt;delete t;}else if(temp->flag==0) //左为空{temp->name=-1;temp->length=temp->length+t->length;temp->next=t->next;delete t;}else if(t->next->flag==0) //右为空{t->name=-1;t->length=t->length+t->next->length;t->flag=0;tt=t->next;t->next=tt->next;delete tt;}else {t->name=-1;t->flag=0;}else{if(temp->flag==0) //左为空{temp->name=-1;temp->length=temp->length+t->length;temp=t->next;delete t;}else {t->name=-1;t->flag=0;}}}return 1;
}
int allocation(MEMORY_BLOCK *Header,int name,int time)
{MEMORY_BLOCK *temp,*t,*tt;int thresh=2;t=Header;while(t!=0){if(t->length>time&&t->flag==0) break;t=t->next;}if(t==0) { printf("no memory :%d\n",name); return 0;}else{if(t->length-time>thresh) //分割{temp=new MEMORY_BLOCK;temp->name=-1;temp->flag=0;temp->length=t->length-time;temp->address=t->address+time;t->name=name;t->flag=1;t->length=time;temp->next=t->next;t->next=temp;}else  //直接分配{t->name=name;t->flag=1;         }}return 1;
}

实验五 存储管理实验

一、 实验类型
本实验为综合性实验。

二、 实验目的与任务
1) 理解动态异长存储分区资源管理
2) 掌握所需数据结构和管理程序
3) 了解各种存储分配算法的优点和缺点。
4) 编程实现动态不等长存储管理的模拟程序。

三、 预习要求
1) 进程控制的概念及内容
2) 熟悉存储管理的概念
3) 了解动态分区管理的思想,熟悉分配算法和回收算法
4) 熟悉c语言编程,指针及结构体等知识
5) 数据结构中的链表的建立及基本操作

四、 实验基本原理
使用一个一维数组来模拟内存储空间,建立内存块来记录内存分配使用情况,通过随机产生进程及其所需要的内存来模拟真实的进程。通过给进程分配内存及回收来实现对动态不等长存储管理方法。

五、 实验仪器与设备(或工具软件)
实验设备:计算机一台,软件环境要求:安装Red Hat Linux操作系统和gcc编译器。

六、 实验内容
1) 实验中使用的数据结构
(1) 内存块表,包括参数①进程名name;②起始地址 address;③长度 length;④标志 flag,表示该块是否被分配。
(2) 为简单起见,只设内存分配记录链表数据结构,用来记录内存分配与空闲情况。
2) 实验中假设有若干个进程,如5个,每个需要空间随机产生,为0~20之间的整数,进程名字实验者自己定义,可以是一个整数。
3) 其他一些参数,如内存空间的大小实验者自己定义,建议为100;
4) 为了得到清晰的实验结果,建议先给每个进程分配存储空间,后进行回收。
5) 程序的流程图如图5.1, 图5.2, 图5.3

图5.3回收流程图
6) 参考程序
#include “math.h”
#include “stdafx.h”
#include “stdio.h”
#include “stdlib.h”
typedef struct MEMORY_BLOCK
{
int name;
int address;
int length;
int flag;
MEMORY_BLOCK *next;
}MEMORY_BLOCK;
int allocation(MEMORY_BLOCK *Header,int name,int time);
int reclaim(int processname, MEMORY_BLOCK *Header);
int main()
{
#define NUM 10
int time,i;
MEMORY_BLOCK *Header,*t;
Header=new MEMORY_BLOCK; //初始化存储空间
Header->name=-1;
Header->address=0;
Header->length=100;
Header->flag=0;
Header->next=NULL;
srand(100);
for(i=0;i<NUM;i++)
{
time=rand()%20; // time=time%20;
allocation(Header,i,time);
}
t=Header;
while(t!=NULL)
{
printf(“process name %d, address=%d, length=%d,flag=%d\n”
,t->name,t->address,t->length,t->flag);
t=t->next;
}
int processname=3;//回收
printf(“回收 process name %d\n”,processname);
reclaim(processname,Header);
t=Header;
while(t!=0)
{
printf(“process name %d, address=%d, length=%d,flag=%d\n”
,t->name,t->address,t->length,t->flag);
t=t->next;
}
processname=4;
printf(“回收 process name %d\n”,processname);
reclaim(processname,Header);
t=Header;
while(t!=0)
{
printf(“process name %d, address=%d, length=%d,flag=%d\n”
,t->name,t->address,t->length,t->flag);
t=t->next;
}
return 1;
}
int reclaim(int processname, MEMORY_BLOCK *Header)
{
MEMORY_BLOCK *temp,*t,*tt;
t=Header;
temp=t;
while(t->name!=processname)
{
temp=t;
t=t->next;
}
if(t0) {printf(“no process”);return 0;}
else
{ if(t->next!=NULL)
if(temp->flag0&&t->next->flag0)//左右为空
{ temp->name=-1;
temp->length=temp->length+t->length+t->next->length;
tt=t->next;
temp->next=tt->next;
delete tt;
delete t;
}
else if(temp->flag0) //左为空
{
temp->name=-1;
temp->length=temp->length+t->length;
temp->next=t->next;
delete t;
}
else if(t->next->flag0) //右为空
{
t->name=-1;
t->length=t->length+t->next->length;
t->flag=0;
tt=t->next;
t->next=tt->next;
delete tt;
}
else {
t->name=-1;
t->flag=0;
}
else
{
if(temp->flag0) //左为空
{
temp->name=-1;
temp->length=temp->length+t->length;
temp=t->next;
delete t;
}
else {
t->name=-1;
t->flag=0;
}
}
}
return 1;
}

int allocation(MEMORY_BLOCK *Header,int name,int time)
{
MEMORY_BLOCK *temp,*t,*tt;
int thresh=2;
t=Header;
while(t!=0)
{
if(t->length>time&&t->flag0) break;
t=t->next;
}
if(t0) { printf(“no memory :%d\n”,name); return 0;}
else{

   if(t->length-time>thresh) //分割{temp=new MEMORY_BLOCK;temp->name=-1;temp->flag=0;temp->length=t->length-time;temp->address=t->address+time;t->name=name;t->flag=1;t->length=time;temp->next=t->next;t->next=temp;}else  //直接分配{t->name=name;t->flag=1;         }

}
return 1;
}
7) 编写测试程序,对存储分配表进行初始化,存储分配情况和回收一个进程的存储空间后的结果在屏幕上显示出来,显示的结果如图5.4所示。

图5.4模拟输出的示意图
七、 实验步骤
1) 进入vi编辑器
2) 在编译器中输入所要运行的程序代码
3) 退出编辑器,返回命令行输入方式,使用gcc编译器编译程序,获得能运行的目标程序。
4) 运行目标程序,查看运行结果。

八、 注意事项
1) 随机数的产生由rand()函数实现,rand()的输出随机数范围在0215之间,需要转换到020范围。
2) 节点的删除和插入方式。
3) 回收内存空间时,分四种情况讨论是否需要合并。

九、 实验报告要求
需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。对结果的分析主要讨论首次适应存储分配算法的优缺点,实验结果是如何体现的?

操作系统C语言模拟内存分配算法的模拟实现相关推荐

  1. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  2. Linux 操作系统原理 — 内存 — 内存分配算法

    目录 文章目录 目录 前文列表 内存碎片 伙伴(Buddy)分配算法 Slab 算法 虚拟内存的分配 内核态内存分配 vmalloc 函数 kmalloc 用户态内存分配 malloc 申请内存 用户 ...

  3. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  4. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  5. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  6. 操作系统-动态内存分配算法

    内存分配算法 1.首次适应算法(FF) 2.循环首次适应算法(NF) 3.最佳适应算法(BF) 4.最坏适应算法(WF) 本程序使用前端技术实现(html+css+JavaScript) 新建以下文件 ...

  7. 嵌入式操作系统内核原理和开发(内存分配算法)

    内存分配是操作系统必须面对的一个环节,除非这个系统本身不需要内存安排,所有业务可以通过全局数据和堆栈搞定.内存分配其实不困难,但是由内存引申出来的东西就比较复杂了.早前没有MMU,系统本身的空间和用户 ...

  8. java 线程 内存分配内存_漫谈JAVA语言的内存分配

    在说JAVA语言的内存分配之前,我们先聊聊OS的Memory Management,这是学习操作系统课程的一个重要内容.从这里开始理解内存分配有利于理解的更深入. 我们知道物理内存是由page 和se ...

  9. Tcmalloc内存分配算法的分析

    一.介绍 tcmalloc是Google搞的一个内存管理算法,据说分配速度要比glibc自带的malloc快很多.但是客观分析来说,只是在某些场景下是如此.tmalloc具有现代内存管理器的特点,可以 ...

最新文章

  1. 【c++】22. STL容器的底层实现详解
  2. 强如 Disruptor 也发生内存溢出?
  3. oracle rman恢复表空间,Oracle数据库RMAN恢复之表空间和数据块介质的恢复
  4. the future of real-time rendering hardware
  5. VirtualBox安装完Linux却进不了系统
  6. 在手机上查询药品信息?PEP移动掌上药物信息参考
  7. 滴滴滴,ITester软件测试小栈所有资源放送!
  8. python四种可变类型_python中可变类型与不可变类型 + 类型转换
  9. Redisson分布式锁使用采坑记
  10. 安装杀毒软件后计算机运行速度慢,我计算机安装杀毒软件后开机启动很慢
  11. [转]验证码识别技术
  12. oCPC实践录 | 好难理解的oCPC成本控制算法(1)
  13. 谷歌此号码无法验证解决
  14. 【高等数学】下册 第十二章 第二节 常数项级数的审敛法
  15. [牛客练习] 深信服校园招聘c/c 软件开发H卷 Apare_xzc
  16. 新年金市上行动力堪忧 美债收益率大幅上涨
  17. JSON转List集合
  18. 互联网学习记录:三件套_Javascript
  19. 如何用A4纸排版打印并制作成四分之一大小的册子(简易说明书)
  20. 清华计算机系19级研究生状元,2019年各省市高考状元去向统计,清华姚班受青睐,多达五人考入...

热门文章

  1. 大学生PHP简单网站制作方法 学生PHP网站作业 动态PHP毕业设计 PHP MYSQL在线留言板网站源码
  2. Java + Swing + MySQL实现图书管理系统
  3. vue 2个方法先后执行_《拖延心理学》:2个对策,3个法宝,6个方法,教你战胜拖延...
  4. 服务器只读团体字信息,服务器团体名配置
  5. 用PS做一个好看的图案
  6. FreeRTOS内存不够
  7. 电脑内存不够?磁盘、硬盘
  8. 电大网考计算机基础知识,2017年电大计算机网考试题及答案
  9. C语言计算三角形的面积
  10. Window: win10 如何更改管理员名称(修改登录用户名)