内存那点事:让我们一点点的搞懂它

news2024/9/21 8:03:04

内存是计算机系统中至关重要的组成部分,它不仅储存了运行中的程序和数据,还直接关系到系统的性能和稳定性。让我们一起深入探讨Linux系统下内存管理的核心原理,揭开它的神秘面纱。

基础概念

物理地址
  • 概念:物理地址是指计算机内存中实际的硬件地址,它对应着计算机中的物理存储单元(如RAM),物理地址是唯一的。内存的一个地址的容量是一个字节(Byte)
  • 特点: 物理地址是唯一的,每个物理存储单元都有一个对应的物理地址。
虚拟地址
  • 概念:虚拟地址是在程序执行过程中由操作系统提供的地址空间,它不直接对应物理硬件,而是经过虚拟内存系统的映射,最终映射到物理地址上。每个运行的进程都有自己的虚拟地址空间,这使得每个进程认为它拥有整个系统的内存。
  • 特点: 虚拟地址具有抽象性,它使得程序无需关心实际的硬件细节,而是可以使用一个相对于程序自身的地址空间。
内存布局
  • 32位操作系统:支持32位的地址空间,最多可以寻址2^32个地址,即4GB的内存。
  • 64位操作系统: 支持64位的地址空间,最多可以寻址的地址数量为2^64,即128TB。
  • 不同位宽的操作系统地址空间的范围也不同,下面的两张图来分别表示它们的虚拟地址空间:
  • 每个进程的虚拟内存空间都包括用户空间和内核空间,每个进程都认为它拥有整个系统的内存资源。
  • 每个进程的内核空间,其实关联的都是相同的物理内存(公用的)。

内存映射

既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,内存分配的机制是通过内存映射来管理的,内存映射支持按段分配和按页分配。

按段分配

分段是比较早提出的,它将整个物理内存划分为若干个不同用途的段,每个段用于存放特定类型的数据,这些逻辑分段包括只读段、数据段、堆段、栈段组成。

  • 只读段:包括代码和常量等。
  • 数据段:包括全局变量等。
  • 堆段:包括动态分配的内存,从低地址开始向上增长。
  • 文件映射段: 包括动态库、共享内存等,从高地址开始向下增长。
  • 栈段:包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB

存在的问题:
  • 外部内存碎片:因为分段机制分配的是连续的内存空间,假设有 1G 的物理内存,A程序占用了512MB,B程序占用了128MB,C程序占用了256MB,空闲128MB,B程序关闭了,因为内存不连续,导致没有足够空间在打开一个200MB的程序,就会交换到磁盘,从磁盘换入、唤出效率低下(多个不连续的物理内存空间)。
  • 复杂性: 程序员需要管理多个内存段,增加了编程的复杂性。
  • 不同段的交叉访问: 由于段之间的独立性,跨越多个段的访问会更加复杂。
按页分配
  • 将物理内存和虚拟内存划分为固定大小的页(通常为4KB)
  • 操作系统维护一个页表,将虚拟内存的页映射到物理内存的页上。
  • 页表(快速、高效)。
  • MMU:页表实际上存储在 CPU 的内存管理单元 MMU 中。
  • TLB 是MMU 中页表的高速缓存,加速虚拟地址到物理地址的转换,减少对主存(RAM)的访问次数,提高系统性能。
  • 多级页表:页的大小是4K,随着内存的增大,页表记录会特别多,为了解决页表项过多的问题,Linux 提供了两种机制,也就是多级页表和大页(HugePage)。

优点
  • 消除外部碎片: 由于页是固定大小的,减少了外部碎片的产生。
  • 简化内存管理: 操作系统负责页的映射,程序员无需关心具体的内存分配和释放。
  • 更好的内存共享: 易于实现页面的共享,不同进程可以共享相同的页。

内存分配与回收

内存分配

进程可以通过调用malloc等函数在堆上动态分配内存。这些内存块的管理由C库提供,但最终涉及到系统调用,如brk和mmap

brk
  • 作用:用于调整进程的数据段的结束地址,即扩展或缩小堆的大小。
  • 操作对象:操作的是堆空间,对整个数据段的结束地址进行调整。
  • 分配粒度:分配的内存是以页为单位的,较大的内存请求可能会导致内部碎片。
  • 适用场景:适用于较小的内存分配,比如动态内存分配。
mmap
  • 作用:用于在进程的地址空间中映射文件或匿名内存区域。
  • 操作对象:可以操作文件映射,也可以用于匿名内存映射,即映射到无关联文件的内存。
  • 分配粒度:可以以页为单位进行内存分配,也支持更细粒度的映射。
  • 适用场景:适用于大块的内存分配,比如映射大文件、共享内存、内存映射 I/O 等。
内存回收
  • 手动回收:调用 free() 或 unmap() 来释放这些不用的内存。
  • 自动回收(内存紧张时系统触发)。
  • 回收缓存:比如使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面。
  • 回收不常访问的内存:把不常用的内存通过交换分区直接写到磁盘中(Swap)。
  • 杀死进程:内存紧张时系统还会通过OOM(Out of Memory)直接杀掉占用大量内存的进程。
  • 一个进程消耗的内存越大,oom_score 就越大。
  • 一个进程运行占用的 CPU 越多,oom_score 就越小。
# oom_adj 的范围是 [-17, 15],数值越大,表示进程越容易被 OOM 杀死
# -17 表示禁止 OOM
echo -16 > /proc/$(pidof sshd)/oom_adj

结束语

今天我们从概念开始,一点点的展开讲了关于内存映射的两种内存分配机制,以及特点,讲了内存分配和回收,留下几个问题,系统大家一起讨论学习:

  • 按页分配下会存在内存碎片吗?为什么?
  • Linux 操作系统采用了哪种方式来管理内存呢?

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

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

相关文章

一个关于自动化工具的操作手册

整体 整个软件由首页、设计页构成 首页 按钮功能 清除缓存:主要为了避免线程占用的问题,端口占用无法重新执行。所以操作执行任务、修改任务、新建任务没有响应时,可以操作该事件新建任务:顾名思义就是创建一个网页自动化任务执…

世界上真的存在比苹果品质还好的笔记本电脑吗?

苹果笔记本电脑的品质一直是业界标杆,但它真的是最好的吗?答案是肯定的,但也要看你怎么定义“好”。为什么mac那么贵,还有很多人买?探索高性能的Mac系列,包括 MacBook Pro、Mac Studio和Mac Pro&#xff0c…

后台管理系统: spu管理模块

spu管理模块业务 spu 可以理解为类 例如 people类【spu】 sku可以理解为实例 例如&#xff1a;小明 18 男 spu跟sku可以理解为类跟多个实例的关系 spu管理模块静态 <template><div><el-card style"margin: 20px 0px"><CategorySelect get…

视频剪辑技巧:一键批量制作画中画视频的方法,高效提升剪辑任务

在数字媒体时代&#xff0c;视频剪辑已成为一项重要的技能。无论是专业的影视制作&#xff0c;还是日常的社交媒体分享&#xff0c;掌握视频剪辑技巧都能为内容增色不少。下面来看云炫AI智剪如何高效的剪辑视频技巧&#xff1a;一键批量制作画中画视频的方法&#xff0c;帮助您…

【日常聊聊】边缘计算的挑战和机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一&#xff1a;数据安全与隐私保护 二&#xff1a;网络稳定性与可靠性 三&#xff1a;实时性与性能优…

SpringCloud-高级篇(十四)

缓存的作用是其实就是为了减轻对数据库的压力&#xff0c;缩短服务响应的时间&#xff0c;从而提高整个服务的并发能力&#xff0c;Redis单节点并发其实已经很高了&#xff0c;但是它依然有自己的上限&#xff0c;随着互联网的发展&#xff0c;用户低量越来越大&#xff0c;想淘…

list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五步…

C++ STL容器详解

string容器 string的基本概念 本质 string是C风格的字符串&#xff0c;而string本质上是一个类 string与char* 的区别 char * 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 string的构造函数 构造函…

数据库性能优化的解决方案

目录​​​​​​​ 1、什么是数据库性能优化 1.1 数据库性能优化的概念 1.2 为何需要进行数据库性能优化 1.3 数据库性能优化的好处 2、数据库性能优化的基本原理 2.1 数据库查询优化 2.2 数据库索引优化 2.3 数据库表结构优化 2.4 数据库硬件优化 3、数据库查询优化…

机床导轨误差对机械加工品质的影响

机床导轨是确定机床各部件相对位置关系的基准&#xff0c;也是相对运动的基准&#xff0c;其精度直接决定了机械加工产品的精度&#xff0c;机床导轨要确保精准,才能保证机械加工产品的良好&#xff0c;否则&#xff0c;会影响加工品质&#xff0c;主要体现在以下几方面&#x…

力扣刷MySQL-第六弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

C++——函数的定义

1&#xff0c;概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff0c;返回…

C++ 学习系列 -- std::function 与 std::bind

一 std::function 与 std::bind 的介绍 1. std::function std::function 是 c 11 的新特性 &#xff0c;包含在头文件<functional>中&#xff0c;为了更方便的调用函数而引入。 std::function 是一个函数包装器&#xff08;function wrapper&#xff09;&#xff0c;…

英国金融时报关注TRX登陆Mercado Bitcoin交易所:波场TRON强化南美洲布局,国际化进程持续加速

近日,波场TRON网络原生代币TRX正式上线巴西最大的合规加密交易所Mercado Bitcoin。英国金融时报、Decrypt、Blockworks等财经及加密行业权威媒体对该话题进行了报道,表示此次合作是波场TRON全球业务增长的有力证明,也表明该平台力求处于数字经济前沿的坚定决心。 据悉,Mercado…

小白快速上手maven【基础篇】

Maven的概念和作用 Maven是什么&#xff1f;POM的概念 Maven的作用&#xff1f; 提供自动化构建项目的方式&#xff0c;并且统一了项目的结构管理项目中的依赖 Maven基础概念-仓库&#xff0c;坐标&#xff0c;仓库配置 仓库&#xff1a;用于存储各种jar包资源 根据功能的不…

【微信小程序开发】环境介绍和基本使用

文章目录 前言1. 项目的基本组成结构1.1 JSON 配置文件的作用1.2 如何新建小程序页面1.3 修改项目首页1.4 WXML 模板1.5 WXSS 样式1.6 JS 逻辑交互 2. 宿主环境2.1 什么是宿主环境2.2 通信模型2.3 运行机制2.4 组件2.4.1 view 组件的基本使用&#xff1a;2.4.2 scroll-view 组件…

专业137总分439东南大学920专业基础综合考研经验电子信息与通信电路系统芯片

我本科是南京信息工程大学&#xff0c;今年报考东南大学信息学院&#xff0c;成功逆袭&#xff0c;专业137&#xff0c;政治69&#xff0c;英语86&#xff0c;数一147&#xff0c;总分439。以下总结了自己的复习心得和经验&#xff0c;希望对大家复习有一点帮助。啰嗦一句&…

OpenAI CEO称“AGI时代”即将来临,下一个风口或为能源领域

原创 | 文 BFT机器人 在最近的达沃斯论坛上&#xff0c;Sam Altman以其深邃的见解和前瞻性的思考&#xff0c;再次成为了全场关注的焦点。他以一场激情四溢的演讲&#xff0c;深入剖析了人工智能技术的未来发展趋势&#xff0c;以及它可能对社会和工作领域产生的深远影响。 Al…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

JAVAEE初阶 封装与分用

封装和分用 一.封装1.1 应用层1.2 传输层1.3 网络层1.4 数据链路层1.5 物理层 二.分用2.1 物理层2.2 数据链路层2.3 网络层2.4 传输层2.5 应用层 三. 交换机的封装分用四.路由器的封装分用五. 网络中数据传输的单位 在讲解封装与分用前&#xff0c;我们需要先说明一个例子。 例…