实验四 主存空间的分配和回收

一、目的和要求

1.1. 实验目的

用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

1.2. 实验要求

采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

(2)或在程序运行过程,由用户指定申请与释放。

(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

二、实验内容

根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

三、 实验环境

可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

四、实验过程与结果

#include"stdio.h"
#include"stdlib.h"
struct{float startaddress; /*已分分区起始地址*/float length; /*已分分区长度,*/int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[10]; /*已分配区表*/struct{float startaddress; /*空闲区起始地址*/float length; /*空闲区长度*/int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}free_table[10]; /*空闲区表*/void input();
int CyclicAdaptation(char str,float leg,int pre);//分配主存空间函数循环适应
void FirstAdaptation(char str,float leg);//分配主存空间函数首次适应
void reclaim(char str);//回收主存函数void input()
{int i;printf("\n    输出空闲区表 \n起始地址 分区长度 标志\n");for(i=0;i<10;i++){printf("%6.0f%9.0f%6d\n",free_table[i].startaddress,free_table[i].length, free_table[i].flag);}printf("\n 按任意键,输出已分配区表\n");getchar();printf("\n    输出已分配区表 \n起始地址 分区长度 标志\n");for(i=0;i<10;i++){if(used_table[i].flag!=0)printf("%6.0f%9.0f%6c\n",used_table[i].startaddress,used_table[i].length, used_table[i].flag);elseprintf("%6.0f%9.0f%6d\n",used_table[i].startaddress,used_table[i].length, used_table[i].flag);}
}
int uflag;//分配表标志
int fflag;//空闲表标志
int CyclicAdaptation(char str,float leg,int pre)
{fflag=0;int k,i;for(i=pre;i<10;i++){if(free_table[i].flag==1 && free_table[i].length>=leg){fflag=1;break;}}if(fflag==0)printf("\n 没有满足条件的空闲区\n");else{ for(k=0;k<10;k++){if(used_table[k].flag==0){used_table[k].length=leg;used_table[k].startaddress=free_table[i].startaddress;used_table[k].flag=str;free_table[i].startaddress=free_table[i].startaddress+leg;free_table[i].length=free_table[i].length-leg;free_table[i].flag=1;break;}}}return i;
}
void FirstAdaptation(char str,float leg)
{fflag=0;int k,i;for(i=0;i<10;i++){if(free_table[i].flag==1 && free_table[i].length>=leg){fflag=1;break;}}if(fflag==0)printf("\n 没有满足条件的空闲区\n");else{for(k=0;k<10;k++){if(used_table[k].flag==0){used_table[k].length=leg;used_table[k].startaddress=free_table[i].startaddress;used_table[k].flag=str;free_table[i].startaddress=free_table[i].startaddress+leg;free_table[i].length=free_table[i].length-leg;free_table[i].flag=1;break;}}}}
void reclaim(char str)
{float uend_address;float fend_address;uflag=0;fflag=0;int k,i;for(k=0;k<10;k++){if(used_table[k].flag==str){uflag=1;break;}}if(uflag==0)printf("\n 找不到该进程!\n");else{for(i=0;i<10;i++){uend_address=used_table[k].startaddress+used_table[k].length;fend_address=free_table[i].startaddress+free_table[i].length;if(used_table[k].startaddress==fend_address)//上邻
            {fflag=1;free_table[i].length=free_table[i].length+used_table[k].length;free_table[i].flag=1;used_table[k].flag=0;used_table[k].length=0;used_table[k].startaddress=0;printf("\n已回收!\n");break;}else{if(free_table[i].startaddress==uend_address)//下邻
                {fflag=1;free_table[i].startaddress=used_table[k].startaddress;free_table[i].length=free_table[i].length+used_table[k].length;free_table[i].flag=1;used_table[k].flag=0;used_table[k].length=0;used_table[k].startaddress=0;printf("\n已成功!\n");break;}}}if(fflag==0)//上下领都没有空闲
        {i=0;for(i=0;i<10;i++){if(free_table[i].flag==0){free_table[i].startaddress=used_table[k].startaddress;free_table[i].length=used_table[k].length;free_table[i].flag=1;used_table[k].length=0;used_table[k].flag=0;used_table[k].startaddress=0;break;}}printf("\n已成功!\n");}}
}int main()
{int i;float length;char name; /*空闲分区表初始化:*/int algorithm;int operate;int pre=0;//循环首次适应算法的前一次扫描空闲表处,初始为0free_table[0].startaddress=5120;free_table[0].length=51200;free_table[0].flag=1;for(i=1;i<10;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;i<10;i++)used_table[i].flag=0;input();printf("\n Please choose algorithm  1.首次适应算法 2.循环首次适应算法\n");scanf("%d",&algorithm);if(algorithm==1){while(1){printf("\n Please choose operation  1.分配 2.回收\n");scanf("%d",&operate);if(operate==1){/*a=1分配主存空间*/printf("\n 输入进程名和作业所需长度: ");scanf("%*c%c%f",&name,&length);FirstAdaptation(name,length);/*分配主存空间*/}else{/*a=2回收主存空间*/printf("\n 输入要回收分区的进程名: ");scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/}input();}}else{while(1){printf("\n Please choose operation  1.分配 2.回收\n");scanf("%d",&operate);if(operate==1){/*a=1分配主存空间*/printf("\n 输入进程名和作业所需长度: ");scanf("%*c%c%f",&name,&length);pre=CyclicAdaptation(name,length,pre);/*分配主存空间*/}else{/*a=2回收主存空间*/printf("\n 输入要回收分区的进程名: ");scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/}input();}}return 0;
}

运行结果:

五、实验总结

主存空间的分配与回收这个实验思路非常清晰,按着思路来编写程序就可以了。参考了别人的一些代码,对主存空间的分配与回收更加熟悉了。

转载于:https://www.cnblogs.com/jun-28blog/p/4568673.html

实验四 主存空间的分配和回收相关推荐

  1. 39,叶慧敏 实验四 主存空间的分配和回收模拟

    一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者.当作业撤离归还主存资源时 ...

  2. 《操作系统》实验报告——主存空间的分配与回收

    理论知识 Linux--Linux C语言编程基础知识 一.实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收. 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分 ...

  3. 操作系统——实验叁——主存空间的分配与回收

    一. 实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二. 实验内容 主存是中央处理机能直接存取指 ...

  4. 实验四、主存空间的分配和回收模拟

    实验四.主存空间的分配和回收模 物联网工程  王鸾  201306104128 一.        实验目的        为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须 ...

  5. 操作系统实验三:主存空间的分配与回收

    实验三:主存空间的分配与回收 一.实验目的 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二.实验内容 主存是中央处理机能直接存取指令和数据的存储器.能否合理而有效 ...

  6. 【操作系统】主存空间的分配和回收

    实验一.主存空间的分配和回收实验 专业:商业软件工程  姓名:杨晶晶  学号:201406114102 一.        实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方 ...

  7. linux课程设计题目主存空间的分配与回收,可变分区分配与回收,哈尔滨理工大学操作系统课程设计报告.doc-资源下载在线文库www.lddoc.cn...

    可变分区分配与回收,哈尔滨理工大学 操作系统课程设计报告.doc 哈 尔 滨 理 工 大 学 课 程 设 计 ( 操 作 系 统 ) 题 目 可变分区分配与回收 (首次适应算法) 班 级 计算机科学与 ...

  8. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  9. 六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)

    一.概述 二.操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管些什么呢? 1. 内存空间的分配与回收 连续分配:指为用户进程分配的必须是一个连续的内存空间. 1. 单一连续分配 在单一连续 ...

最新文章

  1. 1.3 Quick Start中 Step 7: Use Kafka Connect to import/export data官网剖析(博主推荐)
  2. 学习新技能时,大脑在如何发生改变?
  3. 某linux主机的/etc/rc.d/rc.inet1文件中有如下语句,请修正错误,并解释其内容。
  4. LeetCode 面试题 10.02. 变位词组
  5. 大数据集合求交集_Java8 实现ArrayList求交集并集差集
  6. php amazon-s3_推荐亚马逊电影-一种协作方法
  7. 2016年中国国际信息通信展览会在北京开幕
  8. mysql 主从 启动顺序_MySQL生产环境下的主从复制启动项
  9. 【Android命令行】jarsigner参数详解
  10. 使用mybatis-generator自动生成代码(附GitHub下载地址)
  11. php 查看session 时间,php中session过期时间设置及session回收机制介绍
  12. 【圣诞快乐】闻到圣诞的气息了,喜欢的节日在慢慢来临~祝大家Merry Christmas。
  13. 万字综述自动驾驶数据闭环
  14. Gradient Normalization在多任务学习中的优化实践
  15. 苹果Mac系统彻底关闭开机声音duang~
  16. Wall following algorithm机器人沿墙算法(一)
  17. 《寒江独钓windows内核安全编程》学习笔记之一
  18. 自己最近在补天测试总结的一般思路
  19. 倍福TwinCAT3 的OPC_UA通信测试案例
  20. 认识微型计算机 ppt,全国“xx杯”计算机应用基础类说课大赛优秀作品:认识微型计算机的组成 2.ppt...

热门文章

  1. 使用程序解决一道逻辑推理题
  2. 深度神经网络中的局部响应归一化LRN简介及实现
  3. 非对称加密算法RSA公钥私钥的模数和指数提取方法
  4. 小插件 打开Android程序动画,android-单击小部件后如何启动活动?
  5. mysql 的man参数详解_pacman命令详解
  6. 查看linux主机是否安装宋体码,Linux 安装宋体字体的简单办法
  7. linux做预警机制,预警通告:Linux内核中TCP SACK机制远程DoS
  8. linux如何查看指定目录下文件内容,Linux 系统下通过关键词查找指定目录下的文件内容...
  9. python实现平衡二叉树_LeetCode 110. 平衡二叉树 | Python
  10. python怎么读_如何用Python读写文件