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

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

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问...缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射文件 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “...才可以 ; 如果修改了 进程 " 共享内存 " 对应 " 文件映射 " , 修改后不会立刻更新到文件中 , 调用 msync 函数 , 强制同步写入到文件中 ; 四、进程内存内存映射类型

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

    Linux进程内存管理

    mm_struct结构描述了一个进程整个虚拟地址空间,vm_area_truct描述了虚拟地址空间一个区间(简称虚拟区)。...下图就是我们所说由task_struct到mm_struct,进程地址空间分布。 ? 每一个进程都会有自己独立mm_struct,这样每一个进程都会有自己独立地址空间,这样才能互不干扰。...当进程之间地址空间被共享时候,我们可以理解为这个时候是多个进程使用一份地址空间,这就是线程。...; unsigned int last_interval; unsigned long flags; struct core_state *core_state; } 分配每个虚拟内存区域都由一个...vm_area_struct 数据结构来管理,包括虚拟内存起始和结束地址,以及内存访问权限等,通常命名为vma;vm_area_struct 数据结构定义如下: ?

    3.3K21

    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 + 2 阶页块 查询当前是否有 空闲 n + 2 阶页块 , 如果有 , 将 n + 2 阶页块 分成 2 个 n + 1 阶页块 , 一块插入 空闲 n + 1 阶页块链表

    7.1K50

    linux进程内存布局

    BSS段属于静态内存分配。 数据段:在采用段式内存管理架构中,数据段(data segment)通常是指用来存放程序中已初始化全局变量一块内存区域。数据段属于静态内存分配。...堆(heap):堆是用于存放进程运行中被动态分配内存段,它大小并不固定,可动态扩张或缩减。...当进程调用malloc等函数分配内存时,新分配内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放内存从堆中被剔除(堆被缩减) 栈 (stack):栈又称堆栈, 是用户存放程序临时创建局部变量...除此以外,在函数被调用时,其参数也会被压入发起调用进程栈中,并且待到调用结束后,函数返回值也会被存放回栈中。由于栈先进先出特点,所以 栈特别方便用来保存/恢复调用现场。...分配效率:栈是机器系统提供数据结构,计算机会在底层分配专门寄存器存放栈地址,压栈出栈都有专门指令执行,这就决定了栈效率比较高; 堆则是 C/C++函数库提供,它机制是很复杂,例如为了分配一块内存

    3.1K41

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

    他们定义在tools/virtio/linux/kernel.h?v=4.7, line 46 这两个函数返回一个指向内存指针, 其内存块至少要有size大小. 所分配内存区在物理上是连续....v=4.7, line 3853 3 分配掩码(gfp_mask标志) 3.1 分配掩码 前述所有函数中强制使用mask参数,到底是什么语义? 我们知道Linux内存划分为内存域....它限制只在分配到当前进程各个CPU所关联结点分配内存。如果进程允许在所有CPU上运行(默认情况),该标志是无意义。...这个标志用于为用户空间进程分配内存时使用 GFP_DMA GFP_DMA32 用于分配适用于DMA内存, 当前是__GFP_DMA同义词, GFP_DMA32也是__GFP_GMA32同义词 GFP_HIGHUSER...那么内存分配可以从该内存域或更低内存域进行, 该函数定义在include/linux/gfp.h?

    6.5K21

    Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 procpidmaps 中查看进程内存详情 )

    文章目录 一、sbrk 内存分配系统调用代码示例 二、在 /proc/pid/maps 中查看进程内存详情 本篇博客调用 sbrk 系统调用函数 , 申请并修改 堆内存 , 并在 /proc/pid/...maps 中查看该进程内存 ; 一、sbrk 内存分配系统调用代码示例 ---- sbrk 系统调用函数 , 作用是 修改程序 BSS 段大小 ; 函数原型如下 : #include <unistd.h...(void*)-1 返回值 ; 内存地址查找 : 先获取 当前运行 进程 ID , 也就是 PID , 然后根据 PID 找到 内存地址 ; 如果进程退出 , 也就获取不到 进程 信息了 , 这里需要有一个死循环..., 在第二次申请内存时 , 指针始终没有改变 , 一直都是 0x203e000 地址 ; 如果使用新指针 p_new 接收 sbrk 系统调用返回内存指针 , 则分配是新地址 ; 二、在 /...proc/pid/maps 中查看进程内存详情 ---- 在上一节 , 已经打印出进程 PID 为 4829 , 根据该 PID , 可以直接获取该进程内存情况 , 执行 cat /proc/

    4K20

    Linux进程通信——共享内存

    共享内存 原理与概念 两个进程PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立,所以在物理内存地址也不同。 那么共享内存是怎么做到呢?...首先先在物理内存中申请一块内存。 然后讲这块内存通过页表映射分别映射到这两个进程虚拟地址空间内,让这两个进程都能看到这块内存。...(这里也称为进程和共享内存挂接) 最后如果不想通信了: 取消进程内存映射关系(去关联) 释放内存(释放共享内存) 理解: a.这里和原本C语言当中maclloc函数开辟空间不同,...b.进程通信这个申请一块共享内存是专门设计出来,用来IPC。 c.共享内存是一种通信方式,所有想通信进程都可以用。 d.OS一定可能会存在很多共享内存。...概念就是:通过让不同进程看到同一个内存方式就叫做共享内存

    5.8K30

    Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )

    交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页...分配情况 , 如果物理页 分配 , 在 位图中物理页对应为 置 1 ; 如果物理页 回收 , 在 位图中物理页对应为 置 0 ; 3、最先适配算法 最先适配算法 : 分配内存时 , 扫描..." 位图 " , 找到 满足 内存需求大小 第一块 空闲内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页内存分配 , bootmem_data...结构体中 last_end_off 成员 记录 上一次分配 内存结束位置 +1 地址 , 也就是 分配内存块 结束位置 后面一个字节 , 下一个将要开始分配内存位置 ; hint_idx 成员...表示 上一次分配 内存结束位置 后面的 物理页位置 索引 , 下次分配优先分配该索引 物理页 ; 在下一次分配内存时 , 如果 上次内存分配物理页 剩余空间 小于等于 要分配内存 , 那么

    3.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进程内存管理(二)

    简单记录一下内存管理器基本原理。这里就不深入代码内部了。 内存管理器初始化 进程启动后,在 jemalloc 载入时候会调用 jemalloc_constructor 执行一些初始化操作。...分配 huge object 时候,直接采用 mmap 从 system memory 中申请,并独立维护。 ? jemalloc 层级结构 回收内存 内存回收逻辑和内存分配逻辑刚好相反。...相关系统调用 接下来,介绍一下内存分配器相关系统调用: brk/sbrk mmap 在介绍这几个系统调用之前,需要先对进程内存布局有所认识。 ?...64位进程内存布局 上图是一个 Linux 64位进程地址空间布局简图,jemalloc 能管理就是 Heap 和 Memory map 两块内存。 Text,存储程序二进制代码。...参考文档 jemalloc Linux manpage jemalloc源码解析-内存管理

    2.9K40

    Netty内存分配

    虽然有众多内存分配器,但是它们核心都是一致: 高效大内存分配和回收,提升单线程或者多线程场景下性能; 减少内存碎片,包括内部碎片和外部碎片,提升内存有效利用率。...这边有个内存碎片概念,可以介绍下,Linux 中物理内存会被分成若干个 4k 大小内存页 Page,物理内存分配和回收都是基于 Page 完成,内部碎片就是 Page 内部产生碎片,外部碎片就是各个...,但是,我们程序在不断运行,这些 Page 会被频繁回收,然后重新分配,难免这些 Page 之间会出现空闲内存块,这就形成了外部碎片 对于内存分配肯定有内存分配一些算法,本篇文章主要分析...SubPage:负责 Page 内内存分配,假如我们分配内存大小远小于 Page(8K),直接分配一个 Page 会造成严重内存浪费,所以需要将 Page 划分为多个相同子块来进行分配,这里子块就相当于...执行内存分配,提高内存分配使用效率。

    50120

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

    Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻描述....内核如何记住哪些内存块是空闲 分配空闲页面的方法 影响分配器行为众多标识位 内存碎片问题和分配器如何处理碎片 2 内存分配API 2.1 内存分配器API 就伙伴系统接口而言, NUMA或UMA...(mask, order) 分配2^0 rder 页并返回一个struct page实例,表示分配内存起始页 NUMA-include/linux/gfp.h, line 466 UMA-include...函数进行了内存分配 __alloc_pages_node函数定义在include/linux/gfp.h?..., 用于检查给定内存域是否属于该进程允许运行CPU). zone_watermark_ok接下来检查所遍历到内存域是否有足够空闲页,并试图分配一个连续内存块。

    3.1K11

    java内存分配

    从Java这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程操作系统中是线程)为这个线程建立存储区域,该区域具有先进后出特性。   ...应用程序在运行中所创建所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配内存是自动初始化。...Java中所有对象存储空间都是在堆中分配,但是这个对象引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配内存实际建立这个对象,而在堆栈中分配内存只是一个指向这个堆对象指针...堆是由垃圾回收来负责,堆优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存,Java垃圾收集器会自动收走这些不再使用数据。...但缺点是,由于要在运行时动态分配内存,存取速度较慢。   栈优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中数据大小与生存期必须是确定,缺乏灵活性。

    2.1K50
    领券