当前位置: 首页 > article >正文

malloc如何分配内存

方法

malloc 申请内存的时候,会有两种方式向操作系统申请堆内存。

  1. 如果小于128kb,就会通过 brk() 系统调用从堆分配内存,因为使用mmap()涉及到了系统调用,分配内存时,应该尽量避免系统调用,并且malloc 通过 brk() 系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当使用free()内存释放的时候,就缓存在内存池中,以便下次使用;
  2. 大于128kb的,就会通过 mmap() 系统调用在文件映射区域分配内存,这主要是为了解决在使用brk()进行内存分配时,对于一些小块内存,随着不断地创建和释放,堆内会产生越来越多不可用的碎片,导致"内存泄露”。而这种“泄露“现象使用 valgrind 是无法检测出来的。

注意:

  1. malloc() 在分配内存的时候,会预分配更大的空间作为内存池。
  2. malloc() 分配的实际上是虚拟内存,如果分配后的虚拟内存没有被访问的话,虚拟内存是不会映射到物理内存的,这样就不会占用物理内存了。只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系。

http://www.kler.cn/a/557706.html

相关文章:

  • 区块链相关方法-SWOT分析
  • DeepSeek底层揭秘——微调
  • Linux基本指令(三)+ 权限
  • w223信息技术知识赛系统设计与实现
  • 【Python爬虫(47)】探秘分布式爬虫性能:从测试到优化之路
  • 清华大学第五弹:《DeepSeek与AI幻觉》
  • Python strip() 方法详解:用途、应用场景及示例解析(中英双语)
  • 【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】
  • [VSCode]彻底卸载和重装,并搭建Java开发环境
  • 内容中台重构企业内容管理的价值维度与实施路径
  • Power Query M函数
  • rtcwake - Linux下定时唤醒计算机
  • JAVAWeb之Servlet学习
  • C++17中std::chrono::duration和std::chrono::time_point的舍入函数
  • 网络运维学习笔记 017HCIA-Datacom综合实验01
  • 蓝桥与力扣刷题(蓝桥 交换瓶子)
  • 【系统架构设计师】操作系统的分类
  • 三维重建(十四)——铰接类文章整理
  • WinSCP教程
  • 使用 C++ 和 gRPC 的常见陷阱及解决方案