您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

连续内存分配

时间:2019-08-14 10:01:06  来源:  作者:

 

 

内存必须容纳操作系统和各种用户进程,因此应该尽可能有效的分配内存的各个部分。

内存通常分为两个区域,一个用于驻留操作系统,另一个用于用户进程。操作系统可以位于低内存,也可以位于高内存,影响这一决定的主要因素是中断向量的位置,由于中断向量通常位于低内存,因此程序员通常将操作系统页放在低内存。

内存映射与保护

在说内存分配之前,先说说内存映射与保护的问题,通过采用重定位寄存器和界限地址寄存器,可以实现这种保护。

重定位寄存器含有最小的物理地址值,界限地址寄存器含有逻辑地址的范围值(例如:重定位=100050, 界限=74500)。有了重定位寄存器和界限地址寄存器,每个逻辑地址必须小于界限地址寄存器。MMU动态的将逻辑地址加上重定位寄存器的值后映射成物理地址,映射后的物理地址再交送内存单元。

当CPU调度器选择一个进程来执行时,作为上下文切换工作的一部分,调度程序会用正确的值来初始化重定位寄存器和界限地址寄存器。由于CPU所产生的每一地址都需要与寄存器进行核对,所以可以保证操作系统和其他用户程序和数据不受该进程的运行所影响。

内存分配

现在我们就来讨论一下内存分配,最简单的内存分配方式之一就是将内存分为多个固定大小的分区(parttiion)。每个分区只能容纳一个进程,因此,多道程序的程度会受到分区数所限制。如果使用这种多分区方法,当一个分区空闲的时候,可以从输入队列中选择一个进程,以调入到空闲分区,当进程终止时,其分区可以被其他进程所使用。这种方法最初为IBM OS/360 操作系统所使用,不过现在已经不再使用了。

下面来介绍可变分区方案。在可变分区方案里,操作系统有一个表,用于记录哪些内存可用和哪些内存已经被使用,在一开始,所有的内存都可用于用户进程,因此可以作为一大块可用内存,称为孔(hole)。当有新进程需要内存时,为该进程查找足够大的孔,如果找到,可以从该进程分配所需的内存,孔内未分配的内存可以下次再用。

随着进程进入系统,它们将被加入到输入队列,操作系统根据所有进程的内存需要和现有可用内存情况来决定哪些进程可以分配内存。当进程分配到空间时,它就装入内存,并开始竞争CPU,当进程终止的时候,它将释放内存,该内存可以被操作系统分配给输入队列中的其他进程。

在任意的时候,有一组可用孔(块)大小列表和输入队列,操作系统根据调度算法来对输入队列进行排序,内存不断地分配给进程,直到下一个进程的内存需求不能满足为止,这时没有足够大的可用孔来装入进程。操作系统可以等到有足够大的空间。或者往下扫描输入队列以确定是否有其他内存需求较小的进程可以被满足。

通常,一组不同大小的孔分散在内存中,当新进程需要内存时,系统为该进程查找足够大的孔,如果孔太大,那么就分为两块:一块分配新进程,另一块还回到集合。当进程终止时,它将释放其内存,该内存将还给孔集合,如果新孔与其他孔相邻,那么将这些孔合并成大孔,这时,系统可以检查是否有进程在等待内存空间,新合并的内存空间是否满足等待进程。

分配方法

上面讲的这种方法是通用动态存储分配问题的一种情况(根据一组空闲孔来分配大小为 n 的请求)。这个问题有许多解决方法,从一组可用孔中选择一个空闲的最常用方法有首次适应(first-fit)、最佳适应(best-fit)、最差适应(worst-fit)。

  1. 首席适应:分配第一个足够大的孔,查找可以从头开始,也可以从上次首次适应结束时开始,一旦找到足够大的空闲空间孔,就可以停止。
  2. 最佳适配: 分配最小的足够大的孔,必须查找整个列表,除非列表按大小排序,这种方法可以产生最小剩余孔。
  3. 最差适应: 分配最大的孔,同样,必须查找整个列表,除非列表按大小排序,这种方法可以产生最大剩余孔,该孔可能比最佳适应方法产生的比较剩余孔更为有用。

碎片

首次适应方法和最佳适应方法都有外部碎片问题,随着进程的装入和移出内存,空闲内存被分为小片段,当所有总的可用内存之和可以满足请求,但并不连续时,这就出现了外部碎片的问题。这个问题可能很严重。在最坏的情况下,每两个进程之间就有空闲块(或浪费)。如果这些内存块是一整块,那么就可以再运行多个进程。

在首次适应和最佳适应之间的选择可能会影响碎片的量(对一些系统来说首次适应更好,对另一些系统最佳适应更好)。另一个影响因素是从空闲块的哪端开始分配(顶端还是末端)。不管使用哪种算法,外部碎片始终是个问题。

根据内存空间总的大小和平均进程大小的不同,外部碎片的重要程度页页不同,例如,对采用首次适应方法的统计说明。不管使用什么优化,假定有N个可分配块,那么可能有0.5N个外部为外部碎片。即1/3的内存可能不能使用。这一特性称为50%规则。

一种解决外部碎片的问题的方法是紧缩(compaction),紧缩的目的是移动内存内容,以便所有空间合并成一整块。但紧缩并非总是可能的。如果重定位是静态的,并且在汇编时或装入市进行的,那么就不能紧缩。紧缩仅在重定位是动态并在运行时可采用。如果地址被动态重定位,可以首先移动程序和数据,然后再根据新基地址的值来改变基地址寄存器,如果能采用紧缩,还需要评估其开销,最简单的合并算法是简丹的将所有进程移动到内存的一端,而将所有的孔移到内存的另一端,以便生成一个大的空闲块,这种方案开销较大。

另一种可能解决碎片问题的方法是允许物理地址空间为非连续。这样只要有物理内存就可以为进程分配,这种方案有两种互补的实现技术: 分页和分段,这两种技术也可以合并。



Tags:内存分配   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、C中内存分为四个区 栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。 堆:用来存放由动态分配函数(如malloc)分配的空间。是由程...【详细内容】
2021-06-23  Tags: 内存分配  点击:(90)  评论:(0)  加入收藏
变长数组(VLA)和调用malloc()在功能上有些重合。例如,两者都可用于创建在运行时确定大小的数组:int vlamal(){ int n; int * pi; scanf("%d", &n); pi = (int *) ma...【详细内容】
2020-08-10  Tags: 内存分配  点击:(97)  评论:(0)  加入收藏
Netty 作为一款高性能的 RPC 框架必然涉及到频繁的内存分配销毁操作。 图片来自 Pexels如果是在堆上分配内存空间将会触发频繁的 GC,JDK 在 1.4 之后提供的 NIO 也已经提供了...【详细内容】
2020-07-03  Tags: 内存分配  点击:(82)  评论:(0)  加入收藏
Netty 出发点作为一款高性能的 RPC 框架必然涉及到频繁的内存分配销毁操作,如果是在堆上分配内存空间将会触发频繁的GC,JDK 在1.4之后提供的 NIO 也已经提供了直接直接分配堆...【详细内容】
2020-06-13  Tags: 内存分配  点击:(49)  评论:(0)  加入收藏
真没什么逻辑系统设计、微服务架构和云原生技术程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域 — 栈区(Stack)和堆区(Heap)。函数调用的参...【详细内容】
2020-06-07  Tags: 内存分配  点击:(33)  评论:(0)  加入收藏
当用户使用任何软件(包括MySQL)碰到内存问题时,我们第一反应就是内存泄漏。正如这篇文章所示,其实并不总是这样。...【详细内容】
2020-04-03  Tags: 内存分配  点击:(68)  评论:(0)  加入收藏
多朋友可能会有许多关于Innodb如何使用内存的问题。我这里将简单介绍一下innodb内存结构,然后以innodb启动时的分配情况做一个解释。 1、INNODB内存结构 1.1、聚集索引与非聚...【详细内容】
2019-11-04  Tags: 内存分配  点击:(145)  评论:(0)  加入收藏
写在前面Android开发中我们常常会遇到不合理的内存分配导致的问题,或是频繁GC,或是OOM。 按照常规的套路我们需要打开Android Studio录制内存分配或者dump内存,然后人工分析,逐...【详细内容】
2019-09-10  Tags: 内存分配  点击:(152)  评论:(0)  加入收藏
内存必须容纳操作系统和各种用户进程,因此应该尽可能有效的分配内存的各个部分。内存通常分为两个区域,一个用于驻留操作系统,另一个用于用户进程。操作系统可以位于低内存,也...【详细内容】
2019-08-14  Tags: 内存分配  点击:(255)  评论:(0)  加入收藏
作者 l Hollis 来源 l Hollis(ID:hollischuang)JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。 上图,是一张在作...【详细内容】
2019-07-30  Tags: 内存分配  点击:(300)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条