操作系统

您所在的位置:网站首页 内存插槽的作用 操作系统

操作系统

#操作系统| 来源: 网络整理| 查看: 265

cout continue; } }

}

二:首次适应算法

动态分区分配算法

一、实验内容

编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。

二、实验目的

主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。

三、实验原理

模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。

(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:

 

0

5k

10k

14k

26k

32k

 

 

512k

 

操作系统

作业1

作业3

空闲区

作业2

 

空闲区

 

 

为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:

 

 

起    址

长    度

状      态

第一栏

14 K

12 K

未 分 配

第二栏

32 K

96 K

未 分 配

M

M

M

M

 

 

 

其中,起址——指出一个空闲区的主存起始地址。

     长度——指出从起始地址开始的一个连续空闲的长度。

     状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。

 (2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。

(3) 采用最先适应算法(顺序分配算法)分配主存空间。

按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。

由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。

(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。

(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:

作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,

作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。    

一、动态内存分配的几种分配方式(具体可以点粉色字体链接)

动态内存分配有四种分配方式,本次实验采用首次适应算法

  二、用C语言模拟实验首次适应算法 (1)说一下思路吧,我的思路是利用数据结构中的二叉树

①打印分区表的时候,只需遍历一遍二叉树,然后输出度为0的节点(没有孩子的节点)

②作业完成后,释放空间时,通过插入时候给的作业名称来遍历、寻找到该节点,将其状态修改为free即可

注意:

还有就是释放后,空闲区的合并问题。由于本次实验所插入、释放作业后,无需合并,这点在本次实验忽略(虽然题目有要求。。)

(2)代码块

[cpp]  view plain  copy //动态内存分配    #include   int temp=0;//定义一个全局变量!这个变量起很大作用   typedef struct _BiTNode//定义 表 的结构体    {       int address;//首地址        int length;//空闲区长度        bool state;//区域状态 “1”表示已分配, “0”表示未分配        int homework; //作业名        struct _BiTNode *lchild;//指向左孩子的指针        struct _BiTNode *rchild;//右孩子    }BiTNode,*pBiTree;   void Init_BiTree(pBiTree l)   {              l->address = 5;       l->length = 507;       l->state = 0;           l->homework=NULL;       l->lchild = NULL;       l->rchild = NULL;       printf("初始化完成!\n");   }    int Print(pBiTree p)   {          printf("\n\t\t%d\t%d\t",p->address,p->length);       if(p->state==1)           printf("Busy  \t");       else           printf("Free  \t");       if(p->homework!=0)           printf("%d\n",p->homework);       else            printf("\n");    }   //先序遍历     void PreOrder(pBiTree p)     {          if(p != NULL)         {                    if(!p->lchild&&!p->rchild)                     Print(p);  //输出该结点           PreOrder(p->lchild);  //遍历左子树              PreOrder(p->rchild); //遍历右子树         }     }     void Insert_PreOrder(pBiTree p,int length,int homework)//插入新作业     {          if(p != NULL)         {                if((p->state==0)&&(lengthlength)&&(!p->lchild)&&(!p->rchild)&&temp==0)//判断节点是否有左右孩子,是否小于空闲区长度,是否状态为0(表示区域无作业运行)            {                 pBiTree  x1 =new BiTNode;//进行插入,动态申请两个空间 x1,x2                pBiTree  x2 =new BiTNode;               x1->homework=homework;//x1为作业                x2->homework=NULL;//x2为剩余的空闲区                x1->address=p->address;//把原空闲区的首地址给作业的首地址                x1->state=1;//作业的状态改为1                x1->length=length;//作业的长度为传入的长度                x2->address=x1->address+length;//新空闲区的首地址为 x1首地址与x1长度之和                x2->length=p->length-x1->length;               p->lchild=x1;               p->rchild=x2;               x2->state=0;               x1->lchild=NULL;               x1->rchild=NULL;               x2->rchild=NULL;               x2->lchild=NULL;                temp=1;           }                  else           {                  Insert_PreOrder(p->lchild,length,homework);  //遍历左子树                  Insert_PreOrder(p->rchild,length,homework); //遍历右子树             }        }     }    void Delect_PreOrder(pBiTree p,int homework) //遍历修改,将状态修改为0。即为空闲区    {          if(p != NULL)         {                    if(p->homework==homework)//当查询到作业名相同的作业。进行修改            {               p->homework=NULL;//将作业名修改为空                p->state=0;//将作业名状态修改为空闲            }          Delect_PreOrder(p->lchild,homework);  //遍历左子树          Delect_PreOrder(p->rchild,homework); //遍历右子树         }     }     int main()   {          BiTNode l;       Init_BiTree(&l);       //初始化        printf("\n   初始化:\t首地址\t长度\t状态\t作业名\n");          PreOrder(&l);       //插入作业1        temp=0;       Insert_PreOrder(&l,300,1);       printf("\n插入作业1:\t首地址\t长度\t状态\t作业名\n");       PreOrder(&l);         //插入作业2    算法 include ios int struct list io request ci 写下你的评论吧 ! 推荐阅读 web Web前端工程师 前端开发,不仅仅是需要会写页面而已,还需要具备很多技能,现做如下总结:会点设计,不要求精湛,处理图片,设计个小广告是要的;精通HTML+CSS,并能快速处理各浏览器兼容问题;熟练掌握Javascrip ... [详细] 蜡笔小新   2023-01-26 11:46:51 jsp Mahout概述 为了保持意思的准确性,保留了原有的英文描述。You’veprobablyalreadynoticedMahouthasalotofthingsgoingonatdifferentl ... [详细] 蜡笔小新   2023-01-28 08:51:14 jsp 重启tomcat shell #!binbash #1、判断服务是否可用2、不可用重启tomcat #*30****homewsmrestart.shhomewsmrestart.log #停止tomcat ... [详细] 蜡笔小新   2023-01-27 23:20:46 web HTTP协议HTTP请求中的常用请求字段和HTTP的响应状态码及响应头 http:blog.csdn.netqxs965266509articledetails8082810用于HTTP请求中的常用请求头字段Accept:用于高速服务器,客户机支持的数 ... [详细] 蜡笔小新   2023-01-27 20:41:06 web webservice和spring相结合 webservice和spring相结合 恢复内容开始(一):首先先导入架包自己用的是2.6.2(二)修改web.xml(三)在spring配置文件中配置接口并且进行发布 ... [详细] 蜡笔小新   2023-01-27 20:35:39 php centos7 docker 修改Nginx文件过程详解-Nginx centos7docker修改Nginx文件过程详解是千自学中一篇关于Nginx的文章简介: 1.docker安装nginx:docker安装Nginx还是很简单的,可以参考百度文章,或者参照docker安装mysql:https:www.jb51.netarticle144426.htm2.安装完后进入到docker容器:执行命 ... [详细] 蜡笔小新   2023-01-27 20:16:38 php 从Android Studio自动提交并推送到GitHub 如何解决《从AndroidStudio自动提交并推送到GitHub》经验,为你挑选了1个好方法。 ... [详细] 蜡笔小新   2023-01-27 16:14:33 php 错误:找不到参数的方法annotationProcessor()[org.apache.logging.log4j.core] 如何解决《错误:找不到参数的方法annotationProcessor()[org.apache.logging.log4j.core]》经验,求大佬解答? ... [详细] 蜡笔小新   2023-01-27 15:14:58 web Vue.js学习总结(一.) 1、什么是Vue.js:Vue.js是一套构建用户界面的渐进式框架。Vue的核心库只关注视图层Vue.js的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件2、单页应 ... [详细] 蜡笔小新   2023-01-25 18:02:54 jsp 互联网技能分类 互联网技能分类 前言:这里所包含的是互联网上职业技能的分类。职位表请查看互联网职业分类。根据我们网站技术情况,这里是大致的分类,某些专门的技能没有列出,比如会计,人力资源等,这些多少和我们网站会员 ... [详细] 蜡笔小新   2023-01-20 12:51:50 web hadoop的介绍以及发展历史 hadoop的介绍以及发展历史 hadoop的介绍以及发展历史 ... [详细] 蜡笔小新   2023-01-17 16:09:58 jsp 跟大神走 本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等软件的安装与卸载,精通CSS、JavaScript、PHP、ASP、C、C++、C#、Java、Ruby、Perl、Lisp ... [详细] 蜡笔小新   2023-01-16 11:11:21 range 使用游侠保护nifi时出现SSL证书错误 如何解决《使用游侠保护nifi时出现SSL证书错误》经验,为你挑选了1个好方法。 ... [详细] 蜡笔小新   2023-01-13 15:42:54 web 大数据开发生态圈之Apache 大数据开发生态圈之Apache Hadoop概述Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。Ha ... [详细] 蜡笔小新   2023-01-12 16:37:53 php 一、Hadoop入门概述 一、Hadoop入门概述 一、Hadoop是什么二、Hadoop发展历史Google是Hadoop的思想之源(Google在大数据方面的三篇论文)GFS——;gt;HDFSMap-Redu ... [详细] 蜡笔小新   2023-01-04 15:06:30 devbox 鲁有军_644 这个家伙很懒,什么也没留下! Tags | 热门标签 testing emoji char include iostream node.js stream chat frameworks hashset usb tags typescript runtime actionscrip ascii client range less php uri export timezone dll select jsp bytecode merge web substring RankList | 热门文章 1实用方法 2ASP.NET Core中怎么利用SignalR实现消息推送 3 (高频)139 4uva 11796 5「C++」string类模拟实现 6比较深入的认识一下textrange 7西安前端交流会 - 【前端求职、就业、面试技巧】- 第5期-2015.3.29 报名了 8无监督神经机器翻译UnsupervisedNeuralMachineTranslationwithWeightSharing 9MyBatislimit分页设置 10.Net Core vs .Net Framework 如何为一个应用程序选择一个运行时 11刚升四角,庆,准备拜师!! 12N1CTF2020WebSignIn 13C++中避免使用宏定义常量或函数​的原因是什么 14node.js 报错 throw new TypeError(‘app.use() requires a middleware function‘) 15c – 浮点乘法:AVX对SSE的失速速度? PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具 Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有      


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3