linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。
1、内存是什么?
1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成
2)内存的特点是存取速率快
[attach]52084[/attach]
2、内存的作用
1)暂时存放 cpu 的运算数据
2)硬盘等外部存储器交换的数据
3)保障 cpu 计算的稳定性和高性能
[attach]52085[/attach]
1、linux 内存地址空间 Linux 内存管理全貌
[attach]52086[/attach]
2、内存地址——用户态&内核态
a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。这个时候 q 和 p 指向的地址是一样的
b) 如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p 指向的内容 copy 到 q,返回 q。并将 p 所指向的内存空间删除
3、内核态内存分配函数
函数分配原理最大内存其他_get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存kmem_cache_alloc基于 slab 机制实现128KB适合需要频繁申请释放相同大小内存块时使用kmalloc基于 kmem_cache_alloc 实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动alloc_bootmem在启动 kernel 时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高
4、malloc 申请内存
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches