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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称内存分配与回收算法实现

同组人姓名实验性质□基本操作●验证性□综合性□设计性

实验日期2010-5-17 实验成绩

教师评价:

实验预习□实验操作□实验结果□实验报告□其它□

教师签名:

一、实验目的及要求

1)掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存

2)系统如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收,计算进程周转时间。

3)掌握各种调度算法,以及实现所需的各种数据结构。

二、实验内容

根据给定的动态分区分配算法流程图,用你熟悉的计算机编程语言编写一程序,该程序实现内存的合理分配后回收。

三、主要设备及软件

PC、Windows2000操作系统、Linux操作系统

四、实验流程、操作步骤或核心代码、算法片段

1、分配算法流程出

请求分配u.size 分区

检索空闲分区链(表)

找到大于u.size 的可用分区否?

按动态分区方式进行分配

修改有关数据结

返回分区号及

空闲分区总

和>=u.siz e

进行紧筹形成连续空闲区

修改有关数据结

构 无法分配返

2、算法模拟实现

○1相关数据结构定义

空闲分区块类:class FreeBlock

空闲分区链类:class FreeList

内存分配回收算法类:class MemoryManager

测试类(主类):class TestForMemManage

○2具体实现

请允许我先列出核心部分,内存分配回收算法类的实现:

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){//内存分配(首次适应算法)

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 = 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的空间,将其清除

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 == target && 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;

}

}

private 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;

}

相关文档
最新文档