一、进程空间简介 ——参考博客
1. 进程空间是一个虚拟空间,是逻辑上的空间,32位系统中,进程空间共4GB。该空间中的地址通过页表映射到实际内存的物理地址,虚拟的高地址映射到物理的低地址。
2. 进程空间分为:内核空间和用户空间。虚拟内核空间则为所有进程以及内核所共享,存放内核代码、数据。
1) Windows:高位2GB给内核、低位2GB给用户。一个线程默认栈是1M,所以一个进程最大开2048个线程,实际最大线程数小于2048,大概2000个。堆空间最大为2GB。
2) Linux:高位1GB给内核、低位3GB给用户。一个线程默认8M,所以最多380个左右线程。堆空间最大为2GB。
3. 划分 ——参考博客
4. 栈空间如果不够,栈可以动态增长。如果达到了最大栈空间的大小,就会栈溢出(stack overflow),程序收到一个段错误(segmentation fault)。
5. 父、子进程的空间管理 ——参考博客
父子进程各种有一份虚拟空间地址,在子进程刚被创建时,父子进程代码和数据共享,所以此时虚拟地址空间的内容是基本一样的(当然有部分数据不同,比如各子的id等),且映射关系也是一样的(即映射到相同的物理地址)。
当如果有一方试图写入数据,那么写入方将对那份数据进行写时拷贝,虚拟地址还是没有发生变化,写入方的页表映射将改变。