windows内存管理问题,高手请进来,分不是问题
各位高人:
我x86pc机有128M内存,使用windows2000服务器
1、程序中能使用的空间和ram是什么关系?一个应用程序(进程)的堆栈能有多大?(默认)?
2、我可不可以使用 new 来开辟一块200M的空间?
如果可以,这块空间分配在那里?
如果不可以,为什么?
3、线程的有没有自己的堆?,在该线程中执行new 分配的空间在那里?
4、virtualalloc()分配一块虚内存(提交物理存储器)后这块内存在不在ram里?
5、所谓的页文件究竟是指什么?
问题点数:20、回复次数:13Top
1 楼rwdx(忆)回复于 2004-11-01 12:09:06 得分 0
1,进程使用空间是虚拟的,ram指物理内存吧, 进程默认堆栈好像是1MB
2,可以,分配的内存为虚拟内存,可能在物理内存里面也可能在分页文件里面
3,有,线程默认堆
4,不一定在,
5,内存交换文件,
Top
2 楼oyangfeng(小马)回复于 2004-11-01 12:53:32 得分 0
谢谢,c++里的new 分配一次内存是直接在进程的默认堆里分配还是新创建一个堆?
在线程里使用new 是使用进程的默认堆,自己的堆,还是新创建一个堆?
请您以及其他高人赐教!Top
3 楼oyangfeng(小马)回复于 2004-11-01 16:59:13 得分 0
我可以加分,只要能追求真理。
自己upTop
4 楼cryptonym(想裸睡)回复于 2004-11-01 17:19:59 得分 0
也可以用默认的堆,也可以自己HeapCreate()创建堆出来用。Top
5 楼madhappy(545454)回复于 2004-11-01 17:25:03 得分 0
1 和ram没有直接的关系。和地址线位数有关,因为是32位的所以程序使用的最大地址空间一般为4g。但是在win2000后的版本也可以设置增加。堆栈和进程空间是有区别的,一般新开的堆栈有1兆的样子。
2 如果空间够用就可以。分配在堆内存里面。
3 线程其实就是一个函数,像主函数一样,主函数时主线程的起始函数。new出来的东西和上面一样,在一起
4 不在。ram是一个操作区域。当cpu要执行你程序的某端代码时。系统把这段代码放到内存里面。所以virtualalloc()这个代码本身执行时是在ram里面的。他所操作的内存块不在。以后这个内存块要用的时候会被放入内存
5 为了让硬盘的虚拟内存和内存的存储区域交互,才会出现页式,段式管理。页文件指的还是存储区域。只是被分页以后的而已
问题都差不多集中在一块。看操作系统的内存管理知识。
Top
6 楼oyangfeng(小马)回复于 2004-11-01 18:34:27 得分 0
果然是高人,不过还没解释c++的new呢?分配内存是直接在进程的默认堆里分配还是新创建一个堆?,进程默认的堆空间不够用时该怎么办呢?
进程(或线程)的栈什么情况下会溢出呢?Top
7 楼oyangfeng(小马)回复于 2004-11-03 10:33:53 得分 0
自己upTop
8 楼savage54321(野人)回复于 2004-11-03 11:19:53 得分 0
c++中的new是在进程默认的堆中分配内存。一个线程中的堆默认是1M也可以在vc中修改。如果你个喜欢自己管理堆可以重载new操作符,这样可以自己创建和管理堆栈!
置于的栈什么情况下会溢出,呵呵,很简单一个无穷的递归调用就可以让栈溢出!Top
9 楼keios(C->C++->java->C 循环中)回复于 2004-11-03 16:06:23 得分 0
rwdx(任我独行之风云再起)说的有一个错误:
线程不拥有自己的默认堆,它们共享进程的堆。
默认堆是指GetProcessHeap得到的堆,进程中所有线程共享。
如果没记错的话, new 是在默认堆上分配的内存。可以跟踪代码看一下就知道了。Top
10 楼loucai(羽)回复于 2004-11-04 10:02:32 得分 0
upTop
11 楼oyangfeng(小马)回复于 2004-11-04 12:33:36 得分 0
谢谢,不过keios,我想问的是,在vc6.0下,写这样的语句char *p=new char[200*1024*1024];是可以执行的阿?请问这个new是用默认堆栈吗?默认堆栈可是只有1m?Top
12 楼keios(C->C++->java->C 循环中)回复于 2004-11-04 17:50:30 得分 20
可能有些名词有所误解。
一般要说堆栈,指的是栈(stack)。单说堆,指的是heap 。
stack是每个线程拥有一个,至于大小是不是1M,在编译和创建线程时可以指定。
new 操作符,malloc, HeapAlloc ,分配的内存都在堆(heap)上,
heap 的地址空间大小只受你机器寄存器位数的限制,32位机器上就是4G(当然windows会保留部分)。
而当物理内存不够用时,windows会使用磁盘作为虚拟内存,stack和heap都可能被放入虚拟内存。
因此 new char[200*1024*1024] 是可以执行的。
如果你想详细知道windows是如何处理物理内存和虚拟内存之间关系的,
最好看看80386保护模式的内存机制,
明白CPU是如何提供这样的机制,你就明白windows是怎么实现的了。Top
13 楼oyangfeng(小马)回复于 2004-11-05 09:36:18 得分 0
: keios(C->C++->java->C 循环中)我佩服!
有msn吗?收我做徒弟吧!Top




