分配时机
当系统创建一个进程会调用exec函数,为进程做内存映射,分配内存。
2 核心流程
2.1 load_elf_binary
load_elf_binary函数用来读取二进制文件创建内存映射,其内部存在如下步骤
-
调用 setup_new_exec,设置内存映射区 mmap_base;
-
调用 setup_arg_pages,设置栈的 vm_area_struct,这里面设置了 mm->arg_start 是指向栈底的,current->mm->start_stack 就是栈底;
-
elf_map 会将 ELF 文件中的代码部分映射到内存中来;
-
et_brk 设置了堆的 vm_area_struct,这里面设置了 current->mm->start_brk = current->mm->brk,也即堆里面还是空的;
-
load_elf_interp 将依赖的 so 映射到内存中的内存映射区域。
2.2 调用malloc申请内存
-
使用malloc 申请一小块内存调用brk函数在堆中分配
-
使用malloc 申请一大块内存调用mmap函数在映射区分配
3 内存不足时的处理
-
回收缓存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面;
-
回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中swap
-
杀死进程,内存紧张时系统还会通过 OOM(Out of Memory),直接杀掉占用大量内存的进程。
网友评论