内存管理存在的问题及解决方案
内核物理内存管理方式 有4种
根据配置选一种
内核虚拟内存管理方式 有5种
4种用于异常/内核线程/用户进程内核态,1种用于进程用户态内存
以上的管理方式,不是**的,会造成很多问题:
问题 : 内存碎片/内存不足/无法申请到连续的物理页/4KB页表导致的内存开销增加与tlb的命中率的降低
方案 : 内存规整/内存释放/CMA/大内存页(hugepages)
注意 : 大内存页 和 传统的 4KB 内存页 是 并存的 。 一部分内存用大内存页管理,另一部分内存还是用4KB内存页管理
内存碎片
内部碎片化和外部碎片化
三种方式可以碎片化整理
1.内存分配时(slowpath)直接进行碎片整理
2.kcompactd后台进程进行碎片整理
3.用户手动触发
echo 1 > /sys/devices/system/node/node0/compact
echo 1 > /proc/sys/vm/compact_memory
4KB页表导致的内存开销增加与tlb的命中率的降低
大内存页(一般是大于1G?) 需要 硬件的支持 :
也就是说 soc 要支持 1GB或大于1GB 的 内存页
应该是 armv8 开始支持的,因为armv7 *多支持4GB
armv8(实现有48bit)可以支持256TB 内存
armv7(32bit) 可以支持 4GB 内存, 因为地址总线的限制,访问不到 第 (4G + 1)B
虽然linux 可以在使用内存的时候才映射,可以将 4G以上的物理空间映射到4G以内的虚拟地址,但是物理上不能访问 4G 以上的物理空间
hugepages
对用户空间不透明
THP (Transparent Huge Pages)
对用户空间透明
页表级数
硬件上有个级数
系统上有个级数
为什么需要多级
多级的时候时候linux的处理过程
一级的时候,要不要填充完毕?
只需要填充完毕**级即可,即需要填充完毕
多级的时候,要不要填充完毕?
只需要填充完毕**级即可,即不需要填充第二级别以及后面的级别
内存释放
释放到硬盘(swap)
清空
百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台