1. 待分配 size 大于 allocChunkLimit
Postgres 17.4内核,对于函数 AllocSetAlloc() ,如果请求的大小超过了chunks的最大值,我们就将请求转交给 AllocSetAllocLarge() 处理。
1.1 函数实现
该函数专门处理较大的内存分配请求(通常大于ALLOC_CHUNK_LIMIT)。它直接使用系统malloc分配独立的内存块,而不是从现有的内存池中分配,这样可以避免内存碎片化问题。
AllocSetAllocLarge() 函数 主要负责完成如下功能:
-
参数和初始化
- 接收内存上下文context、请求大小size和标志flags
- 将上下文转换为AllocSet类型
- 定义块指针、内存块指针和大小变量
-
大小验证和调整
- 调用MemoryContextCheckSize验证请求大小是否合法
- 根据是否启用MEMORY_CONTEXT_CHECKING决定是否额外分配一个哨兵字节
- 使用MAXALIGN进行内存对齐
-
内存分配
- 计算总块大小:块头+块头+实际数据大小
- 使用malloc分配内存,