操作系统中 brk 和 mmap 的区别

发布于 2020-06-23  3616 次阅读


内存分配的概念

  1. 每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 
  2. 虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 
  3. 如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 

区别

从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。

  1. brk是将数据段(.data)的最高地址指针_edata往高地址推;
    这是 brk 的内存分配方式,可以看到A、B新申请的内存都从堆的底部(堆的地址生长是从低到高的)开始向上生长。
    如果此时 free(A),A的内存并不会被释放,而是会被回收,等待下一次的利用,或者说是等待B的回收。
    file

  2. mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
    而mmap就不一样了,mmap直接从堆和栈之间的区域取出了一块区域,当回收这块内存时,操作系统也会直接将这块内存释放。
    但是系统调用和缺页中断比较消耗系统资源,为了CPU的执行效率,malloc只在申请的内存大于128K时才会调用mmap进行分配内存。
    file

如果将 brk 比喻为批发的话,那么 mmap 就是零售。

这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。

参考资料

https://blog.csdn.net/shuzishij/article/details/86574927

https://blog.csdn.net/gfgdsg/article/details/42709943


CTFer|NOIPer|CSGO|摸鱼|菜鸡