《操作系统》实验报告——主存空间的分配与回收
理论知识
Linux——Linux C语言编程基础知识
一、实验目的
采用可变式分区管理,使用最佳适应算法实现主存的分配与回收。
通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收。
二、实验内容
主存是中央处理机能直接存取指令和数据的存储器。能否合理而有效地使用主存,在很大程度上将影响到整个计算机系统的性能。本实验采用可变式分区管理,使用首次或最佳适应算法实现主存空间的分配与回收。要求采用分区说明表进行。
三、代码及运行结果分析
流程图
源代码
#include <stdio.h>
#include <string.h>
#define MAX 600 //设置总内存大小为512kstruct partition {char pn[10];//分区名字int begin;//起始地址int size;//分区大小int end;//结束地址char status;//分区状态
};
struct partition part[MAX];
int p = 0; //标记上次扫描结束处void Init()//初始化分区地址、大小以及状态
{int i;for ( i = 0; i < MAX; i++ )part[i].status = '-';strcpy( part[0].pn, "SYSTEM" );part[0].begin = 0;part[0].size = 100;part[0].status = 'u';strcpy( part[1].pn, "-----" );part[1].begin = 100;part[1].size = 100;part[1].status = 'f';strcpy( part[2].pn, "作业1" );part[2].begin = 200;part[2].size = 50;part[2].status = 'u';strcpy( part[3].pn, "-----" );part[3].begin = 250;part[3].size = 50;part[3].status = 'f';strcpy( part[4].pn, "作业2" );part[4].begin = 300;part[4].size = 100;part[4].status = 'u';strcpy( part[5].pn, "-----" );part[5].begin = 400;part[5].size = 200;part[5].status = 'f';for ( i = 0; i < MAX; i++ )part[i].end = part[i].begin + part[i].size-1;
}void Output( int i ) //以行的形式输出结构体的数据
{printf( "\t%s", part[i].pn );printf( "\t%d", part[i].begin );printf( "\t%d", part[i].size );printf( "\t%d", part[i].end );printf( "\t%c", part[i].status );
}void display() //显示分区{int i;int n; //用n来记录分区的个数printf("\n");printf( "\n 已分配分区表Used:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;if ( part[i].status == 'u' ){printf( "\n\tNo.%d", n );Output( i );n++;// 记录已分配使用的分区个数}}printf("\n");printf( "\n 空闲分区表Free:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;if ( part[i].status == 'f' ){printf( "\n\tNo.%d", n );Output( i );n++; //记录空闲分区的个数}}printf("\n");printf( "\n 内存使用情况,按起始址增长的排:" );//printf( "\n printf sorted by address:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;printf( "\n\tNo.%d", n );Output( i );n++;//记录已分配分区以及空闲分区之和的总个数}
}void Fit( int a, char workName[], int workSize ) //新作业把一个分区分配成两个分区:已使用分区和空闲分区
{int i;for ( i = MAX; i > a + 1; i-- ){//通过逆向遍历,把在a地址后的所有分区往后退一个分区,目的在于增加一个分区if ( part[i - 1].status == '-' )continue;part[i]=part[i-1];}strcpy( part[a + 1].pn, "-----" );part[a + 1].begin = part[a].begin + workSize;part[a + 1].size = part[a].size - workSize;part[a + 1].end = part[a].end-1;part[a + 1].status = 'f';strcpy( part[a].pn, workName );part[a].size = workSize;part[a].end = part[a].begin + part[a].size-1;part[a].status = 'u';
}
void fenpei() // 分配
{int i;int a;int workSize;char workName[10];int pFree;printf( "\n请输入作业名称:" );scanf( "%s", &workName );for(i=0;i<MAX;i++){if(!strcmp(part[i].pn,workName))//判断作业名称是否已经存在{printf("\n作业已经存在,不必再次分配!\n");return;}}printf( "请输入作业大小(k):" );scanf( "%d", &workSize );for ( i = 0; i < MAX; i++ ){//通过循环在空闲区找是否有适合区间存储作业if ( part[i].status == 'f' && part[i].size >= workSize ){pFree = i;break;}}if ( i == MAX ){printf( "\n该作业大小超出最大可分配空间" );getch();return;}for ( i = 0; i < MAX; i++ )//最佳适应算法if ( part[i].status == 'f' && part[i].size >= workSize )if ( part[pFree].size > part[i].size )pFree = i;//通过遍历所有区间,每次都找到最小空闲分区进行分配Fit( pFree, workName, workSize );printf( "\n分配成功!" );
}
void hebing() //合并连续的空闲分区
{int i = 0;while ( i != MAX - 1 ){for ( i = 0; i < MAX - 1; i++ ){if ( part[i].status == 'f' )if ( part[i + 1].status == 'f' ){part[i].size = part[i].size + part[i + 1].size;part[i].end = part[i].begin + part[i].size-1;i++;for ( i; i < MAX - 1; i++ ){if ( part[i + 1].status == '-' ){part[i].status = '-';break;}part[i]=part[i+1];}part[MAX - 1].status = '-';break;} }}
}
void huishou() // 回收分区
{int i;int number;int n=0;printf( "\n请输入回收的分区号:" );scanf( "%d", &number );if ( number == 1 ){printf( "\n系统分区无法回收" );return;}for ( i = 0; i < MAX; i++ )//通过循环查找要回收的已使用分区区号{if ( part[i].status == 'u' ){n++;if ( n == number ){strcpy( part[i].pn, "-----" );part[i].status = 'f';}}}if ( i == MAX - 1 ){printf( "\n找不到分区" );return;}hebing();//合并连续的空闲分区printf( "\n回收成功!" );
}
void main()
{int selection;Init();printf( "初始化完成,设内存容量%dk", MAX );printf( "\n系统文件从低址存储,占%dk", part[0].size );while ( 1 ){printf( "\n----------选择----------" );printf( "\n| 0、退出系统 |" );printf( "\n| 1、显示分区 |" );printf( "\n| 2、分配分区 |" );printf( "\n| 3、回收分区 |" );printf( "\n------------------------");printf( "\n请选择 > " );while ( 1 ){scanf( "%d", &selection );if ( selection == 0 ||selection == 1 || selection == 2 || selection == 3 )break;printf( "输入错误,请重新输入:" );}switch ( selection ){case 0:exit(0); //退出系统break;case 1:display(); //显示分区break;case 2:fenpei(); //分配作业break;case 3:huishou(); //回收分区break;default:break;}printf("\n"); }
}
运行结果
四、实验心得
理解在可变式分区管理方式下,如何实现主存空间的分配与回收。
掌握使用最佳适应算法实现主存的分配与回收。
参考文章
操作系统——实验四:主存空间的分配和回收
主存储器空间的分配和回收
操作系统实验报告---主存分配与回收(最佳适应算法)
《操作系统》实验报告——主存空间的分配与回收相关推荐
- 操作系统——实验叁——主存空间的分配与回收
一. 实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二. 实验内容 主存是中央处理机能直接存取指 ...
- 实验四 主存空间的分配和回收
实验四 主存空间的分配和回收 一.目的和要求 1.1. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解. 1.2. 实验要求 采用连续分配方式之动态分区分 ...
- 39,叶慧敏 实验四 主存空间的分配和回收模拟
一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者.当作业撤离归还主存资源时 ...
- 操作系统实验三:主存空间的分配与回收
实验三:主存空间的分配与回收 一.实验目的 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二.实验内容 主存是中央处理机能直接存取指令和数据的存储器.能否合理而有效 ...
- 【操作系统】主存空间的分配和回收
实验一.主存空间的分配和回收实验 专业:商业软件工程 姓名:杨晶晶 学号:201406114102 一. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方 ...
- 实验四、主存空间的分配和回收模拟
实验四.主存空间的分配和回收模 物联网工程 王鸾 201306104128 一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须 ...
- linux课程设计题目主存空间的分配与回收,可变分区分配与回收,哈尔滨理工大学操作系统课程设计报告.doc-资源下载在线文库www.lddoc.cn...
可变分区分配与回收,哈尔滨理工大学 操作系统课程设计报告.doc 哈 尔 滨 理 工 大 学 课 程 设 计 ( 操 作 系 统 ) 题 目 可变分区分配与回收 (首次适应算法) 班 级 计算机科学与 ...
- c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...
1 #include 2 #include 3 #define MAX 600 //设置总内存大小为512k 4 5 structpartition {6 char pn[10];//分区名字 7 i ...
- 可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...
一.实验目的 ( 1 )深入了解可变分区存储管理方式的内存分配回收的实现. 二.实验内容 编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表, 并采用最优适应算法完成内存的分配与回收 ...
最新文章
- POJ 2231 Moo Volume(递推、前缀和)
- 2021算法竞赛入门班第九节课【线段树】练习题
- 仿真环境Mininet的搭建
- navigator对象介绍
- 大话WinCE与WinXP应用程序开发的差异性
- mysql存钱用什么类型_电脑液晶显示器面板类型有哪些,显示器用什么面板比较好?...
- 数据结构与算法——栈、队列、堆汇总整理
- GIS基础软件及操作(十二)
- webSocket 干货分享 附带项目源码
- 雨木林风 的 Ylmf OS
- 计算机访问共享打印机无权限访问,Windows10电脑系统共享打印机无访问权限?详细解决步骤...
- 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办?
- 今天不忙,咱们来说说域名是什么意思?
- Shiro(1)--Shiro简介
- Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树
- 69.46.68.92 index.php,【英联雅思】搞定四六级又战托福雅思?先测测自己的词汇量有多少吧~...
- 微信公众号怎么清缓存
- 宏转录组测序数据菌株层面的分析软件总结
- [java]如何在项目中用好log4J写项目日志
- 网页的首屏标准你了解多少?
热门文章
- 使用ModelForm上传图片
- mybatis转义反斜杠_Shell echo命令:输出字符串
- python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
- kali2018安装教程_Kali Linux + Windows10双系统安装教程
- 核密度估计python_非参数估计:核密度估计KDE
- linux是基于什么的软件模式进行发布的,《Linux操作系统与应用项目教程》习题.doc...
- cpp mysql fetch row_Linux下C++访问MySQL
- esxi虚拟化集群_ProxmoxVE 之集群安装(V5.2)
- mysql 创建临时表 时间类型_MySQL问答系列之什么情况下会用到临时表
- mysql查看执行计划_如何查看MySQL的执行计划