Open arthur-zhang opened 4 years ago
应用程序—malloc, free—>libc(用户空间)—brk,mmap—>内核(内核空间)
1.解耦(对外提供统一接口)
2.更好的内存使用
3.由操作系统提供(封装),方便应用程序使用
申请1B,实际是132k(128k+4k)
top res(值比实际使用的内存大,原因可能是glibc没有真正释放内存到操作系统内核) virt 申请到虚拟内存
reference: https://www.guru99.com/difference-between-malloc-and-calloc.html
(1)程序使用内存是分两步的,先申请虚拟内存,等到需要使用的时候,在申请物理内存。 内存是按需分配的。 malloc 申请虚拟内存,虚拟内存指向zero page,等到使用的时候,会发送缺页中断,再进行物理内存分配 calloc 申请虚拟内存,并进行初始化 free 释放内存
(2)top命令 VIRT 虚拟内存占用大小 RES 实际物理内存大小
(3)理解glibc库 glibc库是程序和操作系统的桥梁,协助程序进行内存分配等操作 内存管理库还有 mimalloc jemalloc tcmalloc
(4) vm_overconmit_memory 这个值是内存分配策略的配置 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
malloc和free
libc:
malloc,free(应用程序,用户空间) ----> glibc(解耦,更好的内存管理,内存二道贩子,操作系统提供内存的标准API, 用户空间) -----> 系统调用(bre, mmap, munmap)------> 内核(内核空间)
内存按需分配:
OOM
Overcommit: 进程可以申请的内存上限
vm_overcommit_memory: 参数