操作系统——空闲内存管理

news/2024/7/20 12:39:58 标签: 链表, 数据结构, 操作系统, 内存管理

空闲内存管理目录

文章目录

  • 空闲内存管理目录
  • 前言
  • 一、使用位图的存储管理
  • 二、使用链表的存储管理
    • 1.首次适配算法
    • 2.下次适配算法
    • 3.最佳适配算法
    • 4.最差适配算法
    • 5.快速适配算法


前言

在动态分配内存时,操作系统有两种方法跟踪内存使用情况:位图空闲区链表

一、使用位图的存储管理

使用位图方法时,内存可能被划分成小到几个字或大到几千字节的分配单元。每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。一块内存区和其对应的位图如图所示:
在这里插入图片描述

  • a)一段有5个进程和3个空闲区的内存,刻度表示内存分配单元,阴影区域表示空闲(在位图中用0表示);
  • b)对应的位图;
  • c)用空闲区链表表示的同样的信息

分配单元的大小是一个重要的设计因素。分配单元越小,位图越大。然而即使只有4个字节大小的分配单元,32位的内存也只需要位图中的1位。32n位的内存需要n位的位图,所以位图只占用了1/32的内存。若选择比较大的分配单元,则位图更小。但若进程的大小不是分配单元的整数倍,那么在最后一个分配单元中就会有一定数量的内存被浪费了。

因为内存的大小和分配单元的大小决定了位图的大小,所以它提供了一种简单的利用一块固定大小的内存区就能对内存使用情况进行记录的方法。
这种方法的主要问题是:
在决定把一个占k个分配单元的进程调入内存时,存储管理器必须搜索位图,在位图中找出有k个连续0的串。查找位图中指定长度的连续0串是耗时的操作(因为在位图中该串可能跨越字的边界),这是位图的缺点。

二、使用链表的存储管理

另一种记录内存使用情况的方法是,维护一个记录已分配内存段和空闲内存段的链表。其中链表中的一个结点或者包含一个进程,或者是两个进程间的一块空闲区。可用上图c段链表来表示上图a所示的内存布局。

链表中的每一个结点都包含以下域:
空闲区(H)或进程(P)的指示标志、起始地址、长度和指向下一结点的指针。

在本例中,段链表是按照地址排序的,其好处是当进程终止或被换出时链表的更新非常直接。一个要终止的进程一般有两个邻居(除非它是在内存的最底端或最顶端),它们可能是进程也可能是空闲区,这就导致了下图所示的四种组合。在图a中更新链表需要把P替换为H;在图b和图c中两个结点被合并为一个,链表少了一个结点:在图d中三个结点被合并为一个,从链表中删除了两个结点。

在这里插入图片描述

进程表中表示终止进程的结点中通常含有指向对应于其段链表结点的指针,因此段链表使用双向链表可能要比上上图c所示的单向链表更方便。这样的结构更易于找到上一个结点,并检查是否可以合并。

当按照地址顺序在链表中存放进程和空闲区时,有几种算法可以用来为创建的进程(或从磁盘换入的已存在的进程)分配内存。假设存储管理器知道要为进程分配多少内存。

1.首次适配算法

首次适配(first fit)算法是最简单的算法。存储管理器沿着段链表进行搜索,直到找到一个足够大的空闲区,除非空闲区大小和要分配的空间大小正好一样,否则将该空闲区分为两部分,一部分供进程使用,另一部分形成新的空闲区。首次适配算法是一种速度很快的算法,因为它尽可能少地搜索链表结点。

2.下次适配算法

对首次适配算法进行很小的修改就可以得到下次适配(next fit)算法。它的工作方式和首次适配算法相同,不同点是每次找到合适的空闲区时都记录当时的位置,以便在下次寻找空闲区时从上次结束的地方开始搜索,而不是像首次适配算法那样每次都从头开始。

3.最佳适配算法

另一个著名的并广泛应用的算法是最佳适配(best fit)算法。最佳适配算法搜索整个链表(从开始到结束),找出能够容纳进程的最小的空闲区。最佳适配算法试图找出最接近实际需要的空闲区,以最好地匹配请求和可用空闲区,而不是先拆分一个以后可能会用到的大的空闲区。但是!生活总是那么不尽人意!它比首次适配算法或下次适配算法浪费更多的内存,因为它会产生大量无用的小空闲区。一般情况下,首次适配算法生成的空闲区更大一些。

4.最差适配算法

最佳适配的空闲区会分裂出很多非常小的空闲区,为了避免这一问题,可以考虑最差适配(worst fit)算法,即总是分配最大的可用空闲区,使新的空闲区比较大从而可以继续使用。但是!这也不是一个好主意!

5.快速适配算法

另一种分配算法称为快速适配(quick fit)算法,它为那些常用大小的空闲区维护单独的链表。例如,有一个n项的表,该表的第一项是指向大小为4KB的空闲区链表表头的指针,第二项是指向大小为8KB的空闲区链表表头的指针,第三项是指向大小为12KB的空闲区链表表头的指针,以此类推。像21KB这样的空闲区既可以放在20KB的链表中,也可以放在一个专门存放大小比较特别的空闲区的链表中。

快速适配算法寻找一个指定大小的空闲区是十分快速的,但它和所有将空闲区按大小排序的方案一样,都有一个共同的缺点,即在一个进程终止或被换出时,寻找它的相邻块并查看是否可以合并的过程是非常费时的。如果不进行合并,内存将会很快分裂出大量的进程无法利用的小空闲区。



http://www.niftyadmin.cn/n/1204425.html

相关文章

JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建

在JMeter接口测试不断深入的过程中,发现可以和jenkins和ant一起搭配进行自动化的构建。下面是jmeter自动化构建的整理笔记。 准备环境 需要本机上确定安装了jmeter、ant和jenkins工具,并且环境都已配置成功,这里本机安装的配置如下&#xff1…

虚拟内存——分页

虚拟内存 文章目录虚拟内存前言一、虚拟内存的基本思想二、分页前言 随着现在程序对内存的需求越来越大,交换技术并不是一个具有吸引力的解决方案,因为一个典型SATA磁盘的峰值传输率高达每秒好几百兆,这意味着需要好几秒才能换出或换入一个1…

路由器的LAN、WAN、WLAN的区别

路由器的LAN、WAN、WLAN的区别 好多朋友在群内问我路由器如何配置,本来还耐心解答,但是他竟然连LAN、WAN都分不清,瞬间就没了帮助的热情。借这篇经验,小编简单讲一下路由常见的LAN、WAN、WLAN的区别。 本教程由就爱懒蛇原创&#…

虚拟内存——页表

虚拟地址到物理地址的映射一种最简单的实现: 虚拟地址被分成虚拟页号(高位部分)和偏移量(低位部分)两部分。 例如,对于16位地址和4KB 的页面大小,高4位可以指定16个虚拟页面中的一页,而低12位接…

基于JavaMail的Java邮件发送:复杂邮件发送

参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.util.Date;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.Message.Recipi…

页面置换算法(FIFO、第二次机会、LRU)

页面置换算法 文章目录页面置换算法前言一、最近未使用页面置换算法二、先进先出页面置换算法三、第二次机会页面置换算法四、时钟页面置换算法四、最近最少使用页面置换算法四、最不常用算法总结前言 当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内…

POJ2187:Beauty Contest——题解

http://poj.org/problem?id2187 题目大意&#xff1a;给n个点&#xff0c;求点对最大距离的平方。 ———————————————————— 很容易证明最大距离的点对在最大凸包上。 那么就是旋转卡壳的裸题了。 旋转卡壳要不要写讲解呢…… #include<cstdio> #inclu…

面试题:Kafka为什么吞吐量大、速度那么快

Kafka天生的分布式架构 顺序写&#xff1a;Kafka使用了磁盘顺序写来提升的性能。Kafka的message是不断追加到本地磁盘文件末尾的&#xff0c;而不是随机的写入&#xff0c;减少了磁盘寻址的开销 Kafka利用了操作系统自身的内存&#xff0c;Kafka的读写操作基本上是基于内存的…