操作系统内存分配算法模拟实现_第1页
操作系统内存分配算法模拟实现_第2页
操作系统内存分配算法模拟实现_第3页
操作系统内存分配算法模拟实现_第4页
操作系统内存分配算法模拟实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.专业整理.实验名称内存分配与回收算法实现同组人姓名实验性质基本操作-验证性综合性设计性实验日期2010-5-17实验成绩教师评价:实验预习口实验操作口实验结果口实验报告口 其它口教师签名:一、实验目的及要求1)掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存2)系统如何为进入内存的作业分配内存空间,实现多道作业何时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU作业运行完成离开系统时,系统如何进行内存回收,计算进程周转时间。3)掌握各种调度算法,以及实现所需的各种数据结构。二、实验内容根据给定的动态分区分配算法流程图,用你熟悉的计算机编程语言编写一程序,该程

2、 序实现内存的合理分配后回收。三、主要设备及软件PC Windows2000操作系统、Linux操作系统四、实验流程、操作步骤或核心代码、算法片段 1、分配算法流程出空闲分区块类:class FreeBlock空闲分区链类:class FreeList内存分配回收算法类:class MemoryMa nager测试类(主类):class TestForMemManage具体实现请允许我先列出核心部分,内存分配回收算法类的实现:package com.kaip in g.memoryma nage;/ 个人包import java.util.Sea nner;public class Memor

3、yMa nager FreeList flist; /空闲分区类对象public MemoryMa nager()flist = new FreeList();flist.l nitFBIock();public void memAllocati on (i nt size, Stri ng n ewjob _n ame)/内存分酉己(首次适应算法)FreeBlock q=flist.head;FreeBlock p=flist.head. next;while != n ull)if(size v= 0)System.out.println(Hn申请的空间不能小于1!H);break;)if

4、(p.state = false && p.size >= size)q = new FreeBlock(p.size - size);p.size = size;p. state = true;q. job_ name = newjob_n ame;r. n ext = p.n ext;p.n ext = q;break; 完成分配elsep = p.n ext; 移动到足够分配的空闲块)if(p = n ull)if(flist.flistsize >= size) System.out.pri ntl n("目前尚无足够大的空闲块,系统将进行重定位操

5、作relocation();/ 重定向memAllocation(size,newob_name);/重新分配内存 else System.out.println(作业"+new job name+”内存尚未分配成功!】 ) else分配内存后可能存在大小为0的空间,将其清除System.out.printlnC 作业"+new_job_name+”内存分配成功! p = flist.head .n ext; q = flist.head; whileg != n ull) if(p.size = 0)flist.deleteFBIock(p); p = p.n ext;)

6、private void memRecovery(FreeBlock target) /内存回收FreeBlock p = flist.head .n ext;while(p != null)回收区与插入点的前一个空闲分区相邻接if(p.next = target && p.state = false)p.size += target.size;p.n ext = target. next;回收区同时与插入点的前后两个空闲分区相邻接if(!p. next.state)p.size += p.n ext.size;p.next = p.n ext .n ext;)break;if

7、(p = target)回收区与插入点的后一空闲分区相邻接if(!p. next.state)target.size += p.n ext.size; target .next = p.n ext .n ext;)break; 若两不邻接,则直接跳出p = p.n ext;private void relocation() /FreeBlock fron t_r=flist.head;FreeBlock r=front_r.n ext;FreeBlock beh in d_r=r. while(r != n ull)next;空闲资源重定向,回收空闲空间/当前重定向空闲块将r定位到第一块空闲分

8、区块 if(r.state = false)break;r = r.n ext;behi nd_r = r.n ext;.学习帮手.专业整理.front=front r.n ext; 记录第一块空闲分区的上一块while(beh ind r != nu ll)if(beh in d r.state'front.n ext = beh in d_r;r.n ext = beh in d_r. next;beh in d_r. next = r;front r = beh ind r;)elser.size += beh in d_r.size;r.n ext = beh in d r.

9、next;)behi nd= r.n ext;System.out.pri ntln(" 重定向成功,继续为作业分配内存.”);)public void addJob() /添加作业intnewSize;新作业所需内存大小String nJobName = new String("");Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("请输入新任务的名称:");nJ obName = sea nner.n extL in e();System.out.pri nt(&qu

10、ot;请输入新任务所需内存大小:");n ewSize = sea nner.n ext In t();memAllocati on(n ewSize ,nJ obName);)public void delJob() /销毁作业String cur Job name = new Strinboolea n flag =指示作业是否删除成功自3Block q=flist.head. next;Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("请输入需要回收的作业名称:”);curj ob_n ame

11、= sea nner.n extL in e(); while(q != n ull) if(q.job_ name = curjob_ name) q.state = false;q.job_ name =,H; memRecovery(q); / 回收内存flag = true; break; elseq = q.n ext;if(flag)System.out.pri ntl n(" elseSystem.out.pri ntl n(")public void prin tJob In fo() /FreeBlock p = flist.head .n ext找到要删

12、除的作业的下一个结点删除作业成功!)删除作业未成功!");打印作业信息int pro.num = 1; 用户程序号int mem num = 1;内存分区块号System.out.printing用户程序信息while(p != null) if(p.state)System.out.pri ntln("用 户 程 序"+pro_ num+H("+p.job_ name+,)H+Ht占用第"+mem num+分区块”);pro nu m+; mem_ nu m+; p = p.n ext;1)public void prin tFreeSuba

13、real nfo() /打印空闲分区信息FreeBlock p = flist.head .n ext;int leav_size = 0;Il剩余内存大小int mem_num = 1; II内存分区块号System.out.println(H空闲分区信息");System.out.println("t 分区块号 t 大小”); while(p != n ull) if(!p.state)System.out.pri ntl n(HtH+mem _nu m+HtH+p.size); leav size += p.size;) mem_ nu m+; p = p.n ext

14、;System.out.pri ntl n("剩余内存总打小为"+leav s泛e);)其它类的实现 空闲分区块类:package com.kaip in g.memoryma nage;public class FreeBlock int size; IIboolean state;空闲块大小String job_name;装入的作业名称FreeBlock next;下一空闲块的自引用Hfalse表示空闲,true表示已经装入作业public FreeBlock(i nt s)size = s;state = false;job_ name = new Strin g(,

15、m);n ext = n ull;)空闲分区链类:package com.kaip in g.memoryma nage;import java.util.Sea nner;public class FreeList FreeBlock fblock;FreeBlock head;int fblockNum; 空闲块数int sumMemCount;/ 内存总大小int flistsize;空闲分区总和public FreeList()fblock = nu II;head = new FreeBlock(O);)public boolea n isEmpty()return (fblock

16、= n ull);)public void in sertFBIock(i nt size)FreeBlock n ewBlock = new FreeBlock(size); if(fblock = n ull)fblock = n ewBlock;head .next =fblock;)elsefblock .n ext = n ewBlock;|fblock = fblock .n ext;1)public void deleteFBIock(FreeBlock dblock) FreeBlock temp = head;while(temp != n ull)if(temp .next

17、 = dblock)temp .n ext = dblock .n ext; break;) temp = temp .n ext;1)public void In 让FBIock()int leavesCount;为化人分区内存总大小int bsize=0;分区块大小Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("初始多大空间,请输入一整数:”);sumMemCo unt = sea nner.n ext In t();leavesCo unt = sumMemCo unt;flistsize = sumM

18、emCount;初始空闲分区大小为内存大小System.out.pri nt(" 需将内存分为多少分区块,请输入一整数: fblockNum = sea nner.n ext In t();System.out.printlnC,初始化内存分区");for(i nt i=1; i <= fblockNum; i+)if(i = fblockNum)in sertFBIock(leavesCo un t);elseSystem.out.print("请输入第”+i+”块分区大小:”);bsize = sea nner.n ext In t();1f(bsize

19、 >= leavesCo unt - i)System.out.pri nt("您输入的数据无法保证每分区块最少有1单位内存,请重新输入:”);|bsize = sea nner.n ext In t();)in sertFBIock(bsize);leavesCo unt -= bsize;System.out.printing余下内存大小为“+leavesCount+”,请继续分配!)System.out.pri ntlnf分配完毕!");System.out.printlnC创建空闲分区表如下");System.out.println("t

20、分区号 t 大小”);FreeBlock temp = head .n ext;for(i nt i=1; i v= fblockNum; i+)System.out.pri ntl n("t,+i+,t,+temp.size);temp = temp .n ext;I)测试类(主类):package com.kaip in g.memoryma nage;import java.util.Sea nner;public class TestForMemMa nage public static void main(String口 args) MemoryMa nager mem_m

21、a nage = new MemoryMa nager();int choice=0;Scanner sea nner=new Sea nn er(System.i n);doSystem.out.println("0.退出程序");System.out.println(M1.添加新作业”);System.out.println(H2.销毁一条作业”);System.out.println("3.显示作业信息");System.out.pri ntln ("4.显示空闲分区信息)System.out.pri nt("请输入您的选择:&

22、quot;);choice = sea nner.n extl nt(); switch(choice)case 0:break;case 1:mem_ma nage.addJob();break;case 2:mem_ma nage.delJob();break;case 3:mem_ma nage.pri ntJobl nfo();break;case 4:mem_ma nage.pri ntFreeSubarea In fo();break;default:System.out.pri ntl n("请输入正确的选择!");while(choice != 0);Sys

23、tem.out.pri ntl n();System.out.pri ntl n("使用愉快!期待您下次使用!");五、实验测试结果及心得体会1、测试结果本人主要测试内存的分配与回收以及无足够大的空闲分区块时进行的重定向操作等功能。初始化内存分区:丽姑垄人空r叭请输入一整数g二*需海内存分悬虫少分氐块,箪输入整叙:初始化内存分区惜输入摞,以芳匡文小】.余下内再大小为口维续分配z请输人第:块分区大小:.余下闯存大小丈请维皱芳配匚谄输入 第么块伯区大小:余下内存大小为7诸址纹分配!请输入第目决吩区大小:余下内存犬 小均2、请继竦分配¥话输入捕5坎分区大小:余T内希大小册工 i育继淇芳配,请输入第6块文寸区大小:.:余下网方大小为二。请维绞 分配I请输入笫*块分区大小:余下H勺存大小均号3,请继族分配?请输入弟2块为区大小:企 下两存犬小肉请维辗吩配!诸输入第9块芳区大小:余下内存大小为ain请维绞分配弓另 配宅里,心电F弄单!分区号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论