C++进程空间管理
2022/8/22 5:52:47
本文主要是介绍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++进程空间管理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升