zoukankan      html  css  js  c++  java
  • 虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File

    http://blog.csdn.net/zj510/article/details/39400087

    内存管理有三种方式:

    1. 虚拟内存,VirtualAlloc之类的函数

    2. 堆,Heapxxx函数,malloc,new等

    3. 内存映射文件,Memory Mapped File

    很多人都会困惑,但是看下面的图片就会比较明白了。这个图片从MSDN上拷来。

    堆和虚拟内存,从上面的图片就可以看出,其实所谓的堆,也就是在虚拟内存上抽象出来的。如果直接用Virtualxxx系列函数,是有一些限制的,比如每次只能分配页大小倍数的内存,内存地址也必须对齐什么的。新手很难用。正因为如此,才出现了堆。实际上堆Heap内部就是使用Virtual系列函数的。基本思想就是:先用VirtualAlloc分配一个比较大的内存,然后用户每次申请堆内存的时候,从分配出来的虚拟内存块上指定一块给用户。比如第一次分配堆内存从A地址开始的100个字节,第二次分配的时候就是A+100开始。

    Memory Mapped File就不太一样了,从上面的图可以看出MMF并没有调用Virtual系列函数。它直接调用内核层了。

    对于malloc和new,这2个并不是操作系统API,它们是语言提供的函数。在不同的系统上面有不同的实现方法,在Windows上面,new调用malloc,malloc调用堆函数(heapxxx),堆函数调用Virtual系列函数。在Linux上面就调用相应的linux API.

  • 相关阅读:
    Oracle序列更新
    ssh服务器终端乱码
    iTerm2常用的快捷键
    原来 Set 集合也可以排序
    Java 单例
    java后台技术
    网易考拉规则引擎平台架构设计与实践
    HBase最佳实践(好文推荐)
    如何通俗的解释云
    写的不错的一篇云数据库的文章
  • 原文地址:https://www.cnblogs.com/feng9exe/p/6377529.html
Copyright © 2011-2022 走看看