操作系统之动态分区分配

简介

本程序利用java编程语言对其进行了实现。
源代码移步:http://download.csdn.net/download/chengshijian2015/10215534

原理

可变分区调度算法有:最先适应分配算法,最优适应分配算法,最坏适应算法。
用户提出内存空间的申请;系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。
每当一个进程被创建时,内存分配程序首先要查找空闲内存分区表(链),从中寻找一个合适的空闲块进行划分,并修改空闲内存分区表(链)。当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区表(链)中找到相应的插入点,此时出现如下四种情况:
1) 回收区与插入点的前一个空闲分区F1相邻接,此时可将回收区直接与F1合并,并修改F1的大小;
2) 回收区与插入点的后一个空闲分区F2相邻接,此时可将回收区直接与F2合并,并用回收区的首址最为新空闲区的首址,大小为二者之和;
3) 回收区同时与插入点的前、后两个空闲分区邻接,此时需将三者合并;
4) 回收区不与任何一个空闲区邻接,此时应建一新的表项。
源代码:
DynamicPartAllocate.java:

package com.csi.operatesystem;

import java.util.Scanner;

/**
 * Created by ChengShiJian on 2017/11/08.
 * 
 */

public class DynamicPartAllocate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("软件1503  程世健 1511030304");
        final Scanner scanner = new Scanner(System.in);
        new DynamicPartAllocatePresenter().setOnExcuteLisenter(new OnExcuteLisenter() {
            @Override
            public Job getJob() {
                // TODO Auto-generated method stub
                while (true) {
                    System.out.print("请输入作业(作业号   所用空间大小)>");
                    Job job = new Job();
                    int id = scanner.nextInt();
                    if (id < 1) {
                        System.out.println("作业号必须大于0!");
                        continue;
                    }
                    int length = scanner.nextInt();
                    job.setJobId(id);
                    job.setLength(length);
                    return job;
                }
            }

            @Override
            public void onOutOfMemory() {
                // TODO Auto-generated method stub
                System.out.println("磁盘空间不足!");
            }

            @Override
            public void onAllocateSuccess(Partition partition) {
                // TODO Auto-generated method stub
                System.out.println("----------------------------当前内存情况------------------------------");
                System.out.println(
                        "起始地址                       终点地址                               内存大小                                  状态                        作业号");

                for (PartBlock block : partition.getBlocks()) {
                    System.out.printf("%-15d%-15d%-15d%-30s%-15s\n", block.getStartAddress(), block.getEndAddress(),
                            block.getLength(), block.getState(), block.getJobId()==0?"":String.valueOf(block.getJobId()));
                }
                System.out.println("------------------------------------------------------------------");
            }

            @Override
            public int getJobId() {
                // TODO Auto-generated method stub
                System.out.print("请输入作业id>");
                return scanner.nextInt();
            }

            @Override
            public void onSearchError(int id) {
                // TODO Auto-generated method stub
                System.out.println("作业" + id + "不存在!回收内存失败!");
            }

            @Override
            public void onRetrieveSuccess(Partition partition) {
                // TODO Auto-generated method stub
                System.out.println("----------------------------当前内存情况------------------------------");
                System.out.println(
                        "起始地址                       终点地址                               内存大小                                  状态                        作业号");

                for (PartBlock block : partition.getBlocks()) {
                    System.out.printf("%-15d%-15d%-15d%-30s%-15s\n", block.getStartAddress(), block.getEndAddress(),
                            block.getLength(), block.getState(), block.getJobId()==0?"":String.valueOf(block.getJobId()));
                }
                System.out.println("------------------------------------------------------------------");
            }

            @Override
            public int onGetMethod() {
                // TODO Auto-generated method stub
                System.out.println("0.最先适应分配算法         1.最优适应分配算法        
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值