操作系统内存分配算法模拟实现.docx

上传人:scccc 文档编号:12978978 上传时间:2021-12-09 格式:DOCX 页数:16 大小:74.24KB
返回 下载 相关 举报
操作系统内存分配算法模拟实现.docx_第1页
第1页 / 共16页
操作系统内存分配算法模拟实现.docx_第2页
第2页 / 共16页
操作系统内存分配算法模拟实现.docx_第3页
第3页 / 共16页
操作系统内存分配算法模拟实现.docx_第4页
第4页 / 共16页
操作系统内存分配算法模拟实现.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《操作系统内存分配算法模拟实现.docx》由会员分享,可在线阅读,更多相关《操作系统内存分配算法模拟实现.docx(16页珍藏版)》请在三一文库上搜索。

1、实验报告册院系名称:计算机科学学院课程名称:操作系统实验学期_专业班级:2009 年至 2010年 第二学期计算机科学与技术 2008级1班姓名:指导教师:HORACE 学号: 2008110108高老师实验最终成绩:实验报告(2)实验报告须知1. 学生填写实验报告应按规范填写,填写格式见由任课 老师给出的实验报告样本;2. 学生应填写的内容包括:封面相关栏目、第一页中本 学期(年)开设实验课程情况一览表中的实验名称、学时数;每次报告中的实验性质、同组人姓名、实验日 期、以及实验报告中的一至五项;3. 教师填写内容为:实验评价、每次报告成绩、第一页 中本学期(年)开设实验课程情况一览表中成绩、

2、 及封面的实验最终成绩;4. 学生实验结束后,教师应对学生实验结果进行核实, 学生方可离开实验室。5. 实验成绩等级分为(90- 100分)优,(80 89分)良,(70-79分)中,(60 69分)及格,(59分)不及格。6. 本实验册应妥善保管,本课程实验结束后应交回实验室实验名称内存分配与回收算法实现同组人姓名实验性质口基本操作验证性口综合性设计性实验日期2010-5-17实验成绩教师评价:实验预习口 实验操作口 实验结果口 实验报告口 其它口教师签名:一、实验目的及要求1)掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存2)系统如何为进入内存的作业分配内存空间,实

3、现多道作业问时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收,计算进程周转时间。3)掌握各种调度算法,以及实现所需的各种数据结构。二、实验内容根据给定的动态分区分配算法流程图,用你熟悉的计算机编程语言编写一程 序,该程序实现内存的合理分配后回收。三、主要设备及软件PC、Windows2000操作系统、Linux操作系统四、实验流程、操作步骤或核心代码、算法片段2、算法模拟实现 相关数据结构定义空闲分区块类:class FreeBlock空闲分区链类:class FreeList内存分配回收算法类: class MemoryManage

4、r测试类(主类):class TestForMemManage 具体实现请允许我先列出核心部分,内存分配回收算法类的实现:package com.kaiping.memorymanage;/ 个人包import java.util.Scanner;public class MemoryManager FreeList flist;空闲分区类对象public MemoryManager() flist = new FreeList(); flist.InitFBlock();public void memAllocation(int size, String new_job_name)/内存分酉

5、己(首次适应算法)FreeBlock q=flist.head;FreeBlock p=flist.head.next;while(p != null)if(size <= 0)System.out.println("n申请的空间不能小于 1!”); break;if(p.state = false && p.size >= size) q = new FreeBlock(p.size - size);p.size = size;p.state = true;p.job_name = new_job_name;q.next = p.next;p.next

6、= q;break; / else ( p = p.next;/移动到足够分配的空闲块 if(p = null)( if(flist.flistsize >= size)( System.out.println("目前尚无足够大的空闲块,系统将进行重定位操作."); relocation。;/重定向memAllocation(size,new_job_name);/重新分酉己内存 else(System.out.println("作业”+new_job_name+"内存尚未分配成功! ");else(/分配内存后可能存在大小为0的空间,将

7、其清除System.out.println("作业"+new_job_name+"内存分配成功!");p = flist.head.next;/q = flist.head;while(p != null)(if(p.size = 0)(flist.deleteFBlock(p); p = p.next;private void memRecovery(FreeBlock target)(内存回收FreeBlock p = flist.head.next;while(p != null)(回收区与插入点的前一个空闲分区相邻接if(p.next = tar

8、get && p.state = false)(p.size += target.size;p.next = target.next;/回收区同时与插入点的前后两个空闲分区相邻接if(!p.next.state)(p.size += p.next.size;p.next = p.next.next;break;if(p = target)(/回收区与插入点的后一空闲分区相邻接if(!p.next.state)(target.size += p.next.size;target.next = p.next.next;break; 若两不邻接,则直接跳出p = p.next;pri

9、vate void relocation()( /空闲资源重定向,回收空闲空间FreeBlock front_r=flist.head; /FreeBlock r=front_r.next;当前重定向空闲块FreeBlock behind_r=r.next;while(r != null)( 将r定位到第一块空闲分区块if(r.state = false)(break;r = r.next;behind_r = r.next;front_r = front_r.next;记录第一块空闲分区的上一块while(behind_r != null)(if(behind_r.state)(front_

10、r.next = behind_r;r.next = behind_r.next;behind_r.next = r;front_r = behind_r;else(r.size += behind_r.size;r.next = behind_r.next;behind_r = r.next;System.out.println("重定向成功,继续为作业分配内存.”);public void addJob()( 添加作业int newSize;新作业所需内存大小String nJobName = new String("");Scanner scanner=ne

11、w Scanner(System.in);System.out.print("请输入新任务的名称:");nJobName = scanner.nextLine();System.out.print("请输入新任务所需内存大小:");newSize = scanner.nextInt();memAllocation(newSize,nJobName);public void delJob()( 销毁作业String cur job name = new String("");boolean flag = false;指示作业是否删除成功

12、FreeBlock q=flist.head.next;Scanner scanner=new Scanner(System.in);System.out.print("请输入需要回收的作业名称:");cur_job_name = scanner.nextLine();while(q != null)if(q.job_name = cur_job_name)q.state = false;q.job_name =""memRecovery(q); 回收内存 flag = true;break;elseq = q.next;找到要删除的作业的下一个结点if

13、(flag)System.out.println("删除作业成功!");elseSystem.out.println("删除作业未成功!");public void printJobInfo()/打印作业信息FreeBlock p = flist.head.next;int pro_num = 1; 用户程序号int mem_num = 1; 内存分区块号System.out.println("用户程序信息");while(p != null)if(p.state)System.out.println("用户程序”+pro_

14、num+"("+p.job_name+") +"t占用第"+mem_num+"分区块");pro_num+;mem_num+;p = p.next;public void printFreeSubareaInfo()打印空闲分区信息FreeBlock p = flist.head.next;int leav_size = 0; 剩余内存大小int mem_num = 1; 内存分区块号System.out.println("空闲分区信息");System.out.println("t 分区块号

15、t 大小");while(p != null)if(!p.state)System.out.println("t"+mem_num+"t"+p.size);leav_size += p.size;mem_num+;p = p.next;System.out.println("剩余内存总打小为"+leav_size);其它类的实现空闲分区块类:package com.kaiping.memorymanage;public class FreeBlock int size;空闲块大小boolean state;/false表示空

16、闲,true表示已经装入作业String job_name;装入的作业名称FreeBlock next; 下一空闲块的自引用 public FreeBlock(int s)(size = s;state = false;job_name = new String("");next = null;空闲分区链类:package com.kaiping.memorymanage;import java.util.Scanner;public class FreeList (FreeBlock fblock;FreeBlock head;int fblockNum; 空闲块数int

17、 sumMemCount; / 内存总大小int flistsize;/空闲分区总和public FreeList()(fblock = null;head = new FreeBlock(0);public boolean isEmpty()return (fblock = null);public void insertFBlock(int size)FreeBlock newBlock = new FreeBlock(size);if(fblock = null)fblock = newBlock;head.next = fblock;elsefblock.next = newBlock

18、;fblock = fblock.next;public void deleteFBlock(FreeBlock dblock)(FreeBlock temp = head;while(temp != null)(if(temp.next = dblock)(temp.next = dblock.next;break;temp = temp.next;public void InitFBlock()(int leavesCount;为化入分区内存总大小int bsize=0;分区块大小Scanner scanner=new Scanner(System.in);System.out.print

19、("初始多大空间,请输入一整数:");sumMemCount = scanner.nextInt();leavesCount = sumMemCount;flistsize = sumMemCount;初始空闲分区大小为内存大小System.out.print("需将内存分为多少分区块,请输入一整数:");fblockNum = scanner.nextInt();System.out.println("初始化内存分区");for(int i=1; i <= fblockNum; i+)(if(i = fblockNum)(in

20、sertFBlock(leavesCount);else(System.out.print("请输入第”+i+"块分区大小:");bsize = scanner.nextInt();if(bsize >= leavesCount - i)(System.out.print("您输入的数据无法保证每分区块最少有1单位内存,请重新输入:");bsize = scanner.nextInt();insertFBlock(bsize);leavesCount -= bsize;System.out.println("余下内存大小为&qu

21、ot;+leavesCount+”,请继续分配!”);System.out.println("分配完毕!");System.out.println(" 创建空闲分区表如下 ");System.out.println("t 分区号 t 大小");FreeBlock temp = head.next;for(int i=1; i <= fblockNum; i+)(System.out.println("t"+i+"t"+temp.size);temp = temp.next;测试类(主类):

22、package com.kaiping.memorymanage;import java.util.Scanner;public class TestForMemManage (public static void main(String args) (MemoryManager mem_manage = new MemoryManager();int choice=0;Scanner scanner=new Scanner(System.in);do(System.out.println("0.退出程序");System.out.println("1.添加新作业

23、");System.out.println("2,销毁一条作业");System.out.println("3.显示作业信息");System.out.println("4.显示空闲分区信息");System.out.print("请输入您的选择:");choice = scanner.nextInt();switch(choice)(case 0:break;case 1:mem_manage.addJob();break;case 2:mem_manage.delJob();break;case 3:

24、mem_manage.printJobInfo();break;case 4:mem_manage.printFreeSubareaInfo();break;default:System.out.println("请输入正确的选择!");while(choice != 0);System.out.println();System.out.println("使用愉快!期待您下次使用!");五、实验测试结果及心得体会1、测试结果本人主要测试内存的分配与回收以及无足够大的空闲分区块时进行的重定向 操作等功能。初始化内存分区:分首己完毕! 包J建空闲分区表如下

25、分区号美小1 102 103 S4 305 153.4720e269 3010 37 退出程序n添加新作业 矿销新一条作业 m显示作业信息 n显示空闱分区信息 请输入您的选择: 请输入新任务的名称: 诺输入新任1务函需内存大小二 作业A内存分配成功! 添加作业,分配内存: 育输入新任务的名称;- 者输入新任务所需内存大小: I乍业m内存分配成功! .退出程序 L.添加新作业 £.销线一条作业 "显示作业信息 显示空闲分区信息 青输入您的选择: 用户程序信息 毛户程序日叫占用策二分区块书户程序热羽占用第W分区块打印分区信息:L显示空用分区信息 请输入您的选择己. 空闱分区信息

26、 分区块号大小142 026 30 刺余内存总打小为工;添加大作业,无足够大的空闲分区块,重定向:、 ” vr . v v m a 请输入您的选择:请输入新任务的名称:r请输入新任务所需向存大小:目前尚无足够大的空闲块,系统将进行真定位操作.重定位成功,继续为作业分配内存.作业D内存分配成功!占用第二分区块 占用第芝分区块 占用第3分区块 占用第4分区块请输入您的选择: 用尸程序信息 用户程序上(A) 用户程序W (3) 用户程序3心) 用户程序勺D) 。,退出程序 :L.添加新作业 巨,销墨一条作业3. 显示作业信息 、显示空闲分区信息 请输入您的选择: 空闲分区信息 分区块号大小 5136剩余内存总打小为H后S退出程序 添加新作业 W.销毁一条作业3, 显示作业信息4, 显示空闲分区信息 请输入您的选择: 使用愉快!期待您下次使用!2、实验心得通过本次实验,我掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存以及系统是如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1