C/C++教程

C++进程空间管理

本文主要是介绍C++进程空间管理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

一、进程空间简介  ——参考博客

1.  进程空间是一个虚拟空间,是逻辑上的空间,32位系统中,进程空间共4GB。该空间中的地址通过页表映射到实际内存的物理地址,虚拟的高地址映射到物理的低地址。

2. 进程空间分为:内核空间和用户空间。虚拟内核空间则为所有进程以及内核所共享,存放内核代码、数据。

1) Windows:高位2GB给内核、低位2GB给用户。一个线程默认栈是1M,所以一个进程最大开2048个线程,实际最大线程数小于2048,大概2000个。堆空间最大为2GB。

2) Linux:高位1GB给内核、低位3GB给用户。一个线程默认8M,所以最多380个左右线程。堆空间最大为2GB。

3. 划分  ——参考博客

  • 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码和只读常量。
  • 数据段:静态数据(①Data段(初始化过的数据)和②BSS段(未初始化的数据))、全局数据
  • 栈 (Stack):存储局部、临时变量,函数调用时,存储函数的参数列表、返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
  • 堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放。存储那些生存期与函数调用无关的数据。

4. 栈空间如果不够,栈可以动态增长。如果达到了最大栈空间的大小,就会栈溢出(stack overflow),程序收到一个段错误(segmentation fault)。

 

5. 父、子进程的空间管理  ——参考博客

  父子进程各种有一份虚拟空间地址,在子进程刚被创建时,父子进程代码和数据共享,所以此时虚拟地址空间的内容是基本一样的(当然有部分数据不同,比如各子的id等),且映射关系也是一样的(即映射到相同的物理地址)。

  当如果有一方试图写入数据,那么写入方将对那份数据进行写时拷贝,虚拟地址还是没有发生变化,写入方的页表映射将改变。

 

 

这篇关于C++进程空间管理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!