首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

连续内存分配

连续内存是一种比较直观的做法。这种做法将内存分为两个区域,一个是用户进程区域,另一个是操作系统区域。操作系统一般放在内存的低地址区域,这时因为中断向量被设置在低地址,例如0x80中断。...为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。 在内存分配之前,我们需要知道内存保护的问题。首先,用户进程之间彼此不能影响,用户进程也不能影响操作系统。...连续内存分配是最简单的一种方法,它主要用于批处理系统。给内存分为固定大小的块。每个块只能容纳一个进程。这样一个个大小不同的内存分块就形成了,当新进程需要内存的时候,系统会为它找一块足够大的孔。...不连续的小孔最终就会无法容纳一个进程,导致产生碎片化的内存。还有一种碎片是内部碎片,一般系统分配内存是2的次方,而不是你需要多大分配的就刚好是这么大。...一种解决外部碎片的方法是移动内存中的内容,使得所有的空闲空间合并成为一整块。这适合于运行时绑定地址的进程,并且这个操作带来的开销是巨大的,不能经常使用。 另外的解决办法就是允许物理内存为非连续分配

1.8K20

内存连续分配管理方式

连续分配:系统为程序分配的是连续内存空间 单一连续分配:内存分为系统区和用户区,只有一道用户程序占据整个用户区,无外部碎片,有内部碎片,内存利用率低 固定分区分配:分为系统区和用户区,用户区划分多个分区...,每个分区一个程序,无外部碎片,有内部碎片,利用率低 动态分区分配:可变分区分配,根据进程的大小动态建立分区   1)使用空闲分区表或者空闲分区链记录每个分区的信息   2)动态分区分配算法   3...)进程回收后,会把相邻空出来的分区合并   4)进程回收后,如果没有相邻的就更新分区信息 内部碎片:分配给进程的内存,有没有用上的 外部碎片:空闲分区太小了,进程内存太大用不上,就是外部碎片

93210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    内存连续分配方式

    基本分页存储方式 1)把内存分为一个个小分区,再按照分区大小把进程拆分成一个个的小部分,比如每个分区4kb,每个分区就是一个页框/页帧/页存块/物理块,页框号从0开始 2)将进程也分成和页框大小相等的一个个区域...,称为页/页面,每个页面也有个编号,页号也是从0开始的 3)将进程分页然后离散的分配内存的页框里面 知道逻辑地址的内存单元如何想得到存储单元内存物理地址 1)算出逻辑地址的页号 2)页号对应页面在内存中的起始地址...3)逻辑地址在页面中的偏移量 4)物理地址=物理页面起始地址+偏移量 逻辑地址页号=逻辑地址/页面长度 页内偏移量=逻辑地址%页面长度 页表 页表存储进程进程的每个页面在物理内存中存放的位置,记录了映射关系...1)一个进程一个页表 2)进程每一页对应一个页表项 3)每个页表项,由“页号”和“块号”组成 基本分段存储方式 段页式存储方式 连续分配方式:为用户进程分配必须是一个连续内存连续分配方式:分散的进程可以分配为一个分散的内存

    92420

    Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配内存 )

    文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续内存块 " : kmalloc ; 注意 该 " 物理地址连续内存块 " 是以 Slab 为中心的...; 二、统计输出 vmalloc 分配内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配的 " 虚拟地址连续内存

    5.2K30

    Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】

    在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。...通过这套机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才被分配给Camera,HDMI等设备。下面分析它的基本代码流程。 1....申请连续内存 申请连续内存仍然使用标准的arch/arm/mm/dma-mapping.c中定义的dma_alloc_coherent()和dma_alloc_writecombine(),这二者会间接调用...接下来要回收page,回收page的作用是,不至于因为拿了连续内存后,系统变得内存饥饿: -> /* * Reclaim enough pages to make sure that...内核内存分配的migratetype 内核内存分配的时候,带的标志是GFP_,但是GFP_可以转化为migratetype: static inline int allocflags_to_migratetype

    3.8K20

    操作系统学习笔记-11:内存分配(一):连续分配

    形成一个总的装入模块 装入:由装入程序将装入模块装入内存运行 2.2 链接: 静态链接:直接将编译后的多个目标模块和所需的库函数链接在一起,形成一个不再拆开的装入模块,该模块整体装入内存 装入时动态链接...内存分配连续分配 3.0 外部碎片和内部碎片 在内存分配中有外部碎片和内部碎片的概念: 外部碎片指的是尚未分配出去、由于太小而无法分配出去的内存空间 内部碎片指的是已经分配出去、但没有完全得到利用的内存空间...3.1 单一连续分配 单一连续分配只适用于单用户、单任务的操作系统中,它会把整个内存区划分为系统区和用户区,一道用户程序就会独占整个用户区,因此存储器的利用率非常低、内部碎片很大(分配了整个用户区,但实际用到的空间并不多...最佳适应(BF) 连续分配的方式规定,为各个进程分配的必须是一块连续的空间,因此对于一块内存空间来说,若它不断被分割,则意味着它能容纳下大进程的可能性越低。...到目前为止,我们所讲的都是连续分配的方式,也就是说,为某个进程分配的必须是一块连续的空间 —— 若多个空闲分区不是相邻的,那么即便它们的大小相加后,已经足以满足进程的需求,也无济于事。

    3.8K51

    操作系统学习笔记-12:内存分配(二):非连续分配

    在上一篇笔记中介绍的是连续分配,包括固定分区分配和动态分区分配。但前者容易产生内部碎片,后者容易产生外部碎片(虽然可以用紧凑技术解决,但是有一定的成本),都不是理想的解决方案。...这篇笔记会介绍另一种分配方式,即非连续分配(离散分配),主要包括:基本分页存储管理、基本分段存储管理、段页式存储管理。 下面是这篇笔记的思维导图: ? 一. 基本分页存储管理 1....基本思路 在连续分配中,一个进程不可被分割,只能整体放入一块连续内存空间中;但在基本分页存储管理中,允许把一个进程按照固定大小 X 分割为多个部分,同时把内存也按照固定大小 X 分割为多个部分,并把前者对应地放到后者中...在分配的时候是以段为单位进行分配的,在内存中,段内所占空间是连续的,但是各个段之间可以不相邻。...如下图,进程 A 按照逻辑功能被划分为三个段,每个段大小不一,最后再被分配内存中不连续的各个空间中: ?

    3.3K100

    Linux内存分配策略

    伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续内存页, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存页....上一节说过, 内核使用 alloc_pages() 函数分配内存页, 而 alloc_pages() 函数最后会调用 rmqueue() 函数分配内存页, rmqueue() 函数原型如下: static...在Linux内核中, 把两个物理地址相邻的内存页当作成伙伴, 因为Linux是以页面号来管理内存页的, 所以就是说两个相邻页面号的页面是伙伴关系....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限大呢? 当然不是, 在Linux内核中, order的最大值是 10.

    3.3K10

    Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配分配内存流程 )

    文章目录 一、伙伴分配分配内存流程 1、查询 n 阶页块 2、查询 n + 1 阶页块 3、查询 n + 2 阶页块 一、伙伴分配分配内存流程 ---- 伙伴分配器 以 " 阶 " 为单位 , 分配.../ 释放 物理页 ; 阶 ( Order ) : 物理页 的 数量单位 , n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 页 / 阶 概念参考 【Linux 内核 内存管理...】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ; " 伙伴分配器 " 分配内存流程 : 假设要 分配 n 阶页块 ; 1、查询 n 阶页块 查询当前是否有 空闲的 n...阶页块 , 如果有则 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 1 阶页块 ; 2、查询 n + 1 阶页块 查询当前是否有 空闲的 n + 1 阶页块 , 如果有 , 将...n + 1 阶页块 分成 2 个 n 阶页块 , 一块插入 空闲 n 阶页块链表 ; 一块 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 2 阶页块 ; 3、查询

    7.1K50

    操作系统之内存管理内存管理3.1 内存管理的概念3.2 内存覆盖与内存交换3.3 内存连续分配管理方式3.4 内存连续分配管理方式

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。...链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。 装入:由装入程序将装入模块装入内存运行。 这三步过程如图3-1所示。 ?...3.3 内存连续分配管理方式 连续分配方式,是指为一个用户程序分配一个连续内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。...单一连续分配 内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需进行内存保护。...3.4 内存连续分配管理方式 非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式。

    2.5K82

    Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )

    文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配内存操作 函数 ( alloc_bootmem..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存分配 , bootmem_data...表示 上一次分配 内存块 的结束位置 后面的 物理页位置 索引 , 下次分配优先分配该索引 物理页 ; 在下一次分配内存时 , 如果 上次内存分配的物理页 的剩余空间 小于等于 要分配内存 , 那么...直接在该 物理页 上分配内存 ; 二、bootmem 引导内存分配内存操作 函数 ( alloc_bootmem | free_bootmem ) ---- " bootmem 引导内存分配器 "...对外提供的 内存操作 函数如下 : 内存分配函数 : alloc_bootmem 内存释放函数 : free_bootmem 注意 : 在 ARM64 架构中 , 没有使用 引导内存分配器 ;

    3.3K10

    C语言动态内存分配函数

    下面让我们来看看这几个函数各自的特点, 用法, 区别, 联系. 1.malloc() void * malloc(size_t size) 1).malloc()函数会向堆中申请一片连续的可用内存空间...*型, malloc()函数并不知道连续开辟的size个字节是存储什么类型数据的 ,所以需要我们自行决定 ,方法是在malloc()前加强制转 ,转化成我们所需类型 ,如: (int*)malloc(sizeof...), 所以当我们申请的动态内存不再使用时 ,一定要及时释放 . 1).如果ptr没有指向使用动态内存分配函数分配内存空间,则会导致未定义的行为。..., calloc()函数会在返回地址之前将所申请的内存空间中的每个字节都初始化为0 . 1).calloc()函数功能是动态分配num个大小(字节长度)为size的内存空间 . 2).若申请成功 ,,返回指向这片内存空间的指针...,若失败 ,则会返回NULL, 所以我们在用calloc()函数开辟动态内存之后, 一定要判断函数返回值是否为NULL. 3).返回值的类型为void*型, calloc()函数虽然分配num个size

    1.6K30

    Linux 内存分配流程及 kmalloc 解析

    手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...在 start_kernel 内核初始化函数中,一共调用 86 个函数去初始化,其中有一个 mm_init 函数,用以初始化内存。...start_kernel |--->mm_init |--->mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用...bootmem 分配器按块进行分配,颗粒度很大,不够精细,比较浪费内存。bootmem 分配器只会在 start_kernel 函数和mm_init 函数之前存在,中间的函数会调用它进行内存分配

    2.7K11

    Linux内存管理 - slab分配

    Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续内存页的问题。...伙伴分配算法主要以内存页(4KB)作为分配单位,就是说伙伴分配算法每次可以分配 2order 个内存页(order为0、1、2...9)。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...因为本身kmem_cache_t结构体也是小内存对象,所以也应该有slab分配器来分配的,但这样就出现“鸡蛋和鸡谁先出现”的问题。

    2.4K51

    Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元

    1.5K40

    有没有想过:malloc分配内存空间地址连续

    ID:技术让梦想更伟大 作者:李肖遥 提出问题 我们在写程序中经常会用到malloc函数进行动态内存分配,但是我们有没有想过,在C语言中,向操作系统请求malloc内存空间的地址是连续的吗???...测试结果 我们用一次malloc申请多个(数组)地址的是连续地址 。 多次malloc 申请地址,通过对每一次申请的内存空间地址和上一块地址 (p-1)作比较发现,地址并不是连续的。...其实这就是内存边界对齐的问题,使用malloc分配内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的, 对用户而言,所有内存都是虚拟的,程序并不是直接运行在物理内存上,而是运行在虚拟内存上...虚拟内存地址到物理内存地址进行转换时,因为有可能相邻的两个字节是在不同的物理分页上,所以不一定是连续的。...延伸一下 本篇主要是想抛砖引玉,大家可以在自己电脑测试一下,后期会细节讲到字节对齐原则及作用,malloc的原理和内存分配内存分页等问题。

    2.7K40

    kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

    虚拟内存连续、但物理内存中不连续内存区,可以在vmalloc区域分配. 该机制通常用于用户过程, 内核自身会试图尽力避免非连续的物理地址。...动态内存映射区 该区域由内核函数vmalloc来分配, 特点是 : 线性空间连续, 但是对应的物理空间不一定连续. vmalloc分配的线性地址所对应的物理页可能处于低端内存, 也可能处于高端内存....kmallc & kfree分配释放连续的物理内存 kmalloc和kzalloc kmalloc函数与用户空间的malloc一族函数非常类似, 只不过它多了一个flags参数, kmalloc函数是一个简单的接口...他们定义在tools/virtio/linux/kernel.h?v=4.7, line 46 这两个函数返回一个指向内存块的指针, 其内存块至少要有size大小. 所分配内存区在物理上是连续的....那么内存分配可以从该内存域或更低的内存域进行, 该函数定义在include/linux/gfp.h?

    6.5K21

    Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )

    文章目录 一、获取首选内存区域 二、异步回收内存页 三、最低水线也分配 四、直接分配内存 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析...| __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 : 首先 , 根据 gfp_t gfp_mask..." 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 2 种物理页分配方式 ; 继续接着上一篇博客 【Linux 内核 内存管理】物理分配页 ⑦...慢速路径 内存分配 调用函数 的后续部分源码 ; 一、获取首选内存区域 ---- 获取 " 首选内存区域 " , 如果获取失败 , 则 goto 跳转到 nopage 标号位置运行后续代码 ; /*...wake_all_kswapds 函数 , 异步 回收 物理内存页 , 这里的异步 是通过 唤醒 " 回收线程 " 进行回收内存页的 ; if (gfp_mask & __GFP_KSWAPD_RECLAIM

    1.4K20
    领券