《程序员的自我修养》笔记八:内存

背景

Linux 系统为内核分配 1G 内存,Windows 系统为内核分配 2G 空间,剩余的内存供用户程序使用。

用户空间的划分
在这里插入图片描述


  • 用于维护函数调用的上下文,在用户空间的最高地址处分配

  • 用来容纳应用程序动态分配的内存区域,比栈大很多。常在栈的下方,
  • 可执行文件映像
    存储可执行文件在内存里的映像
  • 保留区
    不是一个单一的内存区域,而是对内存中收到保护而禁止访问的内存区域的总称
  • 动态链接库映射区
    装载动态链接库

计算机科学中的栈

一种存放数据的特殊容器,入栈出栈规则是 FILO

计算机系统中的栈

具有以上属性的动态内存区域,入栈使栈增大,栈顶地址变小,出栈使栈减小,栈顶地址增大

保存函数调用时所需的维护信息,栈上的数据在函数返回时就被释放掉 ,无法将数据传递至函数外部

栈的内容

  1. 函数的返回地址和参数
  2. 临时变量,如函数的费静态局部变量以及编译器自动生成的其他临时变量等
  3. 保存的上下文,函数调用前后所需要保持不变的寄存器

堆是一块巨大的内存,占据整个虚拟空间的绝大部分,程序可以申请一块连续内存,自由使用,在程序主动放弃之前都会一直有效。

堆分配算法按需分配、释放其中的空间。有以下几种方式:

  • 空闲链表

把堆中各个空闲的块按照链表方式连接,用户请求一块空间时,遍历整个列表,找到合适大小的块并将它拆分,当用户释放空间时将它合并到空间链表中

  • 位图

将堆划分为大量的块(block),每个块大小相同,用户请求内存是,分配数个块的空间给用户,第一个称为头(Head),其余称为主体(body),用整数数组记录块的使用情况,每个块只有头/主体/空闲三种状态

  • 对象池

如果每次分配空间大小都一样,就按照该大小将堆划分为大量的小块,每次请求只需要找到一个小块即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值