每个进程占据独立4GB的虚拟空间,这个虚拟空间怎么理解?我傻傻的认为这样的话我多开几个进程,不是连我硬盘的容量都没这么大,望指点

解决方案 »

  1.   

    就是操作系统有一张内存管理的机制。有什么分段,分页之类,就是解决这些问题的。
    http://hi.baidu.com/fthislife/blog/item/77df1f28b3979197023bf6c1.html
      

  2.   

    这4GB其中 2GB的属于系统(这部分进程间共享) 2GB的属于用户但是这4GB只是一个地址范围、即进程“认为”它有这么大的地址空间,实际有没有要看你内存大小
      

  3.   

    一言难尽
    4GB是32位指针,理论上有4GB,其实哪要那么多啊
    分页机制,把地址映射到物理内存
      

  4.   

    在Windows NT时代,进程地址空间可分为四个分配,它们是NULL指针分区,用户方式分区,64-KB分区,内核方式分配。其中只有用户方式分区是能被程序员使用的,范围为(0x00010000-0x7ffeffff).在Win98时代,有一个专用的共享内存映射分区,用于存放内存映射文件,但是从Windows NT开始,这一分区被取消,它被分散到用户方式中的内存区域了。虚拟地址空间按从大到小分类,可分为分区,区域,内存块和页面。其中区域与内存块的类型有私有,空闲,映射,映像四种。空闲是指未提交的区域,私有是指进程自己的内存块,别的进程无法访问,映射是用于存放内存映射文件的。映像是用于存放DLL,EXE模块代码的。因此,Win98中的内存映射分区在NT时代被转移到了用户方式分区中的映射内存块中。进程的虚拟地址空间是进程在创建时就产生的。这个4GB的空间初始状态下是保留的,你可以理解为未分配的。当你使用虚拟内存函数VirtualAlloc就可以提交一段区域,这块区域被记录为进程所占有的,但是是未分配的。你还可以使用VirtualAlloc分配一段区域,这块区域是真实地被映射到虚拟内存中的,也就是说可以使用了。当你分配了一块地址空间后,操作系统会为你将地址空间映射到虚拟内存中的。当你第一次提交或者分配内存时,内存区域必须以一个系统粒度大小对齐(系统粒度一般为64KB),而内存区域必须是页面大小的倍数(页面大小一般为4KB)。当你第二次对提交过的内存分配时,你分配的将是内存块,而不是区域。