首页 > 其他分享 >malloc实现原理【Liunx】

malloc实现原理【Liunx】

时间:2024-07-10 11:30:32浏览次数:27  
标签:malloc mmap brk Liunx 空间 原理 分配 内存

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的空间和物理内存页面的映射关系可能还在,下次申请空间时就不会造成缺页中断。


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

标签:malloc,mmap,brk,Liunx,空间,原理,分配,内存
From: https://blog.csdn.net/tang20030306/article/details/140316028

相关文章

  • 大话光学原理:3.干涉与衍射
    一、干涉        这是一束孤独的光,在真空的无垠中悄无声息地穿行。忽然,一堵高耸的墙壁挡住了它的去路,它别无选择,只能硬着头皮冲撞而去。在摸索中,它意外地发现墙壁上竟有两道孔隙,笔直而细长,宛如量身定做,似乎在等待着它轻盈的穿透。然而,刚刚逃脱束缚,一道新的屏障又挡在......
  • 【转】-Java CAS 原理剖析
    JavaCAS原理剖析本文转载来自​卡巴拉的树​的​JavaCAS原理剖析在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。像synchronized这......
  • 【粉丝福利社】《数据血缘分析原理与实践》(文末送书-进行中)
    ......
  • Java字符串(String、字符串拼接、原理)
    文章目录一、String字符串1.1创建方式【直接赋值、new一个对象】1.1.1使用字符串字面值直接赋值:(1)字符串字面量创建String对象的转换过程(2)一些方法(3)说明1.1.2使用`new`关键字创建字符串对象,将内容赋值给变量:(1)`String`类有多个构造函数,其中一些常用的包括:(2)说明(3)引用的......
  • 转-OAuth2.0 原理流程及其单点登录和权限控制
    原文链接单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清OAuth2.0实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。1什么是单点登录1.1多点登录传统的多点登录系统中,每个站点都实现了本站专用的帐号数......
  • 转-OAuth2.0 原理流程及其单点登录和权限控制
    原文链接单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清OAuth2.0实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。1什么是单点登录1.1多点登录传统的多点登录系统中,每个站点都实现了本站专用的帐号数......
  • 转-OAuth2.0 原理流程及其单点登录和权限控制
    原文链接单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清OAuth2.0实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。1什么是单点登录1.1多点登录传统的多点登录系统中,每个站点都实现了本站专用的帐号数......
  • ilruntime原理浅究(一)
    AOT和JIT:AOT(AheadOfTime):指在程序运行前,将源码编译成目标平台的机器码的过程。特点:快速启动:由于没有运行时编译步骤,程序启动速度更快运行时性能更好:减少了JIT编译器的运行时开销,提高了整体性能代码体积小:可以进行全局优化,能生成更紧凑的代码JIT(JustInTime):指程序边运......
  • 跨站请求伪造(CSRF)攻击原理及预防手段
    1、什么是跨站请求伪造?CSRF(Cross-siteRequestForgery,跨站请求伪造)攻击是一种常见的Web攻击,它利用用户在登录某个网站后的有效session来发送恶意请求。攻击者通过引导用户访问恶意网站,将用户的数据提交到目标网站,欺骗目标网站相信该请求是用户发送的。CSRF攻击的关键是攻击者可......
  • Vue源码学习(二十):$emit、$on实现原理
    好家伙, 0、一个例子<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>Vue父子组件通信示例</title><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"......