malloc分配内存不需要经过虚拟内存吗?为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随
malloc分配内存不需要经过虚拟内存吗?
为什么一下子就得到了所要的物理内存?不符合虚拟内存的特性?(随用随分配物理内存)
[解决办法]
你分配的不是真的物理内存
[解决办法]
malloc是调用VirtualAlloc的。你可以直接调用VirtualAlloc,仅仅保留虚拟地址空间而不提交,这样的话,不会分配物理内存,仅仅保留一段虚拟地址空间不被映射而已。等到需要的时候再提交物理内存。
[解决办法]
看了http://www-128.ibm.com/developerworks/cn/linux/l-memory/
你就知道了。
[解决办法]
[解决办法] 加为好友
发送私信
在线聊天
* 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决定