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

Linux申请大页内存(mmap)

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

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

物理内存充足,但是为什么用代码总申请不到内存呢?

DirectMap4k: 114560 kB DirectMap2M: 4079616 kB DirectMap1G: 6291456 kB 尝试重现 尝试自行测试使用java命令,去申请超出我的测试机物理内存...内核将检查是否有足够的可用内存供应用进程使用; 如果有足够的可用内存内存申请允许;否则,内存申请失败,并把错误返回给应用进程。...overcommit_memory=1 对于内存申请请求,内核不会做任何check,直到物理内存用完,触发 OOM 杀用户态进程。...overcommit_memory=2 当请求申请内存 >= SWAP内存大小 + 物理内存 * N,则拒绝此次内存申请。...vm.overcommit_ratio 只有当 vm.overcommit_memory = 2 的时候才会生效,内存申请内存为 SWAP内存大小 + 物理内存 * overcommit_ratio/

1.6K70

物理内存充足,但是为什么用代码总申请不到内存呢?

DirectMap4k: 114560 kB DirectMap2M: 4079616 kB DirectMap1G: 6291456 kB 尝试重现 尝试自行测试使用java命令,去申请超出我的测试机物理内存...内核将检查是否有足够的可用内存供应用进程使用; 如果有足够的可用内存内存申请允许;否则,内存申请失败,并把错误返回给应用进程。...overcommit_memory=1 对于内存申请请求,内核不会做任何check,直到物理内存用完,触发 OOM 杀用户态进程。...overcommit_memory=2 当请求申请内存 >= SWAP内存大小 + 物理内存 * N,则拒绝此次内存申请。...vm.overcommit_ratio 只有当 vm.overcommit_memory = 2 的时候才会生效,内存申请内存为 SWAP内存大小 + 物理内存 * overcommit_ratio/

1.7K40

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

在x86_32体系结构总, 高于896MB的所有物理内存的范围大都是高端内存, 它并不会永久地或自动映射到内核地址空间, 尽管X86处理器能够寻址物理RAM的范围达到4GB(启用PAE可以寻址64GB)...虚拟内存中连续、但物理内存中不连续的内存区,可以在vmalloc区域分配. 该机制通常用于用户过程, 内核自身会试图尽力避免非连续的物理地址。...它与通过固定公式与物理内存关联的直接映射页相反,虚拟固定映射地址与物理内存位置之间的关联可以自行定义,关联建立后内核总是会注意到的. ?...动态内存映射区 该区域由内核函数vmalloc来分配, 特点是 : 线性空间连续, 但是对应的物理空间不一定连续. vmalloc分配的线性地址所对应的物理页可能处于低端内存, 也可能处于高端内存....他们定义在tools/virtio/linux/kernel.h?v=4.7, line 46 这两个函数返回一个指向内存块的指针, 其内存块至少要有size大小. 所分配的内存区在物理上是连续的.

6.3K21

如何查看linux系统中空闲内存物理内存使用剩余内存

查看linux系统中空闲内存/物理内存使用/剩余内存 查看系统内存有很多方法,但主要的是用top命令和free 命令 当执行top命令看到结果,要怎么看呢?...一些简单的计算方法:  物理已用内存 = 实际已用内存 - 缓冲 - 缓存 = 6811M - 350M - 5114M 物理空闲内存 = 总物理内存 - 实际已用内存 + 缓冲 + 缓存  应用程序可用空闲内存...= 总物理内存 - 实际已用内存  应用程序已用内存 = 实际已用内存 - 缓冲 - 缓存 top命令的结果详解 top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况...内容如下: Mem: 191272k total  物理内存总量   173656k used  使用的物理内存总量   17616k free  空闲内存总量   22052k buffers  ...测量一个进程占用了多少内存linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。

19.7K41

Linux 内核 内存管理】物理内存组织结构 ⑥ ( 物理页 page 简介 | 物理页 page 与 MMU 内存管理单元 | 内存节点 pglist_data 与 物理页 page 联系 )

文章目录 一、物理页 page 简介 1、物理页 page 引入 2、物理页 page 与 MMU 内存管理单元 3、物理页 page 结构体 4、Linux 内核源码中的 page 结构体 二、内存节点...pglist_data 与 物理页 page 联系 内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 物理页 Page , Linux 内核中 , 使用 上述..., 就是 " 内存区域 " zone , " 内存区域 " 再向下划分 , 就是 " 物理页 " page ; 2、物理页 page 与 MMU 内存管理单元 在 Linux 内核中 , MMU 内存管理单元...结构体 " 物理页 " page 是 Linux 内核 " 内存管理 " 中的 最小单位 , 物理页 中的 " 物理地址 " 是连续的 , 每个 " 物理页 " 使用 struct page 结构体...SPARSEMEM */ // 页描述数组 struct page *node_mem_map; #endif } 参考 【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构

6.7K10

物理内存管理

前言: 书接上回《内存映射技术分析》,继续来分析一下linux物理内存管理。 分析: 1,物理内存 PC上的内存条,或者手机上的内存芯片,物理上实实在在的内存,就是物理内存。...在linux-4.0.4/mm/page_alloc.c中: ? 其中MAX_ORDER是11,所以order最大也就是10,因此linux上从buddy system可以申请最大的连续内存就是4M。...这里需要说明一下,对于Linux来说,一般都不需要连续的内存,因为系统跑起来之后,CPU在protected mode下访问的是虚拟地址,MMU把不连续的物理地址映射成连续的虚拟地址就可以了。...在linux-4.0.4/mm/page_alloc.c中: ? order为0的情况下,优先选择从pageset中申请。cold和hot的的区别就是从list的尾部还是头部分配page。...slab的大概实现:申请一段内存,把它分成n个xx类型的数据结构那么大,每次申请的时候,直接从这个cache里面拿就行了,加快了分配速度。

2.6K70

Linux释疑:物理内存占用80%以上,正常吗?

Linux 系统(比如 CentOS/RadHat、Debian/Ubuntu)上配置 lnmp环境,通过探针查看物理内存使用率: 当然,也可以使用 top 命令查看: 从上面的图片可以看出 物理内存...Linux 特性: 充分利用物理内存,加快数据访问 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。...主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。...换句话说,每增加一些物理内存Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。...Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers ,以此提高数据访问性能。 页高速缓存(cache)是 Linux内核实现的一种主要磁盘缓存。

4.5K10

Linux 内核 内存管理】物理页释放 ( 物理页释放 __free_pages 函数 )

文章目录 一、物理页释放 __free_pages 函数 一、物理页释放 __free_pages 函数 ---- 页分配器 提供了 释放 物理页的 函数 __free_pages , 该函数定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ; __free_pages 函数参数分析 : struct page *page 参数 表示 要释放的 物理页 page...的 虚拟空间地址 ; unsigned int order 参数 表示 要释放的 物理页 的 " 阶数 " , 也就是 要释放的物理页大小 ; 阶 ( Order ) : 物理页 的 数量单位 ,...n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) __free_pages 函数源码...order == 0) free_hot_cold_page(page, false); else __free_pages_ok(page, order); } } 源码路径 : linux

12.6K20

物理内存与虚拟内存

物理内存就是你的机器本身内存了(如内存条的大小)。物理内存就是CPU的地址线可以直接进行寻址的内存空间大小。...当物理内存用完后,虚拟内存管理器选择最近没有用过的,低优先级的内存部分写到交换文件(页面文件)上,并将需要访问内存的程序的内容从页面文件中换入到物理内存。...所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。有的地方呢,也叫这个虚拟内存内存交换区。...的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。...总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

2.1K31

Android 内存申请分析

作者:amritazhou 最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息...对象的信息: 这种使用方式相当直观,可以看到申请对象大小,数量,还有堆栈等,通过这些信息,我们可以作为我们接下来进行内存优化的参考 但是,对于这种获取申请对象信息的方法,会存在几个问题: 1、获取的信息过于分散...AllocTracker.cpp这里的方法: 从上面的代码可以看出,在开启了Allocation Tracker之后,在Dalvik全局变量gDvm下,将其中的allocRecords指向了一块新的申请内存区域...对Allocation Tracker的响应过程就非常清晰了: 1、在收到Allocation Tracker的请求的时候,首先给Dalvik全局变量gDvm中的allocRecords字段指向一段新申请内存...,申请内存的大小,由gDvm.allocRecordMax指定; 2、后续Dalvik每次新申请对象的时候,只要allocRecords不为NULL,那就会不断的往allocRecords指向的内存区域中写入的新申请对象的信息

1.5K00

深入理解 Linux 物理内存分配全链路实现

前文回顾 在上篇文章 《深入理解 Linux 物理内存管理》中,笔者详细的为大家介绍了 Linux 内核如何对物理内存进行管理以及相关的一些内核数据结构。...下面要介绍的这些物理内存分配接口均需要指定这个分配阶,意思就是从伙伴系统申请多少个物理内存页,假设我们指定分配阶为 order,那么就会从伙伴系统中申请 2 的 order 次幂个物理内存页。...,该函数返回值是一个 struct page 类型的指针用于指向申请内存块中第一个物理内存页。...就会遇到一个问题,就是我们申请的这些物理内存到底来自于哪个物理内存区域 zone,假如我们想要从指定的物理内存区域中申请内存,我们该如何告诉内核呢 ?...关于物理内存区域中的紧急预留内存相关内容,笔者在之前文章 《深入理解 Linux 物理内存管理》一文中的 “ 5.1 物理内存区域中的预留内存 ” 小节中已经详细介绍过了。

47610

Kmalloc申请内存源码分析

本节我们重点分析下Kmalloc的实现,其实在驱动中大家使用最多的就是用kmalloc申请内存,kmalloc申请内存大小都普遍比较小,比较快,而且物理地址和虚拟地址是线性映射的,因为kmalloc拿到的内存是从...2个参数,第一个参数就是要申请的大小,第二个参数就是申请内存的一些flag,比如常见的GFP_KERNEL 大家也看下注释都有哪些flag,这些flag都代表啥意思,是否可以睡眠,是否是原子操作等 __...也就是申请太大的内存,就不用直接找我slab了,直接去找buddy拿吧 通过kmalloc_slab去获取对应大小的kmem_cache缓冲池 调用slab_alloc从对应的kmem_cache中去申请一个...所以说来说去,还是从slab去申请内存,里面的内存就和上一节的内存一样了。 如果size大于4K,每个平台,每个版本,每个slab的实现大小不一样。...kmalloc_caches[index]; } 根据size计算出一个index,此index就是kmalloc_caches数组下标,此数据中有对应很多个大小的kmalloc_cache缓冲池 如果申请内存是从

2K20

物理内存管理之zone详解

上一次说过了物理内存由node,zone,page三级结构来描述。而node是根据当前的系统是NUMA还是UMA系统。假设我们当前是UMA系统架构,则只有一个node。 ?...WMARK_LOW:低水位,代表内存已经开始吃紧,需要启动回收页内核线性kswapped去回收内存 WMARK_HIGH:高水位,代表内存还是足够的。...,当系统内存出现不足的时候,系统就会使用这些保留的内存来做一些操作,比如使用保留的内存进程用来可以释放更多的内存 free_area:用于维护空闲的页,其中数组的下标对应页的order数。...通过pglist_data知道存在几个zone,每个zone中又存在freelist来表示各个order空闲的page,以及各个page是属于什么迁移类型的 当申请page的时候根据zone中的水位去申请...,当内存不足的时候,就会开启内核swapd来回收内存 每次申请的page都会挂到lru链表中,当出现内存不足的时候,就会根据lru算法找出那些page最近很少使用,然后释放

3.2K10

Java通过JNI申请直接内存

【环境】 Linux环境 约定: 所有的测试文件都放在2022-3-14目录下 【1】 将 JAVA_HOME/include/jni.h 和 JAVA_HOME/include/linux/jni_md.h...函数申请内存, 主要就是要观察在Java中, 堆外内存/直接内存申请方式, 以及如何被管理的....在Java中可以通过使用ByteBuffer.allocateDirect() 和 unsafe.allocateMemory() 以及本文介绍的通过JNI申请内存, 这三种方式的区别是什么呢?...mmap申请内存, 我们拿到的起始地址就是maps中显示的地址, 是吻合的....而Java方式拿到的地址, 还是一样, 偏差了0x10 简单说, malloc底层调用mmap系统函数申请内存(还有一种是brk系统函数), 只是malloc又对从操作系统拿到的内存做了手脚, 之所以做手脚是为了合理管理内存

1.2K30
领券