malloc函数内存分配原理

malloc 是一个库函数,在<stdlib.h> 头文件中,是在程序的运行时库(Runtime Library)中实现的。这个函数主要用于在程序运行期间动态地分配内存。当在 C 语言程序中使用 malloc 时,实际上是在调用运行时库提供的一个函数,该函数会尝试从进程可用的内存池中分配一块大小适合的内存区域,并返回一个指向这块内存的指针。

malloc分配内存的原理:

1. 初始化

第一次调用 malloc 时,它会初始化一个内存池。这个内存池通常是通过向操作系统请求一块连续的内存区域来创建的。在 Unix-like 系统中,这通常通过 sbrk 系统调用来实现;而在 Windows 中,则可能通过 VirtualAlloc API 来实现。(如果分配的内存比较大,则可能会用mmap方式)

2. 内存池管理

malloc 维护一个内存池,内存池中包含已经分配出去的内存块以及空闲的内存块。通常,malloc 使用某种数据结构(如链表、二叉树或其他高效的数据结构)来跟踪这些内存块的状态(已分配/空闲)和大小。

3. 分配内存

当程序调用 malloc(size_t size) 请求分配内存时,malloc 需要在内存池中找到一个足够大的空闲块来满足请求。如果内存池中有足够的连续空闲空间,malloc 会从这个空闲块中分割出一块大小为 size 的内存,并返回一个指向这块内存的指针。

4. 内存对齐

malloc 会确保返回的内存地址是按照平台要求对齐的,比如在 x86 架构中,内存地址通常需要对齐到 8 字节或 16 字节边界,以优化内存访问性能。(不是所有平台都是这样)

5. 扩展内存池

如果内存池中的空闲块不足以满足新的请求,malloc 会尝试扩展内存池。这通常通过再次调用 sbrk 或 mmap 来实现,从操作系统获取更多的内存。新增的内存会被添加到内存池中,并可用于后续的内存分配请求。

6. 内存碎片处理

在多次分配和释放内存之后,内存池中可能会出现大量的小块空闲内存,这些小块之间不连续,导致内存碎片。malloc 可能会尝试合并相邻的小块空闲内存,使其成为一个较大的空闲块,从而减少内存碎片。

7. 释放内存

当程序不再需要某块内存时,应通过调用 free 函数来释放它。free 会将这块内存标记为空闲,并可能尝试与相邻的空闲块进行合并,以减少内存碎片。

8. 特殊情况处理

如果 malloc 发现无法从操作系统获取更多的内存来满足请求,它会返回 NULL,表示内存分配失败。

malloc分配的内存是虚拟内存还是物理内存?

malloc 分配的内存通常是虚拟内存。这是因为现代操作系统使用了虚拟内存机制,将进程的地址空间与实际物理内存区分开来。

既然是虚拟内存,那么分配的虚拟内存会和物理内存进行映射吗?

malloc 分配内存后,并不会立即为新分配的内存区域映射物理内存。相反,操作系统通常采用一种叫做“延迟分配”或“按需分页”(demand paging)的技术。这意味着在新分配的内存块中,只有当程序试图访问其中的数据时,才会触发一个分页错误(page fault),此时操作系统才会实际分配物理内存给这个虚拟地址,并建立虚拟地址到物理地址的映射。

这种策略有几个好处:

1.节省资源:如果分配的内存没有立即使用,那么就没有必要浪费物理内存。

2.提高效率:只有当内存真正被使用时才分配,可以避免不必要的内存分配和管理开销。

3.内存复用:操作系统可以复用未被实际使用的虚拟内存地址空间,直到它们被访问为止。

所以,malloc 分配的内存块在初始状态下一般是未映射到任何物理内存的。只有当程序开始读取或写入这部分内存时,操作系统才会分配物理内存并完成映射。这种机制使得内存管理更加灵活和高效。

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

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

相关文章

诗文发布模板(python代码打造键盘录入诗文自动排版,MarkDown源码文本)

python最好用的f-string&#xff0c;少量代码打造键盘录入诗文自动排版。 (笔记模板由python脚本于2024年09月19日 19:11:50创建&#xff0c;本篇笔记适合喜欢写诗的pythoner的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&am…

Apache subversion 编译流程

目录 1. 概述2. 依赖库简介2.1 Expat2.2 Apache apr2.3 Apache apr-iconv2.4 Apache apr-util2.5 Zlib2.6 OpenSSL2.7 Sqlite2.8 Apache Serf2.9 Apache subversion3. 编译3.1 Expat编译3.1.1 源码信息3.1.2 CMake-GUI3.1.3 编译步骤3.2 APR编译3.2.1 源码信息3.2.2 编译步骤3.…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

倒序循环(一)

题目描述 输入一个正整数n&#xff0c;输出从 n~ 1 递减的序列。 输入格式 一行一个整数 n 输出格式 n 行&#xff0c;每行一个符合题目要求的整数 样例数据 样例输入#1 5样例输出#1 5 4 3 2 1样例输入#2 6样例输出#2 6 5 4 3 2 1数据范围 对于100%的数据&#xff…

Java企业面试题2

1.语言的分代&#xff1a; 第1代&#xff1a;机器语言 机器语言是最底层的计算机编程语言&#xff0c;它是由二进制数构成的一系列指令&#xff0c;直接与计算机硬件交互。每个二进制位模式代表一条特定的指令或数据地址。因为它是直接在硬件上执行的&#xff0c;所以运行效率…

Java 23 的12 个新特性!!

Java 23 来啦&#xff01;和 Java 22 一样&#xff0c;这也是一个非 LTS&#xff08;长期支持&#xff09;版本&#xff0c;Oracle 仅提供六个月的支持。下一个长期支持版是 Java 25&#xff0c;预计明年 9 月份发布。 Java 23 一共有 12 个新特性&#xff01; 有同学表示&…

xmake与包管理:又一个现代c++构建工具?

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 主要起因是我在逛Reddit帖子时,看到关于一些c构建系统的评价. cmake似乎有些过于复杂,它与vcpkg,conan的包管理之间的"融合"可能在有些时候也显得麻烦. 一些人尝试了我没见过的选项, 所以这里主要试试除了…

Java重修笔记 第五十七天 坦克大战(七)多线程基础 - 编程练习

1. 线程之间的协调控制&#xff08;通知方式&#xff09; public class Homework04 {public static void main(String[] args) {// 在 main 方法中启动两个线程// 第一个线程内循环打印 1 到 100 以内的整数// 直到第二个线程从键盘读取到 "Q" 指令后结束第一个线程…

深入剖析大模型原理——Qwen Blog

1. 输入部分 Text&#xff1a;原始输入文本&#xff0c;模型需要处理的自然语言数据。Tokenizer&#xff1a;分词器&#xff0c;将输入文本转换为词汇表中的索引&#xff08;ID&#xff09;&#xff0c;便于后续处理。Input_ids&#xff1a;经过分词处理后的ID序列&#xff0c…

交流回馈老化测试负载的智能升级

在电子设备的生产过程中&#xff0c;老化测试是不可或缺的环节。老化测试主要是通过模拟设备长时间工作的情况&#xff0c;检测设备在经过一定时间的使用后&#xff0c;其性能是否会发生降低&#xff0c;是否存在安全隐患等。老化测试负载是老化测试中的重要组成部分&#xff0…

今日所学啊

ArcGIS打不开焦点统计如何解决_arcgis焦点统计打不开-CSDN博客 好吧其实最后焦点统计还是不行&#xff0c;我就去ArcGIS Pro里做焦点统计了哈哈哈哈哈哈哈 visual studio多工程项目管理_visual studio 的模块管理-CSDN博客 1.今天成功#include <QNetworkReply>不画红线…

【MYSQL表的增删改查(基础)】

MYSQL表的增删改查&#xff08;基础&#xff09; 一、CRUD二、新增&#xff08;Create&#xff09;2.1 单行数据全列插入2.2 多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09;3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.3.1 表达式不包含字段3.3.2 表达式包…

react是什么?

文章目录 核心特点1. **组件化**2. **虚拟 DOM** 3. **声明式编程**4. **单向数据流**5. **JSX 语法**6. **Hooks** react的优势劣势 React 是一个由 Facebook 开发和维护的开源 JavaScript 库&#xff0c;用于构建用户界面&#xff0c;特别是单页应用程序&#xff08;SPA&…

[PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)

前言 最近在做一个工作需要用到PICO4 Enterprise VR头盔里的眼动追踪功能&#xff0c;但是遇到了如下问题&#xff1a; 在Unity里面没法串流调试眼动追踪功能&#xff0c;根本获取不到Device&#xff0c;只能将整个场景build成APK&#xff0c;安装到头盔里&#xff0c;才能在…

枚举(not二分)

前言&#xff1a;这一题似乎用不了二分以及三分&#xff0c;害我写这么久&#xff0c;但是查找下一个元素的时候要用到二分查找 题目地址 #include<bits/stdc.h> using namespace std; #define endl "\n"int n; const int N (int)2e510; vector<int> a;…

OceanBase 中 schema 的定义与应用

背景 经常在OceanBase 的问答社区 里看到一些关于 “schema 是什么” 的提问。 先纠正一些同学的误解&#xff0c; OceanBase 中的 Schema 并不简单的等同于 Database&#xff0c;本次分享将探讨 OceanBase 中的Schema是什么&#xff0c;及一些大家经常遇到的问题。 具体而…

JavaDS —— 图

图的概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G &#xff08;V&#xff0c;E&#xff09; 其中 V 表示的是顶点集合 &#xff1a; V { x | x 属于某个数据对象集} 是有穷非空集合 E 叫做边的集合 &#xff1a; E {(x, y) | x, y 属于 V} 或者 …

UE5源码Windows编译、运行

官方文档 Welcome To Unreal Engine 5 Early Access Learn what to expect from the UE5 Early Access program. 链接如下&#xff1a;https://docs.unrealengine.com/5.0/en-US/Welcome/#gettingue5earlyaccessfromgithub Step 0&#xff1a;找到UE5源码 直接先上链接 https…

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …

24年蓝桥杯及攻防世界赛题-MISC-3

21 reverseMe 复制图片&#xff0c;在线ocr识别&#xff0c;https://ocr.wdku.net/&#xff0c;都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/zsteg] └─$ zsteg misc_pic_again.png imagedata … text: “$$KaTeX parse error: Undefined…