目录

  • 内存的分配方式
    • 连续内存分配
      • 单一连续分配(过时)
      • 固态分区分配
      • 动态分区分配
        • 动态分区分配算法
          • 首次适应算法
          • 最佳适应算法
          • 最坏适应算法
          • 邻近适应算法
    • 非连续内存分配
      • 基础定义
      • 地址转换
        • 十进制地址
        • 二进制地址
      • 页表
      • 地址转变过程
      • 地址转变过程(带有快表)
      • 页表项
  • 参考

内存的分配方式

连续内存分配

单一连续分配(过时)

  • 内存被分为两部分, 系统区和用户区
  • 系统区通常位于内存的低地址部分, 用域存放操作系统的相关数据. 用户区用于存放用户进程相关数据
  • 内存中只有一个用户程序, 用户程序独占整个用户空间

优点 :

  • 实现简单, 无外部碎片

缺点 :

  • 只能用于单用户, 单任务的操作系统
  • 有内部碎片, 内存的利用率极低

固态分区分配

为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。

主要分为两种情况 : 分区大小相等, 分区大小不等

在这种情况下, 操作系统需要建立一个数据结构 – 分区说明表 来实现各个分区的分配与回收;
每个表项对应一个嗯去, 通常按分区大小排序, 每个表项包括对应分区的大小, 起始地址, 状态


  • 当某个进行需要进行内存分配时, 操作系统根据进程的大小检索该表, 从中找到一个能满足大小的, 未分配的分区, 将其分配给该程序, 然后修该状态为已分配

优点 :

  • 实现简单, 无外部碎片

缺点 :

  • 当进行占用内存太大时, 可能所有的分区都不满足要求
  • 会产生内部碎片, 内存的利用率低

动态分区分配

这种分配方式不会预先划分内存分区, 而是再进程装入内存时, 根据进程的大小动态分区, 使分区的大小正好适合进程的需要

那么就有三个问题需要我们考虑 :

  • 系统要用什么样的数据接口记录内存的使用情况 ?
  • 当很多个内存空闲区域都能满足需求时, 应该选择哪个分区进行分配 ?
  • 如何进行分区的分配与回收操作 ?

首先考虑第一点 : 系统要用什么样的数据接口记录内存的使用情况
两种常见的数据结构 :

  • 空闲分区表
  • 空闲分区链


接下来考虑第二点 : 当很多个内存空闲区域都能满足需求时, 应该选择哪个分区进行分配 ?

这个就涉及分配算法了, 接下来会详细说明

接下来考虑第三点 : 如何进行分区的分配与回收操作 ?
使用图解说明, 从一个进程的内存分配到内存回收



如何进行分区的回收呢 ?



  • 动态分配没有内部碎片, 但是有外部碎片
  • 内部碎片 : 分配给某进程的内存区域, 有一些部分没有用上
  • 外部碎片 : 是指内存中的某些空闲分区由于太小而难以利用
  • 如果内存中空闲的空间的总和本可以满足某进程的要求, 但是由于进程需要的是一整块连续的内存空间, 因此这些碎片不能满足进程的需求

动态分区分配算法

首次适应算法

每次都从低地址开始查找,找到第一个能满足大小的空闲分区。进行分配

最佳适应算法
  • 算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
  • 如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点 :

  • 每次都选用最小的分区进行分配, 会留下越来越多的, 小的, 难以利用内存块, 产生了很多的外部碎片
最坏适应算法
  • 算法思想:为了解决最佳适应算法的问题——即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
  • 如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

缺点 :

  • 每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
邻近适应算法
  • 算法思想 :首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

  • 如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  • 首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。

  • 但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)

  • 邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)

综合来看,四种算法中,首次适应算法的效果反而更好

非连续内存分配

连续分配方式与非连续分配方式的区别 :

  • 连续分配方式 : 一个分区一个进程
  • 非连续分配方式 : 把一个进程分解成几块, 分别放入几个不同的分区

基础定义

  • 页面 : 将进程分割为多个固定的, 大小相同的部分
  • 页框 : 将内存分割为多个固定大小的部门

通常页面与页框的大小是相同的, 这样保证没有内部碎片, 但是进程的最后一个页面通常无法利用完整个页框,会不可避免地产生页内碎片,为了让碎片足够小,必须控制好单个页框的大小,不能过大

系统以页框为单位为各个进程分配内存空间,一个页面就对应一个页框,它具体放到哪个页框,这是随意的

地址转换

十进制地址

  • 计算逻辑地址的页号
  • 根据页号找到页号对应页面在内存中的起始地址
  • 计算逻辑地址在当前页面内的偏移量
  • 物理地址 = 起始地址 + 页内偏移量

二进制地址

页表

根据地址,就已经可以知道页号和页内偏移量,剩下还有一个工作就是根据页号找到页号对应页面在内存中的起始地址

每一个进程,可以维护一张页表

页表用来记录页面号(页号)与页框号(块号)的映射关系,可以根据页号找到页号指代页面在内存中对应页框的编号

地址转变过程

地址转变过程(带有快表)

在前面的基本地址变换机构中,存在两个问题:

每次存取数据都需要访问内存两次:第一次访问内存中的页表,找到块号,并将块号与偏移量拼接得到物理地址;第二次,根据物理地址访问内存中存放的数据。第二次访存肯定是不能避免的,但是第一次访存其实可以想办法避免
若多条指令涉及到的逻辑地址的页号都相同,则每次都得经历第一次访存,找到该页号对应的块号
上面这两个问题可以通过引入快表来解决。

快表又叫做联想寄存器,它是一种访问速度比内存快很多的高速缓冲存储器,用以存放访问过的页表项的副本,从而加快地址转换的过程 —— 也就是说,引入快表后,地址转换可以不需要经历第一次访存,而是直接从快表中拿到需要的页表项。与之对应的,内存中原本的页表,叫做慢表。

页表项

物理块号的地址=逻辑地址-页号地址=32-20=12位,因为并不是进程的每一个页面都要调入内存,所以只有部分页面有对应内存的物理块号,所以物理块号的大小(212)会小于页号大小(220)

参考

原文地址 :

  • https://blog.csdn.net/Javascript_tsj/article/details/124617376
  • https://blog.csdn.net/u014453898/article/details/108838859
  • https://segmentfault.com/a/1190000022556314

操作系统 -- 内存管理(分配与回收)相关推荐

  1. 操作系统 内存的分配与回收

                                         操作系统 内存的分配与回收 无论什么进程,想要运行的就需要申请内存的空间,操作系统把我们的内存空间分割成化成一个个页表, 现在 ...

  2. 内存管理:内存的分配与回收

    内存管理:内存的分配与回收 1 内存的分配与回收 1.1 连续分配 1.1.1 单一连续分配 1.1.2 固定分区分配 1.1.3 动态分区分配 1.2 非连续分配 1.2.1 分段存储管理 1.2. ...

  3. 操作系统内存管理-Linux版

    引言 操作系统内存管理:总的来说,操作系统内存管理包括物理内存管理和虚拟内存管理. 物理内存管理: 包括程序装入等概念.交换技术.连续分配管理方式和非连续分配管理方式(分页.分段.段页式). 虚拟内存 ...

  4. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收 1 简述.NET中堆栈和堆的特点和差异 2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存 ...

  5. 【转】.NET内存管理、垃圾回收

    ? .NET内存管理.垃圾回收 1. Stack和Heap     每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参 ...

  6. 操作系统内存管理——分区、页式、段式管理

    操作系统内存管理--分区.页式.段式管理 标签: 内存管理操作系统数据结构算法 2010-07-05 11:26 20805人阅读 评论(5) 收藏 举报 分类: 操作系统(4) 版权声明:本文为博主 ...

  7. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  8. 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型

    在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...

  9. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

最新文章

  1. github创建静态页面_如何在10分钟内使用GitHub Pages创建免费的静态站点
  2. URI,URL和URN有什么区别?
  3. ASP.NET Core快速入门(第6章:ASP.NET Core MVC)--学习笔记
  4. MongoDB嵌套数组,多维数组查询
  5. 使用Adobe Audition生成基本音频
  6. 为什么年轻人挣得很多还是穷?北上广深挑战指数报告~
  7. UI设计干货模板|输入框设计临摹素材
  8. 大企业都在用的开源 ForgeRock OpenAM 被曝预认证 RCE 0day
  9. bilstmcrf词性标注_深度学习--biLSTM_CRF 命名实体识别
  10. 什么是大数据,模式识别和人工智能算法实现
  11. U盘刻录ubuntu系统
  12. 【ES实战】ES-Hadoop中的配置项说明
  13. 计算机综合布线基本知识,综合布线的基本常识
  14. 444 nginx_nginx发布静态资源
  15. Ubuntu设置开机启动项目
  16. NANK南卡发布新品旗舰版——南卡护眼台灯Pro,延续“护眼”理念
  17. R语言-神经网络包RSNNS
  18. 深度学习项目实践——制作一个能一键更换证件照背景的软件
  19. Oracle数据库学习基础
  20. 【Android】短信验证码输入框(80/100)

热门文章

  1. react 基础学习
  2. AStar路径规划算法
  3. 【软件测试】软考-2022软件评测师考试心得
  4. 常用激活函数--小白角度 TensorFlow 机器学习 神经网络 选取
  5. 微信小程序 Basic Auth 前后端restful api进行身份验证
  6. Linux(CentOS下)更改终端命令行颜色及网络配置
  7. 软件测试周刊(第71期):大悲时不发言,大怒时不争辩,大喜时不许诺。
  8. 浏览器直接编辑html文件,HTML文件怎么打开 .html如何编辑
  9. Shell内建命令之echo、local、logout
  10. ST 电机控制工作台帮助文档翻译 之 STM32F3x 的 OCP 和 OVP(使用嵌入式模拟的过压保护(仅限 STM32F3x))