### 进程和线程内存空间的关系

**进程的内存空间**

一个**进程**可以看作是一个正在运行的程序实例。操作系统为每个进程分配独立的、私有的内存空间，这通常被称为**虚拟地址空间**。这个独立的地址空间主要包括以下几个关键区域：

- **代码段**：存放可执行文件的机器指令（也就是程序的代码）。这部分通常是只读的，以防止程序在运行时修改自身代码
- **数据段**：存放已初始化的全局变量和静态变量
- **BSS 段**：存放未初始化的全局变量和静态变量
- **堆**：用于动态内存分配。程序在运行时，可以随时从堆中申请和释放内存
- **栈**：用于存放局部变量、函数参数和返回地址。栈是自动管理的，遵循先进后出（LIFO）的原则

**关键点**：每个进程都有自己独立的虚拟地址空间。这意味着，一个进程无法直接访问另一个进程的内存，除非使用进程间通信（IPC）机制。这种隔离性是操作系统的核心安全机制，可以防止一个进程的错误影响到其他进程，从而保证系统的稳定性

**线程的内存空间**

一个**线程**是进程内的一个执行单元，有时也被称为“轻量级进程”。与进程不同的是，**同一个进程内的所有线程共享该进程的内存空间**

具体来说，这些线程共享：

- **代码段**：所有线程执行的是同一份程序代码
- **数据段**：所有线程都可以访问和修改同一个进程的全局变量和静态变量
- **堆**：所有线程都可以从同一个堆中申请和释放动态内存

但是，每个线程都有自己**独立的**私有部分：

- **栈**：每个线程都有自己的私有栈，用于存放它自己的局部变量和函数调用信息。这是为了确保每个线程在执行函数时，不会影响到其他线程的执行上下文
- **寄存器**：每个线程都有自己的寄存器集合，用来保存其执行状态

可以把**进程**想象成一个**拥有独立房子的住户**，这个房子里有独立的厨房、客厅和卧室（代表私有的内存空间）。而**线程**则可以想象成**房子里的不同家庭成员**

- **进程**：拥有独立的房子（**独立的地址空间**）
- **线程**：是房子里的家庭成员。他们共享房子里的公共区域，比如**客厅（堆）**、**厨房（数据段）**，但每个人有自己的**卧室（栈）和衣柜（寄存器）**