malloc实现原理【Liunx】

malloc实现原理

  • malloc是什么?
  • malloc,calloc, realloc的区别
  • malloc的实现原理
    • malloc的两种实现方式
      • 为什么使用brk?
      • 为什么使用mmap?
    • malloc怎么定界的
    • malloc分配的是虚拟内存上的空间吗?

malloc是什么?

  通过malloc,我们可以开辟一个自定义大小的内存空间。
在这里插入图片描述
  通过上图我们可以知道,malloc是一个C的库函数,参数是分配一个size大小(正整数)的空间,分配成功后返回一个void*指针,说明可以通过强转,返回一个任意类型的指针。分配空间失败后返回null

malloc,calloc, realloc的区别

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
  根据上图来说明:

  • malloc: 分配size字节大小的空间,分配空间成功后返回一个void*指针;分配空间失败后返回null
  • calloc: 分配numsize字节大小的空间,分配空间成功后返回一个void*指针;分配空间失败后返回null
  • realloc:ptr指针指向的空间,将其大小改变为size字节大小。成功后返回一个void*指针;失败后返回null。具体可以参考博客:realloc的用法。

malloc的实现原理

   malloc是C库函数,所以底层肯定使用系统调用来实现。
   malloc分配内存的时候,会预分配一个更大的空间作为内存池,然后在内存池上面划分所申请大小的空间并返回,free时也不会将空间直接释放,而是将空间归还给内存池。但通过后面我们可以知道,只有当底层使用brk时才是这样的,使用mmap时直接分配内存,free后就还给OS,不会和内存池产生交互。

malloc的两种实现方式

malloc通过以下两个系统调用来实现:

  1. brk: 当分配的空间大小 小于 128KB时, 在堆上分配空间。
  2. mmap: 当分配的空间大小 大于 128KB时, 在文件映射区上分配空间。

为什么使用brk?

   当分配的空间大小 小于 128KB时, 在堆上分配空间。为什么这样设计呢?
   因为mmap使用完内存free会直接释放归还给操作系统,频繁的调用mmap会使得用户态和内核态来回切换,会降低效率,于是利用了内存池来解决这个问题,每次调用brk函数都会预分配更大的空间来放入内存池,下一次在调用brk的时候,就可以不用切换为内核态,直接将内存池的空间分配即可,提高了效率。

为什么使用mmap?

   为什么使用mmap呢?
  因为brk在内存池中的释放空间和申请空间都会造成许多内存碎片,如果我们频繁申请很多大空间的内存,如果都使用brk,就会造成内存池中出现许多空间大的内存碎片,造成了空间浪费。
  所以,当我们申请小空间的内存时,使用brk,将其放入内存池,就算形成内存碎片也不会造成很大的空间浪费, 而且减少了内核态和用户态的切换,提高了效率。当我们申请大空间的内存时,使用mmap,就能避免内存池中没有合适大小的空间,并且free后直接释放给了操作系统,避免了造成更大的空间浪费。

malloc怎么定界的

   malloc分配空间时,会返回一个指向所申请空间开头地址的指针,那么只靠这一个指针,是怎么分辨分配空间的界限的呢?怎么知道空间有多大呢?
  原因是因为malloc在分配内存时,多分配了一段内存空间,其中存储了用户所需空间的大小,有了这个我们就能确定界限。这段多分配的空间就在malloc返回的指针指向地址的前面的空间处。如图:
在这里插入图片描述

malloc分配的是虚拟内存上的空间吗?

  malloc分配的是虚拟内存上的空间,一开始并不会在物理内存上面分配内存,当我们使用这个空间的时候,拿到这个虚拟地址,去页表查询,会发现没有对应的页表项,就会触发缺页中断,然后操作系统在物理内存分配相应大小的空间,更新页表,再重新查询,这时候,才会真正的在物理内存上分配内存。
  所以,如果一直使用mmap,每次都释放空间给操作系统,页表中的页表项也会被删除,再进行申请空间的, 使用空间的时候,就会造成缺页中断,造成效率低下。而使用brk不会将内存空间返还给操作系统,页表中这个已经free的空间和物理内存页面的映射关系可能还在,下次申请空间时就不会造成缺页中断。


       新人创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻译与解读】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是许多机器人视觉任务的基本组成部分,如 2D 或 3D 目标检测、识别和配准。2D 特征提取和匹配已取得巨大成功。然而,在 3D 领域,当前方法由于描述性差…

2024前端面试题之Vue3

2024前端面试题之Vue3 在面试具有五年经验的前端工程师时,对于 Vue 3 的掌握程度是一个重要的考核点。本文将提供一系列针对这一级别工程师的 Vue 3 面试题,并附上详细的解析,帮助面试官全面评估候选人的技术实力和项目经验。 一、Vue 3 基础…

vscode-server安装和部分配置

文章目录 前言code-server安装rpm包安装tar.gz安装 vscode部分配置vscode配置函数跳转安装插件 vscode的structurevscode的hierarchy更改颜色主题 前言 vscode确实彳亍,虽然我觉得Clion(c/c语言版的IDEA)更方便,但是毕竟我没钱买license 这里记录一下网…

11410-00SF 同轴连接器

型号简介 11410-00SF是Southwest Microwave的连接器。该连接器的外壳采用优质不锈钢,材质为 CRES ALLOY UNS-S303500,符合 ASTM-A582 标准。首先,不锈钢材料经过锻造加工,形成转接器的基本形状。然后,外壳进行精密的 C…

CentOS7忘记root密码无法登陆解决方法

重启服务器,等到如图下所示界面的时候,快速按下键盘的↑或者↓按键,等固定住画面,然后按下e按键 然后按键盘上的↓按键,找到图下所示的linux16开头的那段,然后把光标挪到ro这里 按照图下所示,把…

提供跨平台的视觉安防解决方案,满足不同场景的需求的智慧交通开源了。

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

大气热力学(6)——位温和假相当位温

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 6.1 位温6.2 斜 T-lnP 图(Skew T-lnP)6.2…

第二课使用域名dns ping通www.baidu.com

需要一台dns服务器,实现域名解析,把对应的网址变为Ip地址。 首先按照之前博客的配置,自动分配给PC1和PC2的IP地址等相关配置。 然后增加一台server交换机连接到交换机上,配置好ip地址,192.168.1.100。在dnsServer中。…

CAD应用程序开发工具CST CAD Navigator 1.4.0.1 正式发布—— 带来了 G 代码生成功能

CST CAD Navigator是一款兼容Windows和Linux的CAD应用程序。在其简单的界面下,有一个可以快速查看2D图纸和3D模型的强大核心。软件可以轻松地导入和导出文件,获取尺寸,并创建截面视图。 下载最新版CST CAD Navigatorhttps://www.evget.com/p…

全网最全的接口文档速成

文章目录 接口文档内容前言1. 前后端分离开发1.1 介绍1.2 开发流程1.3 前端技术栈 2. Yapi2.1 介绍2.2 使用2.2.1 准备2.2.2 定义接口2.2.3 导出接口文档2.2.4 导入接口文档 3. Swagger3.1 介绍3.2 使用方式3.3 查看接口文档3.4 常用注解3.4.1 问题说明3.4.2 注解介绍3.4.3 注解…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程,当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目:当大型语言模型遇到优化时 作者:Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源:arXiv 单位:华南理工大学 文章目录 When Large Language Model Meets Optimization…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知,今年8月1日,CISA新版考纲正式上线,旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版,中文版尚未发布。我们艾威经验丰…

Jetson-AGX-Orin多网卡绑定网卡名

Jetson-AGX-Orin多网卡绑定网卡名 ​ Jetson-AGX-Orin当通过USB接口或者Type-C口插入网卡设备后,重新上电Orin设备后,网卡设备的网卡名与Orin本身的以太网网卡名会发生交换。导致两个网卡设备配置发生错乱,两个网卡都将不通。 可以通过将网…

出道即包揽多项荣誉,Shokz韶音OpenFit Air拿下日本VGP金奖

说到盛夏的日本,你会想到什么?花火大会?但对于消费电子行业来讲,日本每年发布的VGP Summer奖项,才是每年盛夏时节行业内最大的庆典。而在今年的VGP 2024 Summer评选中,Shokz韶音在今年4月份刚发布的开放式耳…

开放式耳机音质哪个品牌的好?盘点几款音质好品牌

在音乐的世界里,每一分贝的振动都承载着情感与故事。对于追求极致音质体验的我们来说,耳机不仅是聆听的工具,更是通往音乐灵魂深处的桥梁。而开放式耳机,以其独有的声学构造和听觉享受,引领我们进入一个更为开阔的音乐…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

如何探索高效知识管理:FlowUs知识库体验很好

在当今信息爆炸的时代&#xff0c;有效的知识管理对于个人和团队的发展至关重要。FlowUs 知识库作为一款创新的知识管理工具&#xff0c;正逐渐成为众多用户的首选&#xff0c;为他们带来了高效、便捷和有条理的知识管理体验。 FlowUs 知识库的一大特色在于其简洁直观的界面设计…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点&#xff0c;并暴露出grpc服务&#xff0c;但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示&#xff1a; 支持多种功能节点 但只能打开一个节…

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上运行spark程序写到本地文件的时候报错。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()错误信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…