摘要: 前言 在伙伴系统中长时间的内存分配之后很容易造成内存碎片,即物理内存总量不少但是无法合并为大的连续内存块。而在现代CPU中提供了huge page的可能,可以分配超大块的page,在TLB中使用更少级的地址转换操作。一个page覆盖了更大的地址范围,大幅度的提高了TLB的命中概率。对于内存密集型应用 阅读全文
posted @ 2023-10-08 10:58 ZouTaooo 阅读(138) 评论(0) 推荐(0)
摘要: 前言 在从伙伴系统进行内存分配时有一个__GFP_COMP分配flag,该flag表示从伙伴系统分配的连续页帧为一个复合页。复合页就是将多个页帧进行组合,视作一个更大size的页。 复合页可以用于hugetlb,减少tlb中地址转化的次数,减少tlb miss几率,同时提高tlb的地址转化速度。sl 阅读全文
posted @ 2023-10-08 10:28 ZouTaooo 阅读(198) 评论(0) 推荐(0)
摘要: 前言 在进行内存访问时的大概流程如下: 由CPU发出访存指令 地址转化,MMU根据页表转换或者通过TLB得到物理地址 访问cache 如果cache miss,访问物理内存读入cache 因此,访问一个内容在cache中的物理内存能大幅度提高访问速度,基于这个原理,在Linux中将内容仍在cache 阅读全文
posted @ 2023-10-07 19:22 ZouTaooo 阅读(442) 评论(0) 推荐(0)
摘要: 前言 伙伴系统的内存释放API分析,基于Linux 2.6.25。 对外封装的内存释放API分为两类,free_page和free_pages以虚拟地址为参数,__free_page和__free_pages以page指针为参数,可以使用virt_to_page实现虚拟地址到page指针的转化,最终 阅读全文
posted @ 2023-10-07 18:08 ZouTaooo 阅读(160) 评论(0) 推荐(0)
摘要: 前言 伙伴系统实现了对页帧的管理,并对外提供分配和释放的接口。所有的上层内存分配,比如vmalloc、slab分配器等都是通过伙伴系统暴露的接口申请一个或者多个连续页帧。 伙伴系统常用封装API Linux内存管理的最上层包含多个Node,Node管理多个zone(DMA、NORMAL、HIGHME 阅读全文
posted @ 2023-10-07 18:08 ZouTaooo 阅读(75) 评论(0) 推荐(0)
摘要: 前言 伙伴系统是Linux内存管理的精华部分,所有的物理内存管理使用的都是该机制。伙伴系统保障了内存分配的速度和效率,同时思想和实现又相当简单。这里对伙伴系统的结构进行简要的介绍。 伙伴系统结构 在zone中有一个成员free_area是伙伴系统的实现的关键部分,free_area是一个struct 阅读全文
posted @ 2023-10-07 18:07 ZouTaooo 阅读(134) 评论(0) 推荐(0)
摘要: 前言 伙伴系统的内存分配API解析,基于Linux 2.6.25。 GFP_MASK GFP是get free page的缩写,GFP_MASK是一系列内存分配的掩码,指导伙伴系统寻找合适的内存块进行分配,同时在分配过程中按照掩码的指示进行内存相关的操作,比如内存回收、分配失败后的行为等。 以下四个 阅读全文
posted @ 2023-10-07 17:15 ZouTaooo 阅读(348) 评论(0) 推荐(0)
摘要: 前言 ZONE_MOVABLE是一个虚拟内存域,ZONE_MOVABLE内存区域的范围实际上会覆盖高端内存或者NORMAL内存。 ZONE_MOVABLE有两个作用,其一是解决内存碎片问题,将内存域分为可移动和不可移动的(对于可移动和不可移动概念不清楚的可以先了解一下迁移类型以及已分配内存的类型划分 阅读全文
posted @ 2023-10-07 14:43 ZouTaooo 阅读(301) 评论(0) 推荐(0)
摘要: 前言 核心转储文件,可以在程序dump时将当时的程序状态记录下,配合gdb工具进行分析。适合在长期运行的程序挂掉时进行分析。 开启coredump 设置coredump文件的limit # 临时设置 ulimit -c unlimited # 永久设置 vim /etc/security/limit 阅读全文
posted @ 2023-10-07 13:46 ZouTaooo 阅读(128) 评论(0) 推荐(0)
摘要: 前言 GDB,the GNU Project Debugger,一种命令行调试工具。这里我将遇到的一些重要用法记录下来。 使用GDB前的准备 编译选项需要加上-g -O0,用于产生调试信息,并且禁止优化(可能编译结果与源代码信息不匹配)。 断点和观察点 断点,也就是break point,当程序运行 阅读全文
posted @ 2023-10-07 13:44 ZouTaooo 阅读(139) 评论(0) 推荐(0)