你平时用的堆和栈都在前2G。
1、实际有4G。在内核模式运行的时候会使用高地址的内存(比如你调用了某个系统API,然后进入内核了,此时就会在内核地址空间运行,运行完了返回用户模式
2、每个进程的空间是独立的,两个的话从某种程度上说可以认为是4G。开启大地址支持的话每个进程可以有3G
3、Windows下访问的是同一个内容,但是内核地址空间部分是不允许用户模式的代码访问的
4、“剩下的虚拟地址空间”是指什么……4个G就分为用户空间和内核空间。动态分配也是在用户空间分配不是在内核空间分配
不是。系统API的代码也是在用户空间。系统内核代码才在内核空间。
是同一段代码。但是在用户模式下是无法访问C的,所以要做这样的实验会比较难
注意,在单核CPU的中,CPU每次只能运行一个进程。所以,你说指的操作系统把4G的前面2G分配给用户程序,而后面2G操作系统使用。这4G线性空间是虚拟的,在进程切换时映射到实际的物理地址。正如你所说,每个进程拥有2G的地址空间,如果是2个进程,那么就是4G了。
“每个进程实际拥有的只有2G空间而不是4G啊?”
windows把前3G的地址空间分配给了用户程序,系统占用1G的地址空间(这依然是线性地址,虚拟空间)。
“剩下的虚拟地址空间干什么用?”
这些剩余的地址就是操作系统使用了。C++中的new动态分配的是缓冲池中的内存,是物理内存,是要映射到用户进程的。应该在前2G中。
至于后面的几个问题,你理解一个原则就好办了。在现在的系统中,在进程中运行的从系统中加载 .dll 是一个副本。你设想一下,如果进程崩溃了,系统会不会崩溃?A进程崩溃了,B进程会不会也崩溃?