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

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.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

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

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

5.1K30

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 阶页块链表

7K50

linux进程内存布局

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

3K41

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

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

8.2K20

Linux 内存分配流程及 kmalloc 解析

手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见内存分配方式。...先说两个概念: 外部碎片:有一段小内存,夹在两个大内存中间,两个大内存已经被分配进程,这一段小内存由于过小,不够申请者使用,就一直空闲。...内部碎片:一个进程申请了一段内存,可是这个进程从来没有全部使用,一直有最后一段内存没有使用。 为了解决这两个问题,就出现了伙伴系统和 slab 分配器。...GFP_ATOMIC 代表使用 kmalloc 分配内存时,如果内存准备不足,会立刻返回,不会引起睡眠,适合在中断上下文或者进程上下文中使用。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前临时使用

2.5K10

Linux进程通信——共享内存

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

5.6K30

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.8K40

Linux内存管理 - slab分配

Linux内存管理是一个非常复杂子系统,要完全说清的话估计要一本书篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统分配算法,这个算法主要解决分配连续个内存问题。...伙伴分配算法主要以内存页(4KB)作为分配单位,就是说伙伴分配算法每次可以分配 2order 个内存页(order为0、1、2...9)。...但有时候我们只需要申请一个很小内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...因为本身kmem_cache_t结构体也是小内存对象,所以也应该有slab分配器来分配,但这样就出现“鸡蛋和鸡谁先出现”问题。

2.3K51

Linux用户态进程内存管理

下面闲话少说,开始本篇内容——进程内存消耗和泄漏 进程虚拟地址空间VMA(Virtual Memory Area) 在linux操作系统中,每个进程都通过一个task_struct结构体描叙,每个进程地址空间都通过一个...当分配区域写入数据是,引发页中断,建立物理页和逻辑地址映射。下图表示了这个过程。 ? 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。...) malloc大于128k内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0) 内存消耗VSS RSS PSS USS 首先,我们评估一个进程内存消耗都是指用户空间内存...这里我们用工具 procrank先来看下Linux进程内存占用量 。 ?...Set Size 实际使用物理内存(比例分配共享库占用内存) USS -Unique Set Size 进程独自占用物理内存(不包含共享库占用内存) 下面再用一张图来更好解释VSS,RSS,

2.8K30

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用户态进程内存管理

下面闲话少说,开始本篇内容——进程内存消耗和泄漏 进程虚拟地址空间VMA(Virtual Memory Area) 在linux操作系统中,每个进程都通过一个task_struct结构体描叙,每个进程地址空间都通过一个...当分配区域写入数据是,引发页中断,建立物理页和逻辑地址映射。下图表示了这个过程。 ? 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。...) malloc大于128k内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0) 内存消耗VSS RSS PSS USS 首先,我们评估一个进程内存消耗都是指用户空间内存...这里我们用工具 procrank先来看下Linux进程内存占用量 。 ?...Set Size 实际使用物理内存(比例分配共享库占用内存) USS -Unique Set Size 进程独自占用物理内存(不包含共享库占用内存) 下面再用一张图来更好解释VSS,RSS,

2.7K41

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.3K21

linux进程进程间通信_linux共享内存进程间通信

内存共享最新整理: Linux进程间通信-共享内存 – 码到城攻共享内存可以说是最有用进程间通信方式,也是最快IPC形式 https://www.codecomeon.com/posts...两个不同进程A、B共享内存意思是,同一块物理内存被映射到进程A、B各自进程地址空间。 进程A可以即时看到进程B对共享内存中数据更新,反之亦然。...二、相关函数: 与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存接口还与信号量非常相似,而且比使用信号量接口来得简单。...共享内存权限标志与文件读写权限一样,举例来说,0644,它表示允许一个进程创建共享内存内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建进程只能读取共 享内存。...,已经很好了,我也就不在班门弄斧了: Linux共享内存编程实例_分享美好专栏-CSDN博客_linux共享内存实例 赐教!

4.5K30
领券