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

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

内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " , 创建一个 映射 , " 内存映射 " 有 2 种情况 , ① 文件映射 , ② 匿名映射 ; 文件映射 : 有 文件 支持 的 内存映射..., 将 指定文件 的 指定位置 指定大小 的数据 , 映射到 进程 " 用户虚拟地址空间 " , 文件内容直接装载到该 虚拟内存 ; 匿名映射 : 没有 文件 支持 的 内存映射 , 只是将..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存分配 虚拟内存页 : 在 Linux 系统 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问...缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “

8.3K20

Linux内存分配策略

伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存页, 所以Linux使用了 伙伴系统分配算法 来管理系统的物理内存页....在Linux内核, 把两个物理地址相邻的内存页当作成伙伴, 因为Linux是以页面号来管理内存页的, 所以就是说两个相邻页面号的页面是伙伴关系....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限大呢? 当然不是, 在Linux内核, order的最大值是 10...., 如果order为3的空闲链表有空闲内存块, 那么就从order为3的链表申请一块空闲内存块, 并且把此内存块分裂为2块order为2的内存块, 一块添加到order为2的空闲链表, 另外一块分配给用户

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

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、查询

7K50

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

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

5.1K30

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

1 内存不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块....分配到其中的页可能位于物理内存的任何地方. 通过修改负责该区域的内核页表, 即可做到这一点. ? ?...2 用vmalloc分配内存 vmalloc是一个接口函数, 内核代码使用它来分配在虚拟内存连续但在物理内存不一定连续的内存 // http://lxr.free-electrons.com/source...该信息保存在phys_addr caller 其中flags只用于指定内存区类型, 所有可能的flag标识以宏的形式定义在include/linux/vmalloc.h?...与vmalloc相比,该函数所用的物理内存位置不是隐式分配的,而需要先行分配好,作为参数传递。此类映射可通过vm_map实例的VM_MAP标志辨别。

2.9K10

Linux内存映射函数mmap与匿名内存

学习系列:《APUE14.8》《CSAPP9.8.4》 1 总结 memory-mapped io可以将文件映射到内存的buffer,当我们从buffer读写数据时,其实操作的是对应文件的数据...mmap也可以直接映射匿名内存块,无需提供文件fd,直接申请一块内存给当前进程使用,也可以选择继承给子进程。注意匿名映射不会真的创建文件,只是拿到了一块填充0的内存。...申请在堆和栈中间的位置: 4 匿名内存块映射(Postgresql的mmap) CreateAnonymousSegment ptr = mmap(NULL, allocsize, PROT_READ...创建和返回映射比预分配的堆产生更多的开销。...5 匿名内存块使用实例(Postgresql的mmap方式实例) #include #include #include #include

2K30

Linux 内存分配流程及 kmalloc 解析

手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...在 start_kernel 内核初始化函数,一共调用 86 个函数去初始化,其中有一个 mm_init 函数,用以初始化内存。...3、其实所有的分配方式最底层都是伙伴系统,它先分配好一段大的内存,然后 slab 再从其中分配小的内存。...在多核大系统大内存,一般使用 slub 分配器,在极小的嵌入式系统,一般使用 slob 分配器(只有600多行代码)。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程的一个临时分配器,他会在 setup_arch 函数初始化,然后在 mm_init 关掉,只是在伙伴系统出现之前的临时使用

2.6K10

论 Java 内存分配

------------------------------------------------------------------------- Java内存分配主要包括以下几个区域: 1....在内存的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。     所以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。...栈(Stack):  又称堆栈    位于一般的RAM。处理器经由指针提供直接支持。    当程序配置一块新的内存时,stack指针便往后移;释放内存时,指针则往前移。   ...另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的  堆:   堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据...但缺点是,由于要在运行时动态分配内存,存取速度较慢。 3.栈有一个很重要的特殊性,就是存在栈的数据可以共享 四.

97670

Linux内存管理 - slab分配

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

2.3K51

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

虚拟内存连续、但物理内存不连续的内存区,可以在vmalloc区域分配. 该机制通常用于用户过程, 内核自身会试图尽力避免非连续的物理地址。...v=4.7, line 3853 3 分配掩码(gfp_mask标志) 3.1 分配掩码 前述所有函数强制使用的mask参数,到底是什么语义? 我们知道Linux内存划分为内存域....区描述都符 内核把物理内存分为多个区, 每个区用于不同的目的, 区描述符指明到底从这些区的哪一区进行分配 行为修饰符 表示内核应该如何分配所需的内存....在某些特定情况下, 只能使用某些特定的方法分配内存 类型标志 组合了行为修饰符和区描述符, 将这些可能用到的组合归纳为不同类型 3.3 内核掩码的定义 3.3.1 内核的定义方式 // http...那么内存分配可以从该内存域或更低的内存域进行, 该函数定义在include/linux/gfp.h?

6.4K21

详解Go内存分配源码实现

即如果要分配的对象是个小对象(<= 32k),在每个线程中都会有一个无锁的小对象缓存,可以直接高效的无锁的方式进行分配; 如下:对象被分到不同的内存大小组的链表。 ?...return s } 这里会根据需要分配内存大小再判断一次: 如果要分配的页数小于pageCachePages/4=64/4=16页,那么就尝试从pcache申请内存; 如果申请的内存比较大或者线程的页缓存内存不足...总结 本文先是介绍了如何对go的汇编进行调试,然后分了三个层次来讲解go内存分配是如何进行的。...对于小于32k的对象来说,go通过无锁的方式可以直接从mcache获取到了对应的内存,如果mcache内存不够的话,先是会到mcentral获取内存,最后才到mheap申请内存。...对于大对象(>32k)来说可以直接mheap申请,但是对于大对象来说也是有一定优化,当大对象需要分配的页小于16页的时候会直接从pageCache中分配,否则才会从堆页获取。

90160

JAVA对象在JVM内存分配

如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java的实例对象在内存的空间分配(JDK1.8)。...= 2010; private int month = 10; private int day = 1; } 以Student类执行到main方法的最后一行时来分析java实例对象在内存分配情况...java对象在内存的关系 图画的稍微有点问题,不过能说明对象在内存的大致位置。 从图中我们可以看出,普通的java实例对象内存分配,主要在这三个区域:虚拟机栈、堆、方法区。...从变量的角度来分析 局部变量:存放在虚拟机栈(具体应为[栈->栈帧->局部变量表]) 基本类型的值直接存在栈。如age=10 如果是对象的实例,则只存储对象实例的引用。...如s=ref 实例变量:存放在堆的对象实例。如Student的实例变量 name=ref 静态变量:存放在方法区的常量池中。如Student.class的birthday=ref。

1.8K120

alloc_page分配内存空间--Linux内存管理(十七)

Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述....相反, 必须指定的是分配阶, 伙伴系统将在内存分配2^0 rder页 内核细粒度的分配只能借助于slab分配器(或者slub、slob分配器), 后者基于伙伴系统 内存分配函数 功能 定义 alloc_pages...v=4.7, line 453 3.2 zone_watermark_ok函数检查标志 设置的标志在zone_watermark_ok函数检查, 该函数根据设置的标志判断是否能从给定的内存分配内存....,就要按zonelist的顺序扫描该zonelist备用zone列表,一个个的试用 nodemask 表示节点的mask,就是是否能在该节点上分配内存,这是个bit位数组 preferred_zone...如果两个条件之一不能满足,即或者没有足够的空闲页,或者没有连续内存块可满足分配请求,则循环进行到备用列表的下一个内存域,作同样的检查.

3K11

Netty内存分配

背景 Netty 内存管理的实现并不是一蹴而就的,它也是参考了 Jemalloc 内存分配器。...这边有个内存碎片的概念,可以介绍下,Linux 物理内存会被分成若干个 4k 大小的内存页 Page,物理内存分配和回收都是基于 Page 完成的,内部碎片就是 Page 内部产生的碎片,外部碎片就是各个...Page:是 Chunk 用于管理内存的单位,Netty 的 Page 的大小为 8k,假如需要分配 64K 的内存,需要在 Chunk 中选取4个 Page 进行分配。...PoolChunk,在第一次内存分配时,PoolChunkList 并没有可用的 PoolChunk,所以需要新创建一个 PoolChunk 并添加到 qInit 列表。...内存分配策略 分配内存大于 8k,PoolChunk 采用的 Page 级别的内存分配策略 假设我们依次申请了 8k、16k、8k 的内存 首先根据分配内存大小计算二叉树所在节点的高度,然后查找对应高度是否存在可用节点

39920

java内存分配

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

2K50
领券