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

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申请内存(mmap)

---- 1.为什么要使用内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级表和分页进行管理,操作系统每个默认大小为4KB。...操作系统默认支持的是2MB,当使用1GB内存时,在表中将占用 1GB / 2MB = 512个表项,可以大大提升TLB命中率,进而提升应用性能。...---- 2.怎样使用内存 2.1 先预留一定量的内存 #先查看系统有多少已经预留的内存 # cat /proc/meminfo |grep -i huge #预留192个 # sysctl...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 内存的好处不仅是减少TLB未命中次数,而且内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上...,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,内存在物理上是连续的,对于大内存访问也有一定的加速效果。

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

    全网最硬核 JVM 内存解析 - 3.分配 UseLargePages

    开始) Linux 分配方式 - Huge Translation Lookaside Buffer Page (hugetlbfs) Linux 分配方式 - Transparent...我们要么缩小程序所需内存,要么增大大小。我们一般会考虑增加大小,这就分配的由来,JVM 对于堆内存分配也支持分配,用于优化大堆内存分配。那么 Linux 环境中有哪些分配的方式呢?...UseHugeTLBFS:明确指定是否使用前面第一种分配方式 hugetlbfs 并且通过 mmap 系统调用分配内存。在 linux 下默认为 false。...UseSHM:明确指定是否使用前面第一种分配方式 hugetlbfs 并且通过 shmget,shmat 系统调用分配内存。在 linux 下默认为 false。...这里只是验证下这些内存分配方式是否可用,只有可用后面真正分配内存的时候才会采用那种可用的内存分配方式。

    95910

    Linux分配器之内存碎片化整理

    分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...例如进程需要使用3K bytes物理内存,于是向系统申请了大小等于3Kbytes的内存,但是由于Linux内核伙伴系统算法最小颗粒是4K bytes,所以分配的是4Kbytes内存,那么其中1K bytes...外部碎片化: 指系统中无法利用的小内存块。例如系统剩余内存为16K bytes,但是这16K bytes内存是由4个4K bytes的页面组成,即16K内存物理帧号#1不连续。...蓝色表示空闲的页面,白色表示已经被分配的页面,可以看到如上内存域的空闲页面(蓝色)非常零散,无法分配大于两的连续物理内存

    2.7K20

    Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存 | 产生缺页异常 | 分配物理内存 | 共享内存 | 进程内存 )

    文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存 2、产生缺页异常 3、分配物理内存 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存 分配 虚拟内存 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 3、分配物理内存 分配 物理内存 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 "...缺页异常 " 后 , 会 分配 " 物理内存 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存

    8.4K20

    高端内存映射之vmalloc分配内存中不连续的--Linux内存管理(十九)

    1 内存中不连续的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配内存时, 可能竭尽全力也无法找到连续的内存块....分配到其中的可能位于物理内存中的任何地方. 通过修改负责该区域的内核表, 即可做到这一点. ? ?...v=4.7, line 1354 由于各个vmalloc子区域之间需要插入1(警戒)作为安全隙, 内核首先适当提高需要分配内存长度. static struct vm_struct *__get_vm_area_node...接下来从物理内存分配各个 最后将这些连续地映射到vmalloc区域中, 分配虚拟内存的工作就完成了....unmap_vm_area使用找到的vm_area实例,从表删除不再需要的项。与分配内存时类似,该函 数需要操作各级表,但这一次需要删除涉及的项。它还会更新CPU高速缓存。

    3K10

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

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

    1.5K40

    Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 块、阶 | 伙伴 )

    文章目录 一、伙伴分配器引入 二、块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 分配器 “ 管理 ” 物理 " , " 伙伴分配器 “ 就是 ” 分配器 " , 其特点是 算法简单 , 性能高效 ; 二、块、阶 ---- 伙伴分配器 有如下概念...n 个 连续的 " 物理 " ; 如 : 0 阶块是 2^0 = 1 个 连续的 " 物理 " ; 1 阶块是 2^1 = 2 个 连续的 " 物理 " ; 2 阶块是 2...1 个物理 页号 是 2^n 的整数倍 ; ③ 合并块 : 如果需要合并这两个 n 阶块为 n + 1 阶块 , 则第 1 的 物理 页号必须是 2^{n + 1}...整数倍 ; 0 与 1 是伙伴 ; 2 与 3 是伙伴 ; 1 与 2 不是伙伴 , 这两如果合并成块 , 其第一的页号不是 2^{n + 1} 整数倍

    1K20

    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

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

    文章目录 一、获取首选内存区域 二、异步回收内存 三、最低水线也分配 四、直接分配内存 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析..." 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 2 种物理分配方式 ; 继续接着上一篇博客 【Linux 内核 内存管理】物理分配页 ⑦...ac->preferred_zoneref->zone) goto nopage; 源码路径 : linux-4.12\mm\page_alloc.c#3731 二、异步回收内存 ---- 调用...wake_all_kswapds 函数 , 异步 回收 物理内存 , 这里的异步 是通过 唤醒 " 回收线程 " 进行回收内存的 ; if (gfp_mask & __GFP_KSWAPD_RECLAIM...-4.12\mm\page_alloc.c#3743 四、直接分配内存 ---- 申请 物理 内存 的阶数 , 满足以下 3 个条件 : can_direct_reclaim (costly_order

    1.4K20

    linux内核的冷热分配

    linux本来有伙伴系统分配内存,为了加快单个内存分配linux在每个node里为每个cpu分配了一个per_cpu_pageset(暂且叫他缓存吧)。...每个缓存包含一个冷缓存和一个热缓存。这两个用法有什么区别呢。 如果申请完一个内存就立刻用来写数据,用热缓存。 如果申请完暂时用不到或者给DMA用,用冷缓存。...这主要是因为内核用free_pages释放单个内存的时候会调用free_hot_page。...刚释放的内存大概率还在cpu的cache里,也就是说热缓存里的很可能还在cpu的cache里,所以申请热缓存并且立即使用会直接访问cpu的cache速度会比较快。...其他情况就用冷缓存,冷缓存里的在主内存里,需要重新加载到cpu的cache,速度会慢一些。

    98510

    Linux 内存分配流程及 kmalloc 解析

    手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...伙伴系统解决外部碎片问题,slab 分配器解决内部碎片问题。 1、伙伴系统基于分配,一次分配,这样就不会出现夹在中间的小内存。...3、其实所有的分配方式最底层都是伙伴系统,它先分配好一段内存,然后 slab 再从其中分配小的内存。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用...回复【pdf】即可获得博主总结的上百嵌入式笔试面试题目精选汇总。 我创建了知识星球,欢迎大家扫码加入。在知识星球中有问必答。

    2.7K11

    Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存 | 物理地址与虚拟地址进行映射 | 并分配物理内存 | mmap 库函数与内核系统调用函数 )

    文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存 ) 1、分配虚拟内存 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存...二、mmap 库函数与 mmap 内核系统调用函数 一、mmap 创建内存映射原理 ( 分配虚拟内存 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存 ) ---- 1、分配虚拟内存...分配 虚拟内存 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 此处调用的...*filp, struct vm_area_struct *vma) 3、产生缺页异常并分配物理内存 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问...会 分配 " 物理内存 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存 “ , 并且在 "

    2.3K10

    Linux 标准和透明大

    Huge pages ( 标准 ) 和 Transparent Huge pages( 透明大 ) 在 Linux 中大分为两种:Huge pages ( 标准 ) 和 Transparent...内存是以块即的方式进行管理的,当前大部分系统默认的大小为 4096 bytes 即 4K。1MB 内存等于 256 ;1GB 内存等于 256000 。...Huge Pages Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的页面容量功能...这两者最大的区别在于: 标准管理是预分配的方式,而透明大管理则是动态分配的方式。...标准的页面大小 [root@localhost ~]# grep Hugepagesize /proc/meminfo Hugepagesize: 2048 kB 注:THP 目前只能映射异步内存区域

    5.5K50

    Linux内存管理 - slab分配

    Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存的问题。...伙伴分配算法主要以内存(4KB)作为分配单位,就是说伙伴分配算法每次可以分配 2order 个内存(order为0、1、2...9)。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...:部分分配的slab slab_free:没有被分配过的slab objsize:存储的对象大小 num:一个slab能够存储的对象个数 gfporder:一个slab由2gfporder个内存组成

    2.4K51

    笔记 Lab5: Lazy Page Allocation | 内存分配

    实现一个内存分配机制,在调用 sbrk() 的时候,不立即分配内存,而是只作记录。在访问到这一部分内存的时候才进行实际的物理内存分配。...,就为其分配物理内存,并在表建立映射: // kernel/trap.c // // handle an interrupt, exception, or system call from user...uvmlazytouch(va); // 分配物理内存,并在表创建映射 } else { // 如果不是缺页异常,或者是在非懒加载地址上发生缺页异常,则抛出错误并杀死进程...懒分配内存在被 touch 后就可以被使用了。...懒分配不应该给这个地址分配物理和建立映射,而应该直接抛出异常) (解决 usertests 中的 stacktest 失败的问题) 表项不存在 // kernel/vm.c // touch a

    81020

    Linux分区分配器之水位

    我们讲分配器的时候讲到了快速分配和慢速分配,其中伙伴算法是在快速分配里做的,忘记的小伙伴我们再看下: static struct page * get_page_from_freelist(gfp_t...但安卓这种大量用户操作网络接收的系统中,难免会遇到数据量突然增大,需要临时申请大量的内存,此时有可能kswapd回收的内存速度小于内存分配的速度,即发生direct reclaim,从而阻塞应用严重影响性能...我们知道在内存分配时,只有low和min之间的区域才是kswapd活动的区域。而linux中默认的low与min之间的值又比较小,所以就很容易造成direct reclaim的情况。...「watermark_scale_factor」: 内核总是在进步的,在linux内核4.6版本中,又诞生了一种新的调节水位的方式,即watermark_scale_factor系数,其默认值是10,对应内存占比...至此,分配器中的快速分配方式已经结束,下一篇让我们进入分配器的慢速分配方式:__alloc_pages_slowpath,涉及到内存碎片的整理和内存回收。

    1.3K30
    领券