Linux 如何进行内存分配

news2025/7/21 9:37:44

虚拟内存管理回顾

在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:

通过这里可以看出:

  • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;
  • 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

再来说说,内核空间与用户空间的区别:

  • 进程在用户态时,只能访问用户空间内存;
  • 只有进入内核态后,才可以访问内核空间的内存;

虽然每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。

我们看看用户空间分布的情况,以 32 位系统:

通过这张图你可以看到,用户空间内存,从低到高分别是 6 种不同的内存段:

  • 0x0000 0000 到 0x0804 8000 这段虚拟内存地址是一段不可访问的保留区,因为在大多数操作系统中,数值比较小的地址通常被认为不是一个合法的地址,这块小地址是不允许访问的。比如在 C 语言中我们通常会将一些无效的指针设置为 NULL,指向这块不允许访问的地址。
  • 代码段,包括二进制可执行代码;
  • 数据段,包括已初始化的静态常量和全局变量;
  • BSS 段,包括未初始化的静态变量和全局变量;
  • 堆段,包括动态分配的内存,从低地址开始向上增长;
  • 堆空间的上边是一段待分配区域,用于扩展堆空间的使用
  • 文件映射段,包括动态库、共享内存等,从低地址开始向上增长
  • 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

申请内存的两种方式

申请内存空间一般就两种方法,一种是malloc,另一种是 mmap映射空间。 在使用malloc()分配内存的时候,可能系统调用brk(),也可能调用mmap()。

malloc的调用规律

1. 即分配一块小型内存(小于或等于128kb),malloc()会调用brk 函数将 堆顶 指针向高地址移动,获得新的内存空间。

2. 当分配一块大型内存(大于128kb),mmap() 系统调用中「私有匿名映射」的方式,在文件映射区分配一块内存

申请内存过程图

需要注意的是,malloc() 分配的是虚拟内存。

如果分配后的虚拟内存没有被访问的话,虚拟内存是不会映射到物理内存的,这样就不会占用物理内存了。

只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系。

缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。

malloc 申请的内存,free 释放内存会归还给操作系统吗
  • malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用;
  • malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放。

mmap 和 brk 分配内存的区别

mmap 来分配内存的问题

mmap 分配的内存每次释放的时候,都会归还给操作系统,于是每次 mmap 分配的虚拟地址都是缺页状态的,然后在第一次访问该虚拟地址的时候,就会触发缺页中断。

也就是说,频繁通过 mmap 分配的内存话,不仅每次都会发生运行态的切换,还会发生缺页中断(在第一次访问虚拟地址后),这样会导致 CPU 消耗较大。

为了改进这两个问题,malloc 通过 brk() 系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当内存释放的时候,就缓存在内存池中。

等下次在申请内存的时候,就直接从内存池取出对应的内存块就行了,而且可能这个内存块的虚拟地址与物理地址的映射关系还存在,这样不仅减少了系统调用的次数,也减少了缺页中断的次数,这将大大降低 CPU 的消耗。

只使用 brk 来分配内存的问题

前面我们提到通过 brk 从堆空间分配的内存,并不会归还给操作系统,那么我们那考虑这样一个场景。

如果我们连续申请了 10k,20k,30k 这三片内存,如果 10k 和 20k 这两片释放了,变为了空闲内存空间,如果下次申请的内存小于 30k,那么就可以重用这个空闲内存空间。

但是如果下次申请的内存大于 30k,没有可用的空闲内存空间,必须向 OS 申请,实际使用内存继续增大。

因此,随着系统频繁地 malloc 和 free ,尤其对于小块内存,堆内将产生越来越多不可用的碎片,导致“内存泄露”。而这种“泄露”现象使用 valgrind 是无法检测出来的。

所以,malloc 实现中,充分考虑了 brk 和 mmap 行为上的差异及优缺点,默认分配大块内存 (128KB) 才使用 mmap 分配内存空间。

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

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

相关文章

【网络安全 --- MySQL数据库】网络安全MySQL数据库应该掌握的知识,还不收藏开始学习。

四,MySQL 4.1 mysql安装 #centos7默认安装的是MariaDB-5.5.68或者65, #查看版本的指令:[rootweb01 bbs]# rpm -qa| grep mariadb #安装mariadb的最新版,只是更新了软件版本,不会删除之前原有的数据。 #修改yum源的配…

完全掌握Nginx的终极指南:这篇文章让你对Nginx洞悉透彻

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少(一个worker进程只占用10-12M内存),启动极快,高并发能力强,在互联网项目中广泛应用。 上图基本上说明了当下流行的技术架构,其…

软考系统架构设计师考试冲刺攻略

系统架构冲刺攻略 上篇为综合知识,介绍了系统架构设计师应熟练掌握的基本知识,主要包括绪论、计算机系统、信息系统、信息安全技术、软件工程、数据库设计、系统架构设计、系统质量属性与架构评估、软件可靠性、软件架构的演化和维护、未来信息综合技术等…

贪心算法:猫粮兑换最大数量的五香豆

小老鼠存了一些猫粮,他想到猫猫库房兑换最大数量的五香豆。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不…

凉鞋的 Unity 笔记 201. 第三轮循环:引入变量

201. 第三轮循环:引入变量 在这一篇,我们进行第三轮 编辑-测试 循环。 在之前我们编写了 输出 Hello Unity 的脚本,如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class FirstGameObject …

低代码加速软件开发进程

IT 团队依靠笨重的软件开发流程和密集型的手工编码来构建可靠的现代应用程序的时代即将结束。随着新自动化技术的兴起、开发人员的短缺,以及渴望创新的客户和最终用户的需求迅速提高,软件行业被迫寻求替代方法,要求不仅提供服务和产品&#x…

那些你面试必须知道的JS知识点

目录 1、JS数据类型有哪些?2、延迟加载JS有哪些方式?3、 和 有什么不同?4、null和undefined的区别5、JS微任务和宏任务6、作用域考题7、JS对象考题8、JS作用域this指向原型考题9、JS判断变量是不是数组,你能写出哪些方法&#xff…

四、Node Exporter

一、Exporter结束 可以通过一个 metrics 接口为 Prometheus 提供监控指标,最好的方式就是直接在目标应用中集成该接口,但是有的应用并没有内置支持 metrics 接口,比如 linux 系统、mysql、redis、kafka 等应用,这种情况下就可以单…

数字孪生技术如何提高仓储效率?

随着科技的不断演进,数字孪生技术已然成为仓储管理领域的一股强大力量,带来了前所未有的变化和机遇。数字孪生技术的出现,为仓储行业带来了前所未有的智能化和高效化,从仓库布局到库存管理,从人员配备到安全控制&#…

基于马尔可夫随机场的图像去噪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、马尔可夫随机场的基本原理 4.2、基于马尔可夫随机场的图像去噪算法 5.算法完整程序工程 1.算法运行效果图预览 原图: 加入噪声的图像: 滤波后的图像 迭代过程…

人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍,随着人工智能和深度学习技术的飞速发展,文本到视频生成已经成为计算机视觉领域中一个重…

【网络安全】php代码审计-sql注入进阶篇

前言 现在各大网站都在使用waf对网站或者APP的业务流量进行恶意特征识别及防护,,避免网站服务器被恶意入侵。所以我们就需要绕过waf,这篇文章就用代码审计的方式给大家讲解一些sql的绕过技巧。 点击此处即可领取282G网络安全学习籽料 关键…

FlashAttention计算过程梳理

FlashAttention 的速度优化原理是怎样的? 从 FlashAttention 到 PagedAttention, 如何进一步优化 Attention 性能 FlashAttention图解(如何加速Attention) FlashAttention开源代码 Transformer Block运算量解析 在self-attention模块中&#…

【UE】安装下载的插件文件夹到虚幻引擎

比如我淘宝上购买了一个插件文件夹,解压后内容如下: 找到电脑上虚幻引擎(这里以UE5.1为例)的位置,可以看到里面有一个名字为“Plugins”的文件夹 在此文件夹中找到“Marketplace”文件夹 然后将下载的插件文件夹放到“…

智慧远程医疗服务:从零开始搭建互联网医院APP

互联网医院APP作为远程医疗服务的一部分,正在为患者和医生带来更便捷的医疗体验。本文将探讨如何从零开始构建一个互联网医院APP,包括关键步骤、技术要点和挑战。 一、确定项目目标和范围 在开始之前,您需要明确定义您的互联网医院APP的目标…

AI_Neural Network_Note (二)

NN Predict logistic regression 预测的过程其实只是based on 一个简单的逻辑回归logistic regression公式 z dot(w,x) b (x1 * w1 x2 * w2 x3 * w3) b dot(a,b): 向量a和向量b的点积(内积)运算。 点积是两个向量的对应分量相乘,并将…

什么是接口测试,接口测试怎么玩,接口自动化测试怎么玩?

前言 最近在找工作,因为是做纯服务端测试的,所以面试过程中面试官难免会问,怎么设计接口测试用例,怎么做接口自动化测试?会象征性的考一下基本功。 下面就接口测试,或者说服务端测试,梳理一下我…

Spring framework Day19:Spring AOP xml配置示例二

一、开始学习 1、新建项目&#xff0c;结构如下 2、添加 spring 依赖 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework&l…

2023,简历石沉大海?软件测试岗位真的已经饱和了....

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。 另一面企业招人真的…