摘要: 前言 熟悉伙伴系统的管理机制以及伙伴系统提供的内存分配API方式以后我们知道,伙伴系统提供了以分配阶为参数的连续page的分配接口。但是在内核中并不是在所有时候都要求分配的内存在物理上连续,只需要在逻辑上连续即可。比如,随着系统的使用,分配连续的大的内存块由于内存碎片的存在是有可能失败的。因此分配逻 阅读全文
posted @ 2023-10-08 16:59 ZouTaooo 阅读(306) 评论(0) 推荐(0)
摘要: 前言 看完了伙伴系统的设计、slab分配器的设计、vmalloc、kmalloc这些内容对于内存管理的一些细节上好像比较清楚了,但是内核是如何使用内存的还是有一些混淆。也产生了一些疑问,在内核中内存的正确打开方式是什么呢? 内核地址空间划分 首先我们需要搞情况内核的地址空间,不同地址空间的内存的使用 阅读全文
posted @ 2023-10-08 16:20 ZouTaooo 阅读(189) 评论(0) 推荐(0)
摘要: 前言 内核地址空间的划分 VMALLOC_START和VMALLOC_END之间的区域用于vmalloc分配逻辑上连续物理上不连续的内存。 内核地址空间中还有一段区间用于高端内存的持久映射,PKMAP_BASE和FIXADDR_START,如果存在高端内存可以通过alloc_pages_node分配 阅读全文
posted @ 2023-10-08 16:14 ZouTaooo 阅读(165) 评论(0) 推荐(0)
摘要: 前言 slab分配器从伙伴系统获取页帧进行管理,对外为一些固定size的小内存块和特定内核数据结构提供缓存和内存分配服务。slab分配器为的是满足内核中小内存块的分配需求,毕竟伙伴系统的内存分配以page为单位实在太大了。 使用slab带来以下几个好处: 减少了伙伴系统的访问次数,小内存的分配在sl 阅读全文
posted @ 2023-10-08 15:17 ZouTaooo 阅读(350) 评论(0) 推荐(0)
摘要: 前言 页帧page是物理内存管理的基本单位,struct page记录了任意时刻page的所有状态,因此每一个物理页帧都需一个对应的struct page结构体记录状态,对于内存多计算机系统来说需要的struct page本身就需要大量内存进行存储,因此该结构体中每增加一个变量带来的代价会很大,需要 阅读全文
posted @ 2023-10-08 11:44 ZouTaooo 阅读(154) 评论(0) 推荐(0)
摘要: 前言 在谈Linux内存管理框架之前需要了解NUMA,NUMA是非一致性内存访问(Uon-Uniform Memory Access)的缩写,与之相反的是一致性内存访问UMA。在多核的UMA架构的机器上,CPU视角下所有的内存都是均匀的,不同CPU访问同一块内存的延迟是相同;而在NUMA架构的机器上 阅读全文
posted @ 2023-10-08 11:27 ZouTaooo 阅读(174) 评论(0) 推荐(0)
摘要: 前言 在伙伴系统中长时间的内存分配之后很容易造成内存碎片,即物理内存总量不少但是无法合并为大的连续内存块。而在现代CPU中提供了huge page的可能,可以分配超大块的page,在TLB中使用更少级的地址转换操作。一个page覆盖了更大的地址范围,大幅度的提高了TLB的命中概率。对于内存密集型应用 阅读全文
posted @ 2023-10-08 10:58 ZouTaooo 阅读(148) 评论(0) 推荐(0)
摘要: 前言 在从伙伴系统进行内存分配时有一个__GFP_COMP分配flag,该flag表示从伙伴系统分配的连续页帧为一个复合页。复合页就是将多个页帧进行组合,视作一个更大size的页。 复合页可以用于hugetlb,减少tlb中地址转化的次数,减少tlb miss几率,同时提高tlb的地址转化速度。sl 阅读全文
posted @ 2023-10-08 10:28 ZouTaooo 阅读(207) 评论(0) 推荐(0)