首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

malloc分配内存不需要经过虚拟内存吗?解决方案

2012-06-11 
malloc分配内存不需要经过虚拟内存吗?为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随

malloc分配内存不需要经过虚拟内存吗?
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)






[解决办法]
你分配的不是真的物理内存

[解决办法]
malloc是调用VirtualAlloc的。你可以直接调用VirtualAlloc,仅仅保留虚拟地址空间而不提交,这样的话,不会分配物理内存,仅仅保留一段虚拟地址空间不被映射而已。等到需要的时候再提交物理内存。
[解决办法]
看了http://www-128.ibm.com/developerworks/cn/linux/l-memory/
你就知道了。
[解决办法]

探讨
malloc和虚拟内存没有什么关系嘛。
TC 2.0 的时代哪里来的虚拟内存,malloc照样用的好好的。

[解决办法]
加为好友
发送私信
在线聊天

* jinwei1984
*
* 等级:


发表于:2008-04-10 16:43:2836楼 得分:0
你要明白OS 虚拟内存机制,分页,分段

你的任何一个程序在运行时,创建一个进程
包括(进程表, 进程的地址空间 UNIX系统)

这个进程的地址空间包括三部分:
1代码段(程序代码和常数) 
2数据段(就是一些全局,静态变量等等) 
3堆栈段(就是用来给你运行时预留的空间,可以从这里动态分配,包括在栈中分配,
在堆中分配两种动态分配,只是各自增长方式不一样)

对于目前的大多数机器,都是采用段页式内存管理,进程的每个段都放在内存的不同的段中,
然后对进程的段分页,实现虚拟内存机制,这中间地址的变化过程:
段的二维地址-->一维的线性地址--->通过MMU页面映射到物理地址

malloc是在进程的地址空间中分配的,申请的动态内存,即上面的 3堆栈段的堆中
--------------------
这位老兄说法有问题,malloc在哪分取绝于OS实现,实际上LINUX内核堆栈段和数据段根本不分的,参见linux源码include/asm-i386/processor.h
#define start_thread(regs, new_eip, new_esp) do { \
__asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0)); \
set_fs(USER_DS); \
regs->xds = __USER_DS; \
regs->xes = __USER_DS; \
regs->xss = __USER_DS; \
regs->xcs = __USER_CS; \
regs->eip = new_eip; \
regs->esp = new_esp; \
} while (0)

ss被始始化成_USER_DS段描述符,同ds, es

malloc只管在当前进程堆上分配内存,是C library,当前进程堆内存不够时会用系统调用向OS申请,至于申请的是什么内存,OS决定

热点排行
Bad Request.