操作系统内存动态分区分配算法(Java实现)

一. 内存的作用内存是计算机的一个重要组成部分,它的主要作用在于配合 CPU 的高速运转,使得计算机的运行速度得到大大地提升 我们应该知道,计算机上的一切都是程序,我们使用计算机其实就是在运行计算机上的各种程序,而这些程序都存储在我们的硬盘中(外存),硬盘中的数据内容是几乎可以永久存储的但是 它的读取速度相较于 CPU 的处理速度是十分缓慢的 如果没有内存,CPU 在处理完一段程序后,要
摘要由CSDN通过智能技术生成

一. 内存的作用

内存是计算机的一个重要组成部分,它的主要作用在于配合 CPU 的高速运转,使得计算机的运行速度得到大大地提升
我们应该知道,计算机上的一切都是程序,我们使用计算机其实就是在运行计算机上的各种程序,而这些程序都存储在我们的硬盘中(外存),硬盘中的数据内容是几乎可以永久存储的但是 它的读取速度相较于 CPU 的处理速度是十分缓慢的 **
如果没有内存,CPU 在处理完一段程序后,要空闲很长一段时间等待硬盘继续传送数据,这样一来,极大地降低了 CPU 的效率
而内存由于其构造原理与硬盘不同,它的
读写速度非常快**(虽然不及 CPU,但可以远高于硬盘),但是它内部的数据断电后就会消失,不具有永久存储性,因此,内存的主要作用就相当于 CPU 与硬盘之间的中转站,内存中会暂存即将要执行的程序,等待着 CPU 的调度

二. 内存分配

基于内存的工作原理,你一定想问:既然内存速度那么快,为什么不把硬盘中的所有数据全部放入内存等待 CPU 调度呢?
因为内存不仅读取速度是硬盘的很多倍,制造成本也远高于硬盘,所以必须省着点用啊!
那么新的问题来了,内存空间有限,那么在有限的空间中该怎么存取数据呢?这就是内存的分配算法了

内存分配算法,大体来说分为:连续式分配 与 非连续式分配
顾名思义连续式分配就是把所以要执行的程序 完整的,有序的 存入内存,连续式分配又可以分为固定分区分配 和 动态分区分配
非连续式分配就是把要执行的程序按照一定规则进行拆分,显然这样更有效率,现在的操作系统通常也都是采用这种方式分配内存

关于内存的原理部分本文只讲到这里,本文主要关注动态分区分配算法

三. 动态分区分配

所谓动态分区分配,就是指内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小
动态分区分配算法有以下四种:

1. 首次适应算法(First Fit)

空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小满足要求的第一个空闲分区就进行分配
这里写图片描述

2. 邻近适应算法(Next Fit)

又称循环首次适应法,由首次适应法演变而成,不同之处是分配内存时从上一次查找结束的位置开始继续查找
这里写图片描述

3. 最佳适应算法(Best Fit)

空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区就进行分配
这里写图片描述

4. 最坏适应算法(Next Fit)

又称最大适应算法(Largest Fit),空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区(也就是最大的分区)就进行分配
这里写图片描述

四. 代码实现

package com.dht.memory;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * 内存类
 * @author dht925nerd@126.com
 */
public class Memory{
   
    /**
     * 内存大小
     */
    private int size;
    /**
     * 最小剩余分区大小
     */
    private static final int MIN_SIZE = 5;
    /**
     * 内存分区
     */
    private LinkedList<Zone> zones;
    /**
     * 上次分配的空闲区位置
     */
    private int pointer;

    /**
     * 分区节点类
     */
    class Zone{
   
        /**
         * 分区大小
         */
        private int size;
        /**
         * 分区始址
         */
        private int head;
        /**
         * 空闲状态
         */
        private boolean isFree;

        public Zone(int head, int size) {
   
            this.head = head;
            this.size = size;
            this.isFree = true;
        }
    }

    /**
     * 默认内存大小为 100 KB
     */
    public Memory(){
   
        this.size = 100;
        this.pointer = 0;
        this.zones = new LinkedList<>();
        zones.add(new Zone(0, size));
    }
    public Memory(int size) {
   
        this.size = size;
        this.pointer = 
  • 10
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值