内存管理

Linux 内存管理 本文详细的介绍了多种内存管理方式,同时详细介绍了Linux下的内存管理方式 阅读详情
一. 采用虚拟内存技术

Linux页表--三级页表



二. 页面分配与回收
    所有的物理页面用包含mem_map_t结构的链表mem_map来描叙,这些结构在系统启动时初始化。每个 mem_map_t描叙了一个物理页面。

    使用free_area数组管理空闲块,实现页面的分配与回收


三. 内存映射
    将映象连接到进程虚拟地址空间的过程称为内存映射。
    映象执行时,可执行映象的内容将被调入进程虚拟地址空间中。可执行映象使用的共享库同样如此。然而可执行文件实际上并没有调入物理内存,而是仅仅连接到进 程的虚拟内存。当程序的其他部分运行时引用到这部分时才把它们从磁盘上调入内存。


    可执行映象映射到进程虚拟地址时将产生一组相应的vm_area_struct数据结构。每个vm_area_struct数据结构表示可执行映象的一部 分:可执行代码、初始化数据(变量)、未初始化数据等等。Linux支持许多标准的虚拟内存操作函数,创建vm_area_struct数据结构时有一组 相应的虚拟内存操作函数与之对应。
    每个进程的虚拟内存用一个mm_struct来表示。它包含当前执行的映象(如BASH)以及指向vm_area_struct 的大量指针。每个vm_area_struct数据结构描叙了虚拟内存的起始与结束位置,进程对此内存区域的存取权限以及一组内存操作函数。这些函数都是 Linux在操纵虚拟内存区域时必须用到的子程序。其中一个负责处理进程试图访问不在当前物理内存中的虚拟内存(通过页面失效)的情况。此函数叫 nopage。它用在Linux试图将可执行映象的页面调入内存时。

四. 请求换页  

    当可执行映象到进程虚拟地址空间的映射完成后,它就可以开始运行了。由于只有很少部分的映象调入内存,所以很快就会发生对不在物理内存中的虚拟内存区域的访问。当进程访问无有效页表入口的虚拟地址时,处理器将向Linux报告一个页面错误。
    页面错误带有失效发生的虚拟地址及引发失效的访存方式。Linux必须找到表示此区域的vm_area_struct结构。对 vm_area_struct数据结构的搜寻速度决定了处理页面错误的效率,而所有vm_area_struct结构是通过一种AVL(Adelson- Velskii and Landis) 树结构连在一起的。如果无法找到vm_area_struct与此失效虚拟地址的对应关系,则系统认为此进程访问了非法虚拟地址。这时Linux将向进程 发送SIGSEGV信号,如果进程没有此信号的处理过程则终止运行。
    如果找到此对应关系,Linux接下来检查引起该页面错误的访存类型。如果进程以非法方式访问内存,比如对不可写区域进行写操作,系统将产生内存错误的信号。

    如果Linux认为页面出错是合法的,那么它需要对这种情况进行处理。

    首先Linux必须区分位于交换文件中的页面和那些位于磁盘上的可执行映象。

    不是所有的vm_area_struct数据结构都有一组虚拟内存操作函数,它们有的甚至没有nopage函数。这是因为 Linux通过分配新的物理页面并为其创建有效的页表入口来修正这次访问。如果这个内存区域存在nopage操作函数,Linux将调用它。

    一般Linux nopage函数被用来处理内存映射可执行映象,同时它使用页面cache将请求的页面调入物理内存中去。

    当请求的页面调入物理内存时,处理器页表也必须更新。更新这些入口必须进行相关硬件操作,特别是处理器使用TLB时。这样当页面失效被处理完毕后,进程将从发生失效虚拟内存访问的位置重新开始运行。

五. Linux页面cache

六. 换出与丢弃页面

八. swap cache

九. 页面的换入




参考文献:
 http://net.pku.edu.cn/~yhf/lyceum/linuxK/
内存管理之内存管理的概念 内存管理之内存管理的概念 为什么进行内存管理 页式管理中每个页表项大小的下限如何决定 多级页表解决了什么问题,带来了什么问题 1. 内存管理的基本原理和要求 1.1 定义 操作系统对内存的划分和动态分配就是内存管理的概念 1.2 内存管理的功能 内存空间的分配和回收:由操作系统完成对主存的分配和回收,对编程人员透明 地址转换:使逻辑地址转换为真实的物理地址 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存 存储保护:保证各道作业在各自的存储空间内运行,互不干扰 1.3 程 阅读详情

相关推荐

裸机内存管理解析

概述 在计算机系统中,变量、中间数据一般存放在系统存储空间中,只有实际使用的时候才将他们从存储空间调入到中央处理器内部进行计算。通常存储空间分为两类:内部存储空间和外部存储空间。对于电脑来讲,内部存储空间就是电脑的内存,外部存储空间就是电脑的硬盘。而对于单片机来讲,内部存储就是 RAM ,随机存储器。外部存储可以理解为 flash ,掉电不丢失。该篇文章的主题,内存管理,主要讨论的是关于 RAM 的管理。 堆、栈和静态区 针对于 Cortex M3 内核的单片机的详细内存分配可以参照笔者的这篇文章 STM3

weixin_42616791的博客 1557

【STM32】内存管理

内存管理,是指软件运行时对MCU内存资源的分配和使用的技术。如何高效、快速的分配,并且在适当的时候释放和回收内存资源**内存使用三部曲:内存申请(分配)内存使用内存释放malloc[用于内存的申请]和free[用于内存的释放]标准的C语言库也提供了mallow函数和free函数来实现动态申请和释放内存。那为啥我们不用C语言库的呢?原因如下:占用大量的代码空间 不适合在资源紧缺的嵌入式系统当中没有线程安全的相关机制运行有不确定性,每次调用这些函数时花费的时间可能都不一样内存碎片化。

m0_73409202的博客 2553

Xen的内存管理

Xen的内存管理机制,系统软件的内存管理机制通常与处理器的体系结构息息相关,X86体系结构中,页表(Page Table)的填充由操作系统完成,而内存管理单元(MMU)在TLB(transaltion lookside buffer)缺失的情况下会自动遍历页表。而某些体系结构中缺失TLB的情况下不会自动遍历页表。本文主要针对半虚拟化的guest OS 系统进行讨论。 X86系列处理器从80286开

修电脑的码农 3138

内存管理笔记九、段页式内存管理

内存管理笔记九、段页式内存管理 引言:在前面几篇笔记中,我们介绍到内存管理的多种方式,包括单道编程下固定加载地址,多道编程下固定分区、非固定分区、分页式内存管理,这些是内存管理模式不断演进的过程,本篇笔记将介绍现今广泛使用的段页式内存管理模式。至此,内存管理模式的演进基本就结束了,后面关于内存管理的笔记,将重在实践实现,包括虚拟内存性能调整、slab分配机制、buddy算法等学习。 一、分...

邓博学习笔记 1466

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

基于face_recognition库实现人脸考勤系统功能。利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备“刷脸打卡”、“新学生注册”等功能。............

lyx4949的博客 6965

三极管共集电极放大电路详解:射极跟随器的原理、计算与应用

三极管放大电路是模拟电子技术的基石,常见组态包括共发射极、共基极和共集电极。其中共集电极电路因输入电阻大、输出电阻小、电压增益接近1的特性,常被用作射极跟随器,在信号缓冲、级间隔离和低阻抗负载驱动等场景中发挥关键作用。其核心价值并非电压放大,而是完成阻抗变换,将高内阻信号源转换为低内阻输出,同时保持信号幅值基本不变。理解其静态工作点计算与动态参数推导(如电压增益、输入输出电阻)是设计实用电路的前提。本文结合12V电源下的具体设计实例和仿真验证,梳理了从电路识别、参数计算到工程实践的完整流程,并指出常见设计误

weixin_29193259的博客 368

【FreeRTOS】内存管理

既分配又释放, heap_4在heap_2的基础上做了一些改进,heap_4合并相邻的空闲内存针对heap_2的缺点,如果我们再想分配120字节的空间,那就是可以的了,因为buf1的100字节和buf2的50字节合并起来了!

weixin_63135906的博客 2258

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

LWIP内存管理

LWIP协议栈中使用了两种主要的内存管理方法,动态内存池和动态内存堆。LwIP 也支持 C 标准库的 malloc() 和 free(),但是容易产生内存碎片,不建议使用,可以在lwipopt.h中配置。

qq_35337506的博客 1560

避开这些坑!DS18B20温度读取不准、时序混乱的5个常见问题与调试方法

本文深入解析DS18B20温度传感器在应用中常见的5个问题,包括温度读取不准、时序混乱等,并提供详细的调试方法。通过硬件设计优化、精准延时实现和数据解析技巧,帮助开发者有效解决温度值跳变、初始化失败等典型问题,提升OneWire协议下的温度测量精度。

weixin_29185493的博客 463

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3121

【Windows内存管理】内存管理

内存管理,外部碎片,内部碎片,缺页中断,页面置换算法

2301_79461609的博客 1397

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

Linux内存管理

Glibc 的 malloc 可以支持多线程,增加了非主分配区(non main arena)支持,主分配区与非主分配区用环形链表进行管理。每一个分配区利用互斥锁(mutex)使线程对于该分配区的访问互斥。每个进程只有一个主分配区,但可能存在多个非主分配区,ptmalloc 根据系统对分配区的争用情况动态增加非主分配区的数量,分配区的数量一旦增加,就不会再减少了。主分配区可以访问进程的 heap 区域和 mmap 映射区域,也就是说主分配区可以使用 sbrk 和 mmap向操作系统申请虚拟内存。

weixin_45673259的博客 1811

WorkBuddy KiCad 实战:国产 AI 搭子不只会写代码,传感器板从零走到可审查

真正可用的 PCB 教程不能承诺“一键打样”。本课把 WorkBuddy 放在需求拆分、文件生成和审查记录的位置,KiCad 负责 ERC、DRC 与制造文件,工程师负责最终判断。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、KiCad 8.0、Python 3.11 与人工审阅组成一条可复现链路。你会从“已确认的接口表、器件库来源、板框与电源方案”出发,得到“KiCad 工程、原理图、初始 BOM、ERC 报告与审查记录”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶

yueyeguzhuo的专栏 216

Vue+OpenLayers7入门到实战目录,OpenLayers7中文文档,OpenLayers7中文手册,OpenLayers7中文教程,OpenLayers7文档pdf

本篇作为《Vue+OpenLayers7入门到实战》所有文章的二合一汇总目录,方便查找。本专栏源码是由OpenLayers7.x版本结合Vue框架编写。本专栏从Vue搭建脚手架到如何引入OpenLayers7依赖的每一步详细新手教程,再到通过各种入门案例和综合性的实战案例,带领大家快速上手Vue+OpenLayers7开发。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 3973

Golang 的内存管理

页堆是内存分配的核心结构体,Go 语言程序会将其作为全局变量存储,而堆上初始化的所有对象都由该结构体统一管理,该结构体中包含两组非常重要的字段,其中一个是全局的中心缓存列表 central,另一个是管理堆区内存区域的 arenas 以及相关字段。微分配器只会用于分配非指针类型的内存,上述三个字段中 tiny 会指向堆中的一片内存,tinyoffset 是下一个空闲内存所在的偏移量,最后的 tinyAllocs 会记录内存分配器中分配的对象个数。Go 的内存分配器会根据申请分配的内存大小选择不同的处理逻辑。

Doublelv 的博客专栏。 2516

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Oracle内存管理

Oracle内存管理

m0_49929446的博客 2739

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MCU上的内存管理

正点原子的内存管理代码malloc.cmalloc.h016553525532401024uint32_tuint16_tuint8_tNULL0使用的是分块式内存管理办法从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为了n 块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。

qq_45885788的博客 889

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spark内存管理

由于同一个Executor的所有的计算任务共享有限的存储内存空间,当有新的 Block 需要缓存但是剩余空间不足且无法动态占用时,就要对LinkedHashMap中的旧Block进行淘汰(Eviction),而被淘汰的Block如果其存储级别中同时包含存储到磁盘的要求,则要对其进行落盘(Drop),否则直接删除该Block。以非序列化的Java对象的方式持久化在JVM内存中。此外,在被Spark标记为释放的对象实例,很有可能在实际上并没有被JVM回收,导致实际可用的内存小于Spark记录的可用内存。

走过冬季 1153

IOS内存管理

1. 栈区(stack):由编译器自动分配释放,函数的参数值,局部变量等值。2. 堆区(heap):一般由开发人员分配释放,若不释放,则可能会引起内存泄漏。Objective-C提供了两种种内存管理方式:(MRC,手动引用计数器),(ARC,自动引用计数)。ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;

风·之痕的博客 8483

PHP说的内存管理就是指的是变量内存管理吗?

【代码】PHP说的内存管理就是指的是变量内存管理吗?

长风破浪会有时的博客 1117

FreeRTOS内存管理

在嵌入式系统中,内存的地址可能并不连续,这种场景下可以使用Heap_5。内存的动态管理是C程序的知识范畴,并不属于FreeRTOS的知识范畴,但是它跟 FreeRTOS关系是如此紧密,所以我们先对其进行了解。新设计中不再推荐使用Heap_2。使用内存的动态管理功能,简化了程序设计:不再需要小心翼翼地提前规划各类对象,简化API 函数的涉及,甚至可以减少内存的使用。跟 Heap_1、Heap_2 一样,Heap_4 也是使用大数组来分配内存。Heap_5 分配内存、释放内存的算法跟 Heap_4 是一样的。

2301_78772787的博客 1107

Go内存管理

Go内存管理

2303_79380171的博客 1609

内存管理是什么,怎么做好内存管理

内存管理是指操作系统用于控制内存资源分配和释放的机制和过程。它确保多个运行中的程序和它们的子系统能够高效、安全地使用内存资源。栈(Stack)管理原因:尽管栈的内存由系统自动管理,但作为程序员需要确保正确地使用局部变量,避免局部变量过大导致栈溢出。堆(Heap)管理原因:堆内存的生命周期不由系统自动管理,需要程序员手动分配和释放。正确管理堆内存可以防止内存泄漏、野指针和堆溢出等问题。

weixin_38834817的博客 1042
上一篇: Linux设备驱动
下一篇: 我的FVWM之路
lphpc
博客等级 码龄22年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值