理论知识

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. 操作系统——实验叁——主存空间的分配与回收

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

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

    实验四 主存空间的分配和回收 一.目的和要求 1.1. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解. 1.2. 实验要求 采用连续分配方式之动态分区分 ...

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

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

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

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

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

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

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

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

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

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

  8. c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...

    1 #include 2 #include 3 #define MAX 600 //设置总内存大小为512k 4 5 structpartition {6 char pn[10];//分区名字 7 i ...

  9. 可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...

    一.实验目的 ( 1 )深入了解可变分区存储管理方式的内存分配回收的实现. 二.实验内容 编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表, 并采用最优适应算法完成内存的分配与回收 ...

最新文章

  1. POJ 2231 Moo Volume(递推、前缀和)
  2. 2021算法竞赛入门班第九节课【线段树】练习题
  3. 仿真环境Mininet的搭建
  4. navigator对象介绍
  5. 大话WinCE与WinXP应用程序开发的差异性
  6. mysql存钱用什么类型_电脑液晶显示器面板类型有哪些,显示器用什么面板比较好?...
  7. 数据结构与算法——栈、队列、堆汇总整理
  8. GIS基础软件及操作(十二)
  9. webSocket 干货分享 附带项目源码
  10. 雨木林风 的 Ylmf OS
  11. 计算机访问共享打印机无权限访问,Windows10电脑系统共享打印机无访问权限?详细解决步骤...
  12. 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办?
  13. 今天不忙,咱们来说说域名是什么意思?
  14. Shiro(1)--Shiro简介
  15. Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树
  16. 69.46.68.92 index.php,【英联雅思】搞定四六级又战托福雅思?先测测自己的词汇量有多少吧~...
  17. 微信公众号怎么清缓存
  18. 宏转录组测序数据菌株层面的分析软件总结
  19. [java]如何在项目中用好log4J写项目日志
  20. 网页的首屏标准你了解多少?

热门文章

  1. 使用ModelForm上传图片
  2. mybatis转义反斜杠_Shell echo命令:输出字符串
  3. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
  4. kali2018安装教程_Kali Linux + Windows10双系统安装教程
  5. 核密度估计python_非参数估计:核密度估计KDE
  6. linux是基于什么的软件模式进行发布的,《Linux操作系统与应用项目教程》习题.doc...
  7. cpp mysql fetch row_Linux下C++访问MySQL
  8. esxi虚拟化集群_ProxmoxVE 之集群安装(V5.2)
  9. mysql 创建临时表 时间类型_MySQL问答系列之什么情况下会用到临时表
  10. mysql查看执行计划_如何查看MySQL的执行计划