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

Linux申请大页内存(mmap)

---- 1.为什么要使用大页内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...当多个内存密集型应用访问内存时,会造成过多的TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行的办法就是增大每个页的尺寸。...---- 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

linux内存查看方式

: 1002M used 已经使用的内存数: 769M free 空闲的内存数: 232M shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 62M cached Page...所以,以应用来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家一些常识.Linux为了提高磁盘和内存存取效率, Linux做了很多精心的设计,...除了对dentry进行缓存(用于VFS,加速文件路 径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。...的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常 swap用很多,可能你就要考虑加物理内存了.这也是linux...看内存是否够用的标准哦.

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

Android 内存申请分析

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

1.5K00

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

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

Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores

Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc的共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。...IPC的共享内存: 在当前例子中,IPC的共享内存申请了一个PGShmemHeader的空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存,调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc

64920

内存寻址方式

方式指明数据是以字符的形式给出的 编译器将他们转化为他们对应的ascii码 通过ascii码表我们可以发现同一个大写和小写字符相差20h assume cs:code,ds:data data segment...他的偏移地址为(bx)+idata mov ax,[bx+200]的含义 将一个内存单元的内容送入ax 这个内存单元的长度为2字节 段地址在ds中 偏移地址为200+bx (ax) = ((ds)*...上图是一些寻址方式 SI 和DI是变址寄存器 assume cs:code,ds:data data segment db '1.file' db '2.edit' db '3.search' db...ax,1 add bx,2000h or bx,00010000b mov al,'a' 寄存器 mov ax,bx 段地址和偏移地址 前面说到的内存寻址的几种方式都可以 指令处理的数据长度 字操作 直接用...如何通过编程修改指定内存中的数据 我们之前已经学习过很多种内存寻址的方式,包括直接寻址 寄存器间接寻址 相对寻址等寻址方式

14310

探秘malloc是如何申请内存

今天分析下malloc申请内存时都发生了什么,Let dot it 我们都清楚malloc申请内存不是立刻就建立虚拟地址和物理地址的映射的,当int *p = malloc(100*1024)执行这条指令之后...当malloc申请内存小于128K的时候是属于heap的,自己可以动手实验下。当申请内存大于128K之后,就会从mmap区域申请内存的。...当写malloc申请内存0x76143BC000的时候,就会发生缺页异常,发生page_fault。...return ret; } 如果pmd里面的值是NULL,所以pte不存在,设置pte为NULL 判断此vma是否是匿名页,通过判断vma→vm_ops是否为NULL, 啥是匿名页: malloc申请内存...stack里申请内存 mmap申请的匿名的内存映射 以上三种都属于匿名页 很明显我们是malloc申请内存,就会走到匿名页里面去 如果不是匿名页,那就是有文件背景的页,就是和映射的时候有对应的实体

2.2K40

Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )

文章目录 一、mmap 创建内存映射 与 malloc 申请内存对比 1、malloc 函数原型 2、malloc 申请动态内存过程 3、malloc 使用的系统调用判定 ( brk | mmap )...调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free |...函数 申请 虚拟内存 , 之后将该 虚拟内存页 划分成 内存块 , 分配给 应用进程 , 默认的 内存块 划分阈值 是 128 KB ; 使用 brk 系统调用 : 如果 应用程序 申请内存大小...小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序 申请内存大小...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux

6K20

申请内存时底层发生了什么?

---- 内存申请释放对程序员来说就像空气一样自然,你几乎不怎么能意识到,有时你意识不到的东西却无比重要,申请过这么多内存,你知道申请内存时底层都发生什么了吗?...普通程序永远也去不了内核态,只能以通信的方式从用户态往内核态传递信息。...标准库 虽然我们可以通过系统让操作系统替我们完成一些特定任务,但这些系统调用都是和操作系统强相关的,Linux和Windows的系统调用就完全不同。...这就是为什么在C语言下同样的open函数既能在Linux下打开文件也能在Windows下打开文件的原因。 说了这么多,这和malloc又有什么关系呢?...我们看到的冰山是这样的:我们向malloc申请内存,malloc内存不够时向操作系统申请内存,之后malloc找到一块空闲内存返回给调用者。

63810

Linux内存描述之高端内存--Linux内存管理(五)

1547MB HighTotal 825MB LowTotal 721MB 申请高端内存时,如果高端内存不够了,linux也会去低端内存申请,反之则不行。...对应高端内存的3部分,高端内存映射有三种方式: 3.1 映射到”内核动态映射空间”(noncontiguous memory allocation) 这种方式很简单,因为通过vmalloc() ,在”内核动态映射空间...”申请内存的时候,就可能从高端内存获得页面(参看 vmalloc 的实现),因此说高端内存有可能映射到”内核动态映射空间”中 3.2 持久内核映射(permanent kernel mapping) 如果是通过...线性地址与物理地址是内核直接映射方式。不能用于大于896M的高端内存。...6.3 高端内存映射方式: 高端内存映射有三种方式: 映射到“内核动态映射空间” 这种方式很简单,因为通过 vmalloc() ,在“内核动态映射空间”申请内存的时候,就可能从高端内存获得页面(参看

12.1K22

Win3内存管理之私有内存跟共享内存申请与释放

一丶内存简介私有内存申请   通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存....但是我们知道物理内存是一个页.所以申请一个页即可. DWORD flAllocationType, 申请内存的类型. 是这样的.我们申请内存在物理页....可以有两种类型.一种类型就是物理内存直接申请.一种就是物理内存占位置.并不申请.一般用第一种....给这个指定进程申请内存. new malloc的区别. 请注意.真正申请内存的其实是API. 而new malloc 是申请内存....而 malloc的底层是通过 HeapAlloc申请的. 并没有进0环(内核) 二丶共享内存申请 1.共享内存申请   共享内存其实就是物理页可以共享使用了. A进程申请物理页往这个物理页填写内容.

1.4K20

宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?

本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存...Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存。...,一般用户在申请内存的时候,进行DIRECT RECLAIM。...比如回收内存的代码本身也可能需要申请内存,这个时候我们应该给它无限制的申请能力。...所以,内存的设计选择是,当有人用GFP_ATOMIC申请内存的时候,允许它从MIN水位以下,申请一定数量的内存。什么叫“一定数量”呢?

55430

Linux - Linux内存管理

移除交换空间 ---- 概念 内存管理是Linux系统重要的组成部分。...为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存Linux内存管理采取的是分页存取机制。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。

52.1K41

宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?

本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存...在Linux中,内存有3个水位: HIGH: 系统的free内存大于HIGH水位的时候,是一个相对保险的值,不需要急着做内存回收(reclaim); LOW: 系统的free内存达到LOW水位的时候,...比如回收内存的代码本身也可能需要申请内存,这个时候我们应该给它无限制的申请能力。典型地,比如kswapd就设置了这个标记,这个代码里面的注释也非常精彩: ?...如果我们不允许回收内存的代码申请min以下的内存,则回收内存的代码可以触发回收内存,这样“子子孙孙,无穷匮也”。...所以,内存的设计选择是,当有人用GFP_ATOMIC申请内存的时候,允许它从MIN水位以下,申请一定数量的内存。什么叫“一定数量”呢?

3.9K31

JVM系列二:GC策略&内存申请、对象衰老

的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域...这样就不需要每次GC都将内存中所有对象都检查一遍。...内存申请、对象衰老过程 一、内存申请过程 JVM会试图为相关Java对象在Eden中初始化一块内存区域; 当Eden空间足够时,内存申请结束。...,则出现"Out of memory错误"; 二、对象衰老过程 新创建的对象的内存都分配自eden。...GC触发条件 GC类型触发条件触发时发生了什么注意查看方式YGCeden空间不足清空Eden+from survivor中所有no ref的对象占用的内存 将eden+from sur中所有存活的对象copy

76550

Linux内存描述之内存节点node--Linux内存管理(二)

CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大....因此linux内核需要用一种体系结构无关的方式来表示内存....因此linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于...系统中的NUMA结点都是从0开始编号的 3.1 linux-2.4中的实现 pgdat_next指针域和pgdat_list内存结点链表 而对于NUMA结构的系统中, 在linux-2.4.x之前的内核中所有的节点...-3.x~4.x的实现 node_data内存节点数组 在新的linux3.x~linux4.x的内核中,内核移除了pg_data_t的pgdat_next之指针域, 同时也删除了pgdat_list链表

7.5K20
领券