arthur-zhang / morning-up-up

78 stars 6 forks source link

1102分享:malloc、free 与 OOM 初步 #5

Open arthur-zhang opened 4 years ago

IKNOWLJT commented 4 years ago

malloc和free

libc:

malloc,free(应用程序,用户空间) ----> glibc(解耦,更好的内存管理,内存二道贩子,操作系统提供内存的标准API, 用户空间) -----> 系统调用(bre, mmap, munmap)------> 内核(内核空间)

内存按需分配:

malloc 并不会真正分配内存。

malloc 真实申请的空间都是 虚拟内存指向了一块 页表,再指向物理内存的(zero page, 只读不可写,写的时候发生page-fault)....

#include<stdlib.h>
#include<stdio.h>

int main(){
    int  *data = (int*)malloc(1024 * 1024 *1024);
    printf("%p\n",&data);

    int i = 0;
    for(i = 0;i < 1024 * 1024 * 1024; i++){
      data[i] = 1
    }
    getchar();
    return 0;

}

calloc,会将分配的内存空间全部初始化一次,这个时候就会真实占用内存了

#include<stdlib.h>
#include<stdio.h>

int main(){
    int  *data = (int*)calloc(1, 1024 * 1024 *1024);
    printf("%p\n",&data);
    getchar();
    return 0;

}

OOM

Overcommit: 进程可以申请的内存上限

vm_overcommit_memory: 参数

sysctl -a | grep vm.overcommit_memory 或者 cat /proc/sys/vm/overcommit_memory

修改 overcommit_memory 参数 sudo sysctl vm.overcommit_memory=0

Buddy 算法 管理物理内存

Taaang commented 4 years ago

image

LinForTracy commented 4 years ago

计算机底层原理

whx405831799 commented 4 years ago

image

Wolf-ZR commented 4 years ago

image

wolfleave commented 4 years ago

内存分配

应用程序—malloc, free—>libc(用户空间)—brk,mmap—>内核(内核空间)

glibc(批发商) 作用

1.解耦(对外提供统一接口)

2.更好的内存使用

3.由操作系统提供(封装),方便应用程序使用

申请1B,实际是132k(128k+4k)

按需分配

top res(值比实际使用的内存大,原因可能是glibc没有真正释放内存到操作系统内核) virt 申请到虚拟内存

malloc VS calloc

image

reference: https://www.guru99.com/difference-between-malloc-and-calloc.html

Linux进程OOM

buddy 算法(物理内存管理)

wefun94 commented 4 years ago

(1)程序使用内存是分两步的,先申请虚拟内存,等到需要使用的时候,在申请物理内存。 内存是按需分配的。 malloc 申请虚拟内存,虚拟内存指向zero page,等到使用的时候,会发送缺页中断,再进行物理内存分配 calloc 申请虚拟内存,并进行初始化 free 释放内存

(2)top命令 VIRT 虚拟内存占用大小 RES 实际物理内存大小

(3)理解glibc库 glibc库是程序和操作系统的桥梁,协助程序进行内存分配等操作 内存管理库还有 mimalloc jemalloc tcmalloc

(4) vm_overconmit_memory 这个值是内存分配策略的配置 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存