一、内存管理学什么
Linux内存管理的三个大点:
- 虚拟内存(体现对内存的需求)
- 内存映射(虚拟内存映射物理内存)
- 物理内存(页面的供应)
二、知识点
- 进程PCB:task_struct
- 虚拟内存结构:task_struct -> mm_struct -> vm_area_struct
- 页表映射:mm_struct -> pgd、分段、分页、多级页表、pte(page table entry)
- 物理内存结构:mem_map、pglist_data、zone、free_area_struct、page
- 物理内存管理:buddy、slab、kswap、watermark、LRU、active & inactive page
- /proc/sys/vm/min_free_kbytes:调整回收内存的阈值,可以通过/proc/zoneinfo查看high、low、min的阈值,min_free_kbytes主要是用来设置min阈值,通过min阈值来设置low和hight
- /proc/sys/vm/swappniess:调整内存回收时回收匿名页的积极程度,或者说调整内存回收时回收匿名页和file-backed page的倾向
- 页内型:anno page和file-backed page
- 交换区:swap_info_struct、swap cache、swap_entry
- 内核栈:void * stack&thread_info、32bit和64bit系统上的差异
- 缺页异常:do_page_fault(do_falut, do_anonymous_page, do_swap_page)+pte+swap_entry
- OOM:oom-killer和几个选项(panic_on_oom、oom_kill_allocating_task、/proc/pid/oom_score_adj)
三、概览
3.1 一般流程
要贯穿Linux整个内存管理的逻辑,起点是进程PCB,即task_struct(创建进程的时候,load_elf_binary会根据可执行文件的ELF格式把程序加载到内存并做好VMA的映射,此时每个进程的内核栈在32bit系统上会默认会分配8KB内存,在64bit系统上会分配16kb内存,内核栈kernel stacks详情见下文3.2),其中的mm_struct&#x