当前位置:首页 > 科技  > 软件

内存是怎样一步步被分配出来的?

来源: 责编: 时间:2024-06-27 08:35:07 61观看
导读大家好,我是小风哥,今天简单聊聊内存分配。我们申请一块内存时计算机内部发生了什么?看下这句代码:图片这里有两部分,一个是malloc,再一个是你写的代码。图片malloc实际上属于标准库,标准库里有什么呢?数学相关的函数,sin、cos

大家好,我是小风哥,今天简单聊聊内存分配。h2r28资讯网——每日最新资讯28at.com

我们申请一块内存时计算机内部发生了什么?看下这句代码:h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

这里有两部分,一个是malloc,再一个是你写的代码。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

malloc实际上属于标准库,标准库里有什么呢?h2r28资讯网——每日最新资讯28at.com

数学相关的函数,sin、cos、绝对值、数幂函数等;字符相关函数,判断大小写等;字符串操作函数、字符串拷贝、拼接比较等;当然还有内存管理函数,就是这里提到的malloc/free,当然还有很多其它函数,这就是标准库。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

再来看你写的代码,什么是你写的代码呢?以c语言为例,.c文件就是你写的代码,这包括你写的hello world程序、充满bug的练习程序,当然还有各种项目。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

这就是你写的代码。h2r28资讯网——每日最新资讯28at.com

这些代码怎么变成最终的可执行程序呢?当然是借助编译器。h2r28资讯网——每日最新资讯28at.com

编译器会把你的代码编译成目标文件。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

接着链接器出场,连接器会把目标文件和标准库打包成可执行程序。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

这就是代码部分,接下来我们看内存分配。h2r28资讯网——每日最新资讯28at.com

到底什么是内存呢?h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

内存实际上和储物柜非常相似,储物柜会划分成了一个一个大小相同的隔间,每个隔间可以存储东西,内存的道理也一样,内存也被划分成了一个一个大小相同的隔间,我们来仔细看一下。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

内存中的每个隔间存储的是一个字节,8比特位一字节。h2r28资讯网——每日最新资讯28at.com

比如这里申请的一块int大小的内存,一个int占据4个字节。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

和储物柜一样,内存中的每个隔间也有一个编号,这个编号叫做内存地址。h2r28资讯网——每日最新资讯28at.com

在我们的实例中,申请的这块内存位于内存地址2这个位置,这意味着什么嗯?这意味着变量p等于数字2,或者说等于内存地址2,这里的p就是所谓的指针。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

接着我们看内存分配过程。h2r28资讯网——每日最新资讯28at.com

这段代码当然属于编译后生成的可执行程序,可执行程序是在内存中运行的,当然我们需要为整个程序分配一块内存。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

程序的运行依赖栈区,这里存放着局部变量等信息;依赖堆区,这里存放着程序员自己管理的动态申请的内存,关于堆区和栈区之前的视频也有讲解;除此之外还依赖代码区,这里保存的就是编译后的之类;还有数据区,这里保存着全局变量等信息。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

这些区域在内存中的布局是这样的:h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

再次强调下,编译后的代码位于代码区,malloc动态申请的内存位于堆区,接下来我们只关注堆区。h2r28资讯网——每日最新资讯28at.com

在程序开始运行时堆区当然是空的,那么所谓的内存分配到底是什么呢?如果让你实现内存分配器该怎么做到呢?很简单,其实内存分配就是划分地盘。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

此时要分配第一块大小为A的内存,那么你应该把A放在哪里呢?h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

因为此时堆区是空的,显然你可以把开始这个位置划分给A,作为A的地盘,找到A的地盘后malloc这个函数返回,内存分配过程结束,是不是很简单。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

接着程序员又开始申请大小为B的内存,道理和A一样,把A之后的地盘给B即可。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

程序员又开始申请大小为C的内存,同理。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

接着程序员说A占用的这块内存使用完毕,调用free释放,所谓释放就是把A占据的地盘重新标记为空闲,这时堆区里还有两块空闲内存。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

接着程序员开始申请大小为D,这时问题来了,你该从哪里给D划分地盘呢?h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

放到第一个空闲块吗?显然第一个空闲块大小不够。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

第二个呢,第二个也不够。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

但是你发现了一个问题,仔细看着两个空闲块,这两个空闲块的总大小实际上是超过D的。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

我们把这种空闲的但是不能用来分配出去的内存称之为内存碎片。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

你可以想象一下经过不断的内存申请和释放,堆区中会存在无数这样空闲内存碎片。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

碎片化的内存显然不利于内存的充分利用,计算机科学历史上有无数论文试图来解决这个问题。h2r28资讯网——每日最新资讯28at.com

现在堆区已经不足以为D申请出内存,该怎么办呢?h2r28资讯网——每日最新资讯28at.com

让我们回到最初的布局,注意看堆区和栈区中间实际上还有一段空闲内存区域,这块区域就是为堆区或栈区来扩大地盘用的,那么该怎么扩大堆区呢?h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

这就要借助操作系统的帮助了。h2r28资讯网——每日最新资讯28at.com

在linux等系统中可以借助brk等系统调用向操作系统申请来扩大堆区。h2r28资讯网——每日最新资讯28at.com

图片图片h2r28资讯网——每日最新资讯28at.com

h2r28资讯网——每日最新资讯28at.com

现在堆区扩容完毕,此时就可以在堆区中找出一块合适的空闲内存分配给D,到这时malloc这个过程才真正结束,这实际上是一个相当复杂的过程。h2r28资讯网——每日最新资讯28at.com

图片 图片 h2r28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96829-0.html内存是怎样一步步被分配出来的?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 高通中国区董事长孟樸:携手生态伙伴,共创数智时代下的新增长机遇

下一篇: 最高优惠 300 元,小米 Civi 4 Pro 手机开启“暑期特惠”:骁龙 8s Gen3,2799 元起

标签:
  • 热门焦点
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 十个简单但很有用的Python装饰器

    十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • ESG的面子与里子

    ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top