linux下内存学习札记


近日,一直在使用并学习着linux,下面是我通过阅读别人的文章,整理出来的笔记,供跟我一个级别的菜鸟参考学习吧,同时自己也可以复习。

  1.内存的两个概念:虚拟内存和物理内存,在linux下都来自内核的支持。

  Linux在内存管理上份为两级,一级是线性区,类似于00c73000-00c88000,对应于虚拟内存,它实际上不占用实际物理内存;一级是具体的物理页面,它对应我们机器上的物理内存。

  另外,还有一个概念--内存的延迟分配.Linux内核在用户申请内存的时候,只是给它分配了一个线性区(也就是虚存),并没有分配实际物理内存;只有当用户使用这块内存的时候,内核才会分配具体的物理页面给用户,这时候才占用宝贵的物理内存。内核释放物理页面是通过释放线性区,找到其所对应的物理页面,将其全部释放的过程。

  举例说明:

  char *p=malloc(2048) //这里只是分配了虚拟内存2048,并不占用实际内存。

  strcpy(p,”123”) //分配了物理页面,虽然只是使用了3个字节,但内存还是为它分配了2048字节的物理内存。

  free(p) //通过虚拟地址,找到其所对应的物理页面,释放物理页面,释放线性区。

  我们知道用户的进程和内核是运行在不同的级别,进程与内核之间的通讯是通过系统调用来完成的。进程在申请和释放内存,主要通过brk,sbrk,mmap,unmmap这几个系统调用,传递的参数主要是对应的虚拟内存。  

  注意一点,在进程只能访问虚拟内存,它实际上是看不到内核物理内存的使用,这对于进程是完全透明的。

  2.glibc内存管理器

  那么我们每次调用malloc来分配一块内存,都进行相应的系统调用呢?

  答案是否定的,这里我要引入一个新的概念,glibc的内存管理器。

  我们知道malloc和free等函数都是包含在glibc库里面的库函数,我们试想一下,每做一次内存操作,都要调用系统调用的话,那么程序将多么的低效。

  实际上glibc采用了一种批发和零售的方式来管理内存。glibc每次通过系统调用的方式申请一大块内存(虚拟内存),当进程申请内存时,glibc就从自己获得的内存中取出一块给进程。

相关内容