各位高人:我x86pc机有128M内存,使用windows2000服务器1、程序中能使用的空间和ram是什么关系?一个应用程序(进程)的堆栈能有多大?(默认)?2、我可不可以使用 new 来开辟一块200M的空间?
如果可以,这块空间分配在那里?
如果不可以,为什么?3、线程的有没有自己的堆?,在该线程中执行new 分配的空间在那里?4、virtualalloc()分配一块虚内存(提交物理存储器)后这块内存在不在ram里?5、所谓的页文件究竟是指什么?

解决方案 »

  1.   

    谢谢,c++里的new操作是分配进程的堆内存,还是新开辟一块新的虚拟内存?按您的说法是新开一块了。
    请赐教,分不多,我可以加。
    进程的默认堆用来干什么?
      

  2.   

    1.有关系,程序使用的空间是虚拟空间,申请的虚拟空间最后是存在内存还是硬盘由虚拟内存管理器决定.堆栈的默认大小为1M
    2.你可以new 100M的空间出来,也就是说你可以NEW出大于你内存空间的尺寸,但大小比须小于总虚拟内存大小,否则申请失败.虚拟内存大小=物理内存+硬盘虚拟内存,100M空间所在位置,由VMM决定
    3.线程没有自己的堆,资源的分配是进程单位来决定的,进程内所有线程共享其资源.
    4.virtualalloc()分配的内存在哪里(内存?硬盘?),还是由VMM的调度算法决定.
    5.VMM是按页来分配和使用内存的,一个页的大小固定,VMM决定一个页存在内存中还是硬盘虚存中.
      

  3.   

    进程的默认堆用来支持new操作符及其它的一些函数.
      一个应用程序有4G的内存空间,一般有很多空间都没有使用到,使用virtualmalloc可以使用这里面没有被用的一片内存空间.
      

  4.   

    有几点不明白:
    1、进程的默认堆用来支持new操作符及其它的一些函数,但它的大小只有1M啊,不够用怎么办?
    2、既然可以new出很大的空间何必要用virtualmalloc呢?
      

  5.   

    1、程序中能使用的空间和ram是什么关系?一个应用程序(进程)的堆栈能有多大?(默认)?
       程序中能使用的空间好像为2G-128K,其中128K为低地址,是禁用的,堆栈默认好像是1M,但编译器里可以设置;
    2、我可不可以使用 new 来开辟一块200M的空间?
    如果可以,这块空间分配在那里?
    如果不可以,为什么?
    NEW的是物理内存,这样是不可以的.
      

  6.   

    自己up ,难道这个问题很难吗?C++ 的new 的内存是新开堆吗?
      

  7.   

    光回答你的问题没完没了。给你指个方向,看看书《windows95-system-programming-secrets.pdf》,到候捷网站上应该还可以下到。看之前到INTEL网站上下载CPU手册3卷先看。
    这些看完后,你就可以来回答别人提的这些问题了。
      

  8.   

    楼上的都说的很正确,我只做一点补充:
    1 程序中能使用的空间和ram没直接关系,一个应用程序(进程)的堆栈默认为1M。
      Win32应用程序编程接口中,每一个进程都有自己多达4GB的虚拟地址空间。内存中低位的2GB (从0x00到0x7FFFFFFF)可以为用户所用,高位的2GB (从0x80000000到0xFFFFFFFFF)为内核所保留。
    2 可以,在堆上可分配的对象所占用的内存的总量只受限于系统可有的所有虚拟内存空间。
    3 空间分配是以进程为单位的,线程没有自己的堆
    4 VirtualAlloc可以保留进程虚拟地址空间中的一段、保留地址空间并不为它们分配物理存储而只是防止其它分配操作使用这段空间,所以它不一定在ram里,当然你可以用VirtualLock将进程一个或多个占用页锁定在物理内存RAM中
    5 对于x86计算机来说,宿主页大小为4KB,可以使用函数GetSystemInfo来获得当前计算机的页大小。
      

  9.   

    谢谢诸位,对于:“1 程序中能使用的空间和ram没直接关系,一个应用程序(进程)的堆栈默认为1M。
      Win32应用程序编程接口中,每一个进程都有自己多达4GB的虚拟地址空间。内存中低位的2GB (从0x00到0x7FFFFFFF)可以为用户所用,高位的2GB (从0x80000000到0xFFFFFFFFF)为内核所保留。
    2 可以,在堆上可分配的对象所占用的内存的总量只受限于系统可有的所有虚拟内存空间。
    3 空间分配是以进程为单位的,线程没有自己的堆
    4 VirtualAlloc可以保留进程虚拟地址空间中的一段、保留地址空间并不为它们分配物理存储而只是防止其它分配操作使用这段空间,所以它不一定在ram里,当然你可以用VirtualLock将进程一个或多个占用页锁定在物理内存RAM中
    5 对于x86计算机来说,宿主页大小为4KB,可以使用函数GetSystemInfo来获得当前计算机的页大小。”
    这些,小弟已经在诸位的指导下明白了,
    现在,想问的是,常说的进程的默认堆栈到底是指什么?是堆还是栈,还是堆有?如果new用进程的默认堆栈的话,岂不是很小?
      

  10.   

    new用进程的默认heap,如果发现了不够,难道不会再多申请一块,扩大heap堆吗?
    要是程序一开始一次性把heap发配到2G,那还得了,所以才用多少再分配多少。不过你调用new的时候不会觉得它已经把默认的heap扩大了,因为对于你来说是透明的。
    多看看资料。
      

  11.   

    系统所提供的内存管理函数与C++提供的new重载有一定的关系,是对系统提供的内存管理函数的封装。
    与C函数一样,C++运行库喜欢自己管理内存。
    搂主的前四个问题大家都回答得比较充分了,补充一下第五点:页文件就是实际内存的映像,系统的内存换页调度算法会将一段时间不使用的内存按页为单位交换到页文件中去,这样能够腾出空间来加载需要立即执行的代码或数据段到内存中。如果你使用的是win2k,那么C:\PAGEFILE.SYS就是页文件;98下好像是win386吧,记不太清楚了。
    Windows提供的分页机制(虚拟内存)就是为了能够提供更“大”的内存空间,其实际的内容是在ram还是在硬盘(页文件)中,就不必考虑了:)
      

  12.   

    在windows下,我们在程序中的任何内存指针都不会直接指向物理内存的,这些指针指向的内存地址最终都要通过windows的虚拟内存管理,来重新定向。
    微软告诉我们,你只需想象你的程序是在一个拥有4GB物理内存的机器上运行就行了,其他你就不用管了。
      

  13.   

    诸位,我可是听人说:通常所说的进程的默认堆栈就是指stack,堆吗?ultralzl(自然)您说呢?
      

  14.   

    进程的默认堆栈很多地方出现,翻译的不准确,要根据上下文来决定是指stack和是heap。
    但是对于new来说,是用的进程的默认heap。初始时为默认1M,如果new的大小总共超过了1M,则会自动增加进程默认的heap。这就避免一次操作系统申请好大的内存,而是用多少保留多少,不够再扩充。
      

  15.   

    说到new,我稍微说下一般在Windows平台下的实现。对于很多的Windows平台的编译器来说,new的实现是这样的。
    new->HeapAlloc->VirtualAlloc->驱动程序。
    其中HeapAlloc系列函数基本上已经实现了内存管理的功能,包括申请较小块的内存等,new只是一个简单封装。
    但是对于微软和Borland等的编译器并不是直接调用了HeapAlloc系列函数来实现的new,而是自己实现了HeapAlloc系列函数。
      

  16.   

    他们已经回答的很清楚了,如果还不理解,我建议你看《Windows核心编程》
      

  17.   

    补充:
    操作系统对内存的管理是自动的 你new的内存也会被交换到虚拟页中 当然你可以指定某个虚拟页不应该被交换到页面文件