一、内存映射
linux内核为每个进程提供一个独立的虚拟内存,在使用时通过内存映射将虚拟内存地址映射到物理内存地址。内存映射主要是内核维护一个映射表,记录虚拟内存地址与物理内存地址的映射关系。
映射表存储在cpu内存管理单元(mmu)中,处理器可直接通过硬件找出要访问的内存,当进程访问的虚拟地址在映射表中找不到时,系统会产生缺页异常,然后对物理内存进行分配,更新映射表。
现阶段linux提供两种内存管理机制,多级页表与大页,mmu使用多级页表方式,每页4k大小。
二、内存分配
linux提供两种内存分配策略在首次访问时进行分配。
1.brk()分配:需要分配的内存小于128K时通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来达到复用目的。使用brk()分配可以减少缺页的情况,提高内存访问效率,但内存没有归还系统,在内存工作繁忙时,频繁分配或释放会造成内存碎片。
2.mmap()分配:大于128k时内使用内存映射,主要是在文件映射段找一块空闲内存分配出去。使用mmap()会在释放时将内存归还系统,但在内存工作繁忙时,频繁分配内存会导致大量缺页异常。
内存频繁分配但是不释放会导致内存泄露,所以,程序用完内存后需要调用 free() 或 unmap() ,来释放不用的内存。操作系统也会监控内存使用,发现内存不足时会使用lru算法、swap机制、杀死进程等方式释放内存。
三、内存使用情况查看
1.使用free查看系统内存使用情况
mem表示物理内存,swap表示分区交换情况
total:总内存
used:使用内存
free:未使用内存
shared:共享内存
buff/cache:缓存和缓冲区大小
available:新进程可用内存大小,包括未使用内存与可回收内存
2.使用top或top -hp pid查看各进程,线程使用内存情况,按m可切换到内存排序
VIRT:虚拟内存大小,申请过就会计算在内
RES:进程使用内存,不包括swap和共享内存
SHR:共享内存,与其他进程共享的内存
%MEM :使用的物理内存占系统总内存的百分比