一、由于内存释放导致的内存碎片的问题

空闲内存碎片化可能导致很多的内存不会被利用。内存碎片包含两种,一种时内部碎片,一种时外部碎片,所谓的内部碎片,就是分配给应用程序使用但是实际却无法被利用的碎片,而外部碎片是在分配单元里的未使用内存。当程序从硬盘加载到内存中的时候就需要一串比较长的连续内存空间。因此,操作系统需要管理内存空间

二、分区的动态分配

假如由三块可用的内存空间,1K ,2K ,500B。假如需要分配一个400B内存空间给程序

1)内存空间的分配策略——首次适配

所谓的首次适配,就是第一次匹配到满足要求的内存空间,最后程序的内存空间将会在这1K上去分配出400B的空间。此方法需要对地址进行排序,按顺序查找出首次适配的空闲内存。在内存回收的时候,要考虑到连续内存空间的合并问题。此方法容易产生较多的外部碎片,但是算法简单,分配完后的空闲内存可能还可以保留较大的空间等待接下来的分配。

2)内存空间的分配策略——最佳适配

所谓最佳适配,就是匹配到最适合的且满足要求的内存空间,最匹配的空间块是500B。对内存块size排序,这个方法劣势就是最后的分配的内存空间会十分小无法利用。

3)内存空间的分配策略——最差适配

所谓最差适配与最佳适配算法,先利用最大的空闲内存块。匹配的空间块是2K。对内存块size排序,缺点,运行久了时候,大请求可能就会分配不了。

以上三种各有利弊,并没有哪一种内存管理方法是普适的,通常会根据不同的需求来匹配不同的匹配方法。

三、压缩式碎片整理

面对程序间的内存碎片,考虑的是调整程序的空间位置,从而变成一个连续被利用的块,腾出一个连续的空间空间。压缩碎片整理通过“拷贝”(重定位)的方式来“移动”程序正在使用的内存空间。要考虑的问题是:什么时候进行调整分配合适?开销是否大?

首先程序运行的时候不能移动内存空间,而是在程序等待,暂停运行的时候进行移动。 如果利用空间过大,要移动复制的空间也就大,这个造成的开销是否会导致操作系统的正常运行?

四、交换式碎片整理

将硬盘利用起来。当成一个备份。当程序的暂停运行的时间,将暂停运行的程序的内存空间数据移动到硬盘上,当再运行程序时,将硬盘上备份的数据丢回内存上重新分配。这需要考虑的问题是,哪一部分的内存空间被换到硬盘上合适 ?何时进行换入换出操作?

操作系统原理:连续的内存分配相关推荐

  1. 操作系统原理 : 非连续的内存分配,分段,页表

    非连续的内存分配通常,分段和分页两种方式 由于连续的内存分配方式存在碎片问题.非连续的内存分配就可以充分利用内存碎片,主要存在的问题就是开销,如果碎片多寻址效率会比较慢. 目录 一.分段 二.分页机制 ...

  2. CMA(连续的内存分配)与dma_alloc_writecombine申请异常现象和分析

    CMA(连续的内存分配)与dma_alloc_writecombine异常现象和分析1 cma,全称(contiguous memory allocation),在内存初始化时预留一块连续内存,可以在 ...

  3. 操作系统C语言模拟内存分配算法的模拟实现

    使用一个一维数组来模拟内存储空间,建立内存块来记录内存分配使用情况,通过随机产生进程及其所需要的内存来模拟真实的进程.通过给进程分配内存及回收来实现对动态不等长存储管理方法. 代码 #include ...

  4. 操作系统 非连续分配_操作系统中的连续和非连续内存分配

    操作系统 非连续分配 In this article, we will learn about the different types of memory management techniques ...

  5. Java垃圾收集与内存分配

    目录 1.对象已"死"吗? 1.1.引用计数算法 1.2.可达性分析算法 1.3.对象引用 1.4.finalize自救 1.5.回收方法区 2.GC算法 2.1.分代收集理论 2 ...

  6. CMA大段设备内存分配

    在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,对于内核如果申请一块连续的内存空间该怎么处理呢? 首先向到的是利用内核提供的kma ...

  7. Linux 操作系统原理 — 内存 — 内存分配算法

    目录 文章目录 目录 前文列表 内存碎片 伙伴(Buddy)分配算法 Slab 算法 虚拟内存的分配 内核态内存分配 vmalloc 函数 kmalloc 用户态内存分配 malloc 申请内存 用户 ...

  8. 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

    文章目录 1 基本分页存储管理 1.1 什么是分页存储 1.2 重要的数据结构--页表 1.3 基本地址变换机构 1.4 具有快表的地址变换机构 1.4.1 什么是快表(TLB) 1.4.2 引入快表 ...

  9. 操作系统【三】内存管理基础+连续内存分配

    内存的基础知识 内存分为按字节编址(8位)和字编制(不同计算机不一样,64位计算机就是64位,即8个字节) 相对地址=逻辑地址 绝对地址=物理地址 从逻辑地址到物理地址的转换由装入解决. 装入的三种方 ...

最新文章

  1. Hibernate Annotation _List/Map
  2. java osgi web开发_基于 OSGi 和 Spring 开发 Web 应用
  3. JAVA中常用的逻辑运算符_Java中常用的运算符
  4. 午餐前如何安装OpenStack Cloud
  5. ie9支持string.trim()
  6. azure夜校培训第四场3月8日18:00---网络服务
  7. AB_PLC编程软件RSLogix_500_与PLC通讯详细说明
  8. 简述er图的作用_ER图的理解
  9. 绘制柱状图,填充不同颜色
  10. 史上最系统的程序员未来职业规划路线
  11. matlab max/min函数用法
  12. 前端入门学习笔记(三十五)vue.js入门(三)条件 v-if 与循环 v-for,v-for 中 in 和 of 的区别
  13. SparkStreaming读取Kafka数据源并写入Mysql数据库
  14. 7-2 点赞(20 分)
  15. Linux-Ubuntu Desktop 18.04 LTS版本的安装(支持到2023年)
  16. 人工智能正在向经济学领域渗透
  17. 上古卷轴nmm_您在《上古卷轴》中认识的人
  18. Solving environment: failed with initial frozen solve. 阴沟系列 正确安装低版本的gpu pytorch
  19. 【前端王一】- 萌新入场
  20. JDK12 Collectors.teeing 你真的需要了解一下

热门文章

  1. Python continue
  2. jvm在不同系统中的最大内存空间地址
  3. windows server 2003之七---DNS
  4. 自反访问控制列表(ACL)
  5. seaborn.FacetGrid
  6. mysql access 2017_如何把Access的数据导入到Mysql中
  7. Rancher Docker容器管理CPU/内存/网络/IO监控面板
  8. Jenkins安装与启动
  9. docker 容器重命名
  10. JVM 参数含义:-Xms和-Xmx