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

Linux内存分配策略

但有时候内核需要分配一些物理内存地址也连续的内存, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存....上一节说过, 内核使用 alloc_pages() 函数来分配内存, 而 alloc_pages() 函数最后会调用 rmqueue() 函数来分配内存, rmqueue() 函数原型如下: static...struct page * rmqueue(zone_t *zone, unsigned long order); 参数 zone 是内存管理区, 而 order 是要分配 2order 个内存....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限呢? 当然不是, 在Linux内核中, order的最大值是 10....如果申请到的内存块比要申请的大小, 那么需要调用 expand() 函数来把内存块分裂成指定大小的内存块.

3.3K10

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

内存与实际占用内存的差异 JVM commit 的内存与实际占用内存的差异 分配 UseLargePages(全网最硬核 JVM 内存解析 - 3.分配 UseLargePages...JVM 内存申请与使用流程 2.3. 分配 UseLargePages 前面提到了虚拟内存需要映射物理内存才能使用,这个映射关系被保存在内存中的表(Page Table)。...我们要么缩小程序所需内存,要么增大大小。我们一般会考虑增加大小,这就分配的由来,JVM 对于堆内存分配也支持分配,用于优化大堆内存分配。那么 Linux 环境中有哪些分配的方式呢?...如果读取 /proc/meminfo 获取默认大小读取不到或者为 0,则代表系统也不支分配分配也不启用。...这里只是验证下这些内存分配方式是否可用,只有可用后面真正分配内存的时候才会采用那种可用的内存分配方式。

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

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

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

    8.4K20

    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

    高端内存映射之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

    笔记 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

    81120

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

    分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...外部碎片化: 指系统中无法利用的小内存块。例如系统剩余内存为16K bytes,但是这16K bytes内存是由4个4K bytes的页面组成,即16K内存物理帧号#1不连续。...在系统剩余16K bytes内存的情况下,系统却无法成功分配大于4K的连续物理内存,该情况就是内存外碎片导致。...蓝色表示空闲的页面,白色表示已经被分配的页面,可以看到如上内存域的空闲页面(蓝色)非常零散,无法分配大于两的连续物理内存

    2.7K20

    【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

    java内存分配

    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。...应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配内存是自动初始化的。...Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配内存实际建立这个对象,而在堆栈中分配内存只是一个指向这个堆对象的指针...堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。...但缺点是,由于要在运行时动态分配内存,存取速度较慢。   栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    2.1K50

    Netty内存分配

    对于小的对象来说,直接由线程的局部缓存来完成,对象那就由自旋锁来减少多线程下的竞争)的设计思路,但是 Jemalloc 设计的更复杂,虽然也有线程缓存的特性,但是 Jemalloc 将内存分配的粒度划分为...虽然有众多的内存分配器,但是它们的核心都是一致的: 高效内存分配和回收,提升单线程或者多线程场景下的性能; 减少内存碎片,包括内部碎片和外部碎片,提升内存的有效利用率。...这边有个内存碎片的概念,可以介绍下,Linux 中物理内存会被分成若干个 4k 大小的内存 Page,物理内存分配和回收都是基于 Page 完成的,内部碎片就是 Page 内部产生的碎片,外部碎片就是各个...执行内存分配,提高内存分配的使用效率。...内存分配策略 分配内存大于 8k,PoolChunk 中采用的 Page 级别的内存分配策略 假设我们依次申请了 8k、16k、8k 的内存 首先根据分配内存大小计算二叉树所在节点的高度,然后查找对应高度中是否存在可用节点

    50320

    连续内存分配

    为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。 在内存分配之前,我们需要知道内存保护的问题。首先,用户进程之间彼此不能影响,用户进程也不能影响操作系统。...连续内存分配是最简单的一种方法,它主要用于批处理系统。给内存分为固定大小的块。每个块只能容纳一个进程。这样一个个大小不同的内存分块就形成了,当新进程需要内存的时候,系统会为它找一块足够大的孔。...如果孔很大,那么剩余的部分还会作为一个孔,当进程退出的时候,它将释放内存。如果新的孔和旧的孔在一起,那么可以合并它们。但是新进程需要内存的时候,将哪个合适的孔分配给它?...不连续的小孔最终就会无法容纳一个进程,导致产生碎片化的内存。还有一种碎片是内部碎片,一般系统分配内存是2的次方,而不是你需要多大分配的就刚好是这么。...这样只要有物理内存就可以为进程分配。主要有两种实现方案分页和分段。它们还可以合并使用。

    1.8K20

    【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

    数组大小分配(动态内存分配

    这种分配固定大小内存分配的方法称为静态内存分配。...为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。...动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。...从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点: 不需要预先分配内存空间 分配的空间可以根据程序的需要扩大或缩小 1.如何实现动态内存分配及其管理 要实现根据程序的需要动态分配存储空间...free函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

    2.6K20

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

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

    2.3K10

    Go 内存管理 -- 内存分配

    接上一篇,下面来看看内存分配的初始化、分配等。...初始化 首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。...内存分配 针对于不同大小的的对象,go的分配策略是不同的: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配...(32KB, -) : 对象分配 Tiny分配对象分配都属于内存管理的优化范畴,这里就仅看正常分配。...go的内存分配非常复杂,中间还有很多GC的细节在里面,一言半语的也说不详细,大家可以对着简单的纲要直接看源码,注释也非常详细,一定要对照上一篇的图来理解go内存管理。

    1.7K30

    【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
    领券