3. 内存管理

2020-03-29  本文已影响0人  西山薄凉

内存管理

image.png

内存空间布局和管理

image.png

物理内存管理

image.png

1.物理内存组织方式
1.1 平坦内存模型
- 页和物理地址都是连续的,依次对应,映射算法简单
- 较早的x86都是如此访问内存的,所有cpu统一走总线访问内存,并且距离相同,称为SM对称多处理器;缺点是总线称为了性能瓶颈
1.2 非连续内存模型
- 后期出现NUMA非一致内存访问,就是每个CPU都有自己本地内存,CPU和内存一起称为NUMA节点,访问时不需要经过总线,速度快,但是本地内存不足时需要较长的时间去其他的节点申请内存
- 节点数据结构
- node_id 节点id
- node_mem_map 页表
- node_start_pfn 节点起始页号
- node_spanned_pages 节点中包含不连续的物理内存地址的页面数
- node_present_pages 是真正可用的物理页面的数目
- zone 区域是指内存适用于哪种操作(针对物理内存
- ZONE_DMA 是指可用于作 DMA(Direct Memory Access,直接内存存取)的内存
- ZONE_NORMAL 是直接映射区,从物理内存到虚拟内存的内核区域,通过加上一个常量直接映射。
- ZONE_HIGHMEM 是高端内存区,就是上一节讲的,对于 32 位系统来说超过 896M 的地方,对于 64 位没必要有的一段区域
- ZONE_MOVABLE 是可移动区域,通过将物理内存划分为可移动分配区域和不可移动分配区域来避免内存碎片。
- 页(物理内存基本单位,一个物理页面根据使用模式的不同分为不同的页
- 映射虚拟地址空间(匿名页)或者关联一个文件然后与虚拟地址空间建立映射(内存映射文件
- 分配小块内存,需要用slub allocator分配器管理内存块的状态
1.3 稀疏型(适用于内存热插拔

2.页的分配方式
伙伴系统(buddy system)用于分配页级别的内存块。
把所有的空闲页分组为 11 个页块链表,每个块链表分别包含很多个大小的页块,有 1、2、4、8、16、32、64、128、256、512 和 1024 个连续页的页块。最大可以申请 1024 个连续页,对应 4MB 大小的连续内存。每个页块的第一个页的物理地址是该页块大小的整数倍。
当向内核请求分配 (2(i-1),2i]数目的页块时,按照 2^i 页块请求处理。如果对应的页块链表中没有空闲页块,那我们就在更大的页块链表中去找。当分配的页块中有多余的页时,伙伴系统会根据多余的页块大小插入到对应的空闲页块链表中。
例如,要请求一个 128 个页的页块时,先检查 128 个页的页块链表是否有空闲块。如果没有,则查 256 个页的页块链表;如果有空闲块的话,则将 256 个页的页块分成两份,一份使用,一份插入 128 个页的页块链表中。

image.png image.png

3.小内存分配方式

4.页面换出
- 触发换出:
- 1) 分配内存时发现没有空闲; 调用 get_page_from_freelist->node_reclaim->__node_reclaim->shrink_node
- 2) 内存管理主动换出, 由内核线程 kswapd 实现
- kswapd 在内存不紧张时休眠, 在内存紧张时检测内存 调用 balance_pgdat->kswapd_shrink_node->shrink_node
- 页面都挂在 lru 链表中, 页面有两种类型: 匿名页; 文件内存映射页
- 每一类有两个列表: active 和 inactive 列表
- 要换出时, 从 inactive 列表中找到最不活跃的页换出
- 更新列表, shrink_list 先缩减 active 列表, 再缩减不活跃列表
- 缩减不活跃列表时对页面进行回收:
- 匿名页回收: 分配 swap, 将内存也写入文件系统
- 文件内存映射页: 将内存中的文件修改写入文件中

用户态内存映射MMAP

image.png

brk vs mmap

小内存块是分配在堆顶,会将堆顶指针往上推,并且小内存块在高位小内存块释放前,实际不会释放,需要等高位释放后在一起释放,此时系统会将相邻的堆最高位的内存块合并,在合并后的内存块大小超过限定值,则执行内存紧缩,将堆最高位指针回退。
大内存则是分配在空闲空间,而不是紧邻堆顶。
https://www.cnblogs.com/diegodu/p/9230280.html

内核态内存映射

image.png
上一篇 下一篇

猜你喜欢

热点阅读