进程4G虚拟内存空间的分配

通常我们常说的4G/8G内存是指计算机硬件的内存条是4G/8G,而不是我们今天所谈论的进程4G虚拟的内存。
当一个程序运行时,系统会为每一个进程分配一个4G的虚拟内存空间,用来保存进程运行所需要的各种资源(详细资源列表后面会谈到),并创建task_struct进程控制块,保存进程的属性(进程ID、父进程、进程状态、使用的寄存器等)。
接下来聊一聊4G的虚拟内存是如何分配的:
4G------------- |-----
内核空间 | 特点是由内核管理,用户是不可见的更是进不去的
3G------------- |-----
用户空间 | 特点是由用户管理
0-------------- |------
用户空间的0~3G分为:
3G |----------------------------------|
^ | 栈区 | ------>特点是由系统管理,先进后出,存放的是局部变量,函数形参,自动变量;
|| |----------------------------------|
|| | 堆区 | ------>特点是由用户管理,用户可以使用的malloc申请的空间就是这片空间;
|| |----------------------------------|
|| | 未初始化区域 | ------>保存的是未初始化的全局变量
|| |-----------------------------------|
|| | 全局/静态初始化区域 | ------>保存了初始化的全局变量还有static修饰的变量
|| |---------------------------------- |
|| | 字符串常量 | ------>保存了常量
|| |-----------------------------------|
^ | 代码区 | ------>存放源代码
0 |----------------------------------|

内核空间的3G~4G分为:
4G |-----------------------------

### 虚拟内存中的栈区与堆区 #### 栈区(Stack Area) 栈区是在程序启动时预先分配好的一部分内存区域。这部分内存用于存储函数调用过程中产生的局部变量、返回地址以及参数等信息。由于栈的空间是在编译期就已确定,因此不需要通过动态分配的方式获取更多资源。 对于现代操作系统而言,在进程创建之初就已经为该进程准备好了足够的初始栈空间[^3]。这意味着当一个新的线程或子过程被执行时,可以直接利用已经存在的栈结构而无需额外请求新的内存块。这种机制使得栈操作相对简单高效,并且具有较好的性能表现。 #### 堆区(Heap Area) 相比之下,堆则是由程序员显式管理的一片较大的连续内存区间。应用程序可以通过诸如 `malloc` 或者 C++ 中的新运算符 (`new`) 来向系统申请任意大小的内存片段作为临时数据容器。这些被分配出来的对象可以在整个程序生命周期内的任何时候释放掉以便回收其占用空间。 值得注意的是,虽然可以灵活控制堆上的对象生命周期,但是频繁地执行分配/释放动作可能会引起碎片化问题——即尽管存在大量未使用的零散空闲区块却难以找到一块足够大的连续位置来满足后续的大规模需求。此外,由于涉及复杂的内部管理和同步逻辑,通常情况下访问堆的速度会慢于栈。 #### 主要差异对比 | 特征 | 栈区 Stack | 堆区 Heap | | --- | --- | --- | | **作用域** | 局部范围内有效,仅限当前活动记录期间使用 | 可供全局共享,直至手动销毁为止 | | **分配方式** | 自动完成,默认初始化完毕即可投入使用 | 需借助API接口如`malloc()`进行显示声明才能获得相应权限 | | **增长方向** | 向低地址扩展 | 向高地址延伸 | | **存取效率** | 较快,得益于简单的入栈出栈模型 | 相对较慢,受制于更复杂的数据结构调整 | 综上所述,在4G虚拟内存架构下的操作系统环境中,栈和堆分别承担着不同职责并表现出各自特点: - 栈主要用于支持快速变化的小型短期任务; - 堆则更适合处理那些需要长期保存或者跨多个模块间传递的信息实体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值