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 领域,当前方法由于描述性差…

MySQL零散拾遗

mysql中大小写敏感吗? MySQL数据库默认情况下是不区分大小写的,这意味着在查询时,字段名和值的大小写不会影响结果。然而,这种默认行为可能会根据操作系统和配置的不同而有所变化。 在某些操作系统上,比如Linux&…

在android13的系统中出现INSTALL_FAILED_BAD_PERMISSION_GROUP安装失败的问题解决

在android13的系统中,编译能过,但是在真机运行出现无法安装的问题的问题,AS中提示出现INSTALL_FAILED_BAD_PERMISSION_GROUP的问题,找了好多资料都没有找到具体的解决方案,记录一下 解决方法: 在manifest中…

初识神经网络之我的理解

初识神经网络之我的理解 个人理解分析一个神经网络相关python代码参考文档个人理解 个人认为神经网络是一个分类问题,即通过多维的参数通过合适的计算来得到一个确定的输出。 在数学层面看来是从高维度的参数降维为低维度的分类的过程。至于输出的结果如何达成我们想要的或者…

Linux操作系统安全分析与防护

Linux操作系统安全机制 Linux操作系统由于其开放源代码和广泛应用,在服务器和嵌入式系统中占有重要地位。为了确保Linux系统的安全,必须了解并实施一系列有效的安全机制。这些机制包括用户身份验证、访问控制、数据加密、日志和审计、安全更新等。 一、…

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…

认字之 刬

chǎn 释义 1.同“铲”,铲子。用以撮取东西的工具。 chn 释义 1.[一刬]一概;一律。 刬袜 [ chǎn w ] 只穿袜子,不穿鞋子走路。 菩萨蛮花明月暗笼轻雾 李煜 刬袜步香阶, 手提金缕鞋。 点绛唇蹴罢秋…

前端调用有道翻译

有道API ,注册用户信息并拿到有道翻译的应用ID和应用密钥 安装 crypto-js npm install crypto-js 调用翻译API import CryptoJS from crypto-js;export const yandex (query: any) > {let appKey ;//应用IDvar salt new Date().getTime();var curtime Mat…

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

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

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

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

.net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护

1、/etc/systemd/system/ 目录下创建service文件 如:/etc/systemd/system/testDemoSer.service 2、文件内容示例: [Unit] DescriptiontestDemoSer running on CentOS [Service] WorkingDirectory/usr/project/iis Typesimple Userroot Grouproot Exec…

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

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

JAVA获取重定向地址URL的两种方法

1、使用HttpURLConnection HttpURLConnection conn = (HttpURLConnection) new URL("http://192.168.1.200/6178dc0f47ec4fb8b0f01d87e13ea92d").openConnection();conn.setInstanceFollowRedirects(false

第二课使用域名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…

react小白面试不得不会的20个问题——第二篇

当然,以下是后十个问题的简要回答: React中的受控组件和非受控组件有什么区别? 受控组件是指其值由React组件的state控制的输入表单元素。每当表单元素的值发生变化时,都会触发一个事件处理器,该处理器会更新组件的sta…

AUTOSAR:汽车软件架构的未来

AUTOSAR:汽车软件架构的未来 引言 随着汽车行业向智能化、电动化转型,汽车软件系统变得日益复杂。AUTOSAR(Automotive Open System ARchitecture)作为一个开放的标准化汽车软件架构,为汽车电子系统的开发提供了统一的…

写时拷贝 --全篇来自chatgpt

fork是Unix和类Unix操作系统中用于创建进程的系统调用。fork会创建一个子进程,该子进程几乎是父进程的完全拷贝,包括代码段、数据段、堆和栈。然而,为了提高效率,fork使用了一种叫做写时拷贝(Copy-On-Write, COW&#…