码迷,mamicode.com
首页 > 移动开发 > 详细

虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File

时间:2017-04-24 21:06:58      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:file   技术分享   virtual   操作系统   window   nts   内存映射文件   img   内存映射   

内存管理有三种方式:

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.

虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File

标签:file   技术分享   virtual   操作系统   window   nts   内存映射文件   img   内存映射   

原文地址:http://www.cnblogs.com/gavanwanggw/p/6758875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!