内存管理框架 --- 基础知识

文章目录

  • 一、内存管理
    • 1.1 内存管理的出现
    • 1.2 内存管理的用途
      • 1.2.1 虚拟内存和物理内存的定义
        • 1.2.1.1 什么是虚拟内存?
      • 1.2.2 虚拟内存的划分:用户空间与内核空间
    • 1.3 操作系统和MMU
      • 1.3.1 OS和MMU的关系
      • 1.3.2 虚拟地址到物理地址的映射流程
    • 1.4 物理内存管理基础概念

一、内存管理

1.1 内存管理的出现

  • 早期的计算机,程序是直接运行在物理内存上。也就是程序在运行的过程中,直接访问的是物理地址。
  • 如果这个系统只运行一个程序,只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,也就不需要考虑内存管理,反正就一个程序,就这么点内存,够不够用就是自己的事了。
  • 现在的系统都是支持多任务,多进程的,这样CPU以及其他硬件的利用率会更高。这个时候就要考虑到将系统内有限的物理内存如何及时有效的分配给多个程序了,这个事情就称之为内存管理

1.2 内存管理的用途

内存管理是Linux内核通过软硬件协作来管理内存的分配及回收的一种方法。
在Linux系统上电自检(POST,Power-On-Self-Test)阶段使用临时内存,而系统启动后,正常运行阶段的内存使用又有两大类:
(1)固定的内存分配,是永久的不变的,主要给内核代码及数据使用;
(2)动态内存分配,主要源于进程的创建和空间的扩张。本文主要针对操作系统正常运行时对动态内存的管理。

1.2.1 虚拟内存和物理内存的定义

1.2.1.1 什么是虚拟内存?

  • 虚拟内存是操作系统发展史上一个重要的里程碑,虚拟内存的使用,避免程序直接和主存(物理内存)打交道,并且对缓存、主存和磁盘做了统一抽象,这样程序就可以突破物理内存的大小限制,当然程序还是要受制于虚拟内存的大小限制的。

  • 程序中看到的内存地址是虚拟内存地址,程序读写内存时会被映射到实际的物理内存中,这个映射工作是由MMU(内存管理单元)来完成,MMU接收CPU发出的虚拟地址,将其转换为物理地址后,发送给内存,内存按照该物理地址进行相应访问后读出或写入相关数据。

1.2.2 虚拟内存的划分:用户空间与内核空间

从Linux操作系统层次上,可将Linux虚拟内存划分为: 用户空间内存和内核空间内存。
虚拟内存的大小取决于处理器体系结构的字长。32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致。因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET大小为 0xC0000000 (=3G)。但是Linux内核并没有把整个1G空间用于线性映射,而只映射了最多896M物理内存,预留了最高端的128M虚拟地址空间给IO设备和其他用途。

1.3 操作系统和MMU

实际上MMU是为满足操作系统越来越复杂的内存管理而产生的。

1.3.1 OS和MMU的关系

  • 系统初始化代码会在内存中生成页表,然后把页表地址设置给MMU对应寄存器,使MMU知道页表在物理内存中的什么位置,以便在需要时进行查找。之后通过专用指令启动MMU,以此为分界,之后程序中所有内存地址都变成虚地址,MMU硬件开始自动完成查表和虚实地址转换。
  • OS初始化后期,创建第一个用户进程,这个过程中也需要创建页表,把其地址赋给进程结构体中某指针成员变量。即每个进程都要有独立的页表。
  • 用户创建新进程时,子进程拷贝一份父进程的页表,之后随着程序运行,页表内容逐渐更新变化。

1.3.2 虚拟地址到物理地址的映射流程

VA到PA的映射过程:MMU得到VA后先在TLB内查找,若没找到匹配的PTE条目就到外部页表查询,并置换进TLB;根据PTE条目中对访问权限的限定检查该条VA指令是否符合,若不符合则不继续,并抛出exception异常;符合后根据VA的地址分段查询页表,保持offset(广义)不变,组合出物理地址,发送出去。
在这个过程中,软件的工作核心就是生成和配置页表。

1.4 物理内存管理基础概念

Linux为了用统一的代码获得最大的兼容性,引入了以下物理内存管理概念:

  • 物理内存结点(node)
  • 物理内存区域(Zone)
  • 物理内存页框(page Frame)

只有年轻的将士才会悔恨过去,熟练的将军都是在深夜里擦亮剑,准备下一场战斗。

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

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

相关文章

Unity 类Scene窗口相机控制

类Scene窗口相机控制 🍔效果 🍔效果 传送门👈

【网络基础实战之路】基于三层架构实现一个企业内网搭建的实战详解

系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…

oracle 12c怎样修改varchar2允许的最大长度

12C单实例测试,varchar2在早期版本中最大长度限制为4000,当字段长度指定的比较长的时候会报错:ORA-00910: specified length too long for its datatype。 早期版本中虽然SQL数据类型限制为4000(如表中的列的varchar2类型&#x…

spring cloud gateway中出现503

spring cloud gateway中出现503 当搭建网关模块的时候出现503的错误的最大的可能就是没有设置负载均衡的依赖包 原先搭建的时候采用的是下面的方式进行设置的 gateway:discovery:locator:enabled: true #可以从nacos进行服务的发现 上面的这种方式可以直接进行注册和发现&…

机器学习实战14-在日本福岛核电站排放污水的背景下,核电站对人口影响的分析实践

大家好,我是微学AI,今天给大家介绍一下机器学习实战14-在日本福岛核电站排放污水的背景下,核电站对人口影响的分析实践。 近日,日本政府举行内阁成员会议,决定于2023年8月24日启动福岛核污染水排海。当地时间2023年8月24日13时&am…

带你了解Python的重要性,就算做测试也要会Python(文末送书)

名字:阿玥的小东东 学习:Python、C/C++ 主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主 目录 人生苦短,我用 Python 在测试工作中用好 Python

若依上传文件及后端解析

1.前端设计导入 <!-- 用户导入对话框 --><el-dialog :title"upload.title" :visible.sync"upload.open" width"400px" append-to-body><el-upload ref"upload" :limit"1" accept".xlsx, .xls" :he…

JAVA中如何知道某项目使用什么数据库类型

文章目录 1. 前言2. 先说结论3. 代码案例 1. 前言 最近在写第三方工具的时候&#xff0c;需要判断使用方项目具体使用了什么数据库类型&#xff0c;从而进行不一样的实现逻辑。当然可以让用户在YML中配置说明项目用什么数据库&#xff0c;但用户不一定填写正确。因此需要想其他…

【C语言】操作符大全(保姆级介绍)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将详细介绍各种操作符的功能。 目录&#xff1a; &#x1f4d8; 前言① 算术操作符②移位操作符③位操作符④赋值操…

go-基础-1-变量-记录

go 变量 变量定义 var 变量名 变量类型 变量赋值 var 变量名 变量类型 变量值 变量名 : 变量值 package mainimport "fmt"func main() {var name string "chang"fmt.Println(name) }package mainfunc main() {var (name stringage intsex string…

深度思考线程池面经之二:jdk线程池设计答疑

2 疑问 2.1 这里的“只有当线程池是无界的或者可以拒绝任务时&#xff0c;该队列才有实际价值”&#xff0c;为什么这么说 SynchronousQueue是一种特殊的队列&#xff0c;它不保留任务&#xff0c;而是直接将任务移交给工作线程。这种队列适合于执行大量生命周期非常短的异步…

基于微信小程序的宠物领养平台的设计与实现(Java+spring boot+微信小程序+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的宠物领养平台的设计与实现&#xff08;Javaspring boot微信小程序MySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java…

RT-Thread 线程管理(学习一)

RT-Thread是支持多任务的操作系统&#xff0c;多任务通过多线程的方式实现。线程是任务的载体&#xff0c;也是RTT中最基本的调度单位。 线程执行时的运行环境称为上下文&#xff0c;具体来说就是各个变量和数据&#xff0c;包括所有的寄存器变量、堆栈、内存信息等。 特点 …

局部代码重复执行

给定一个长度为 n 的序列 a &#xff0c;请你构造一个序列 b &#xff0c;序列 b 满足以下条件: 1.序列 b 的长度为 n 2.对于任意 i ∈[1, n]&#xff0c;满足 ( ai bi ) mod i 0 3.对于任意i ∈[1, n]&#xff0c;满足 1 ≤bi ≤10^9 4.对于任意1≤i<j≤n&#xff0c;满足…

【Qt学习】04:QDialog

QDialog OVERVIEW QDialog一、自定义对话框1.模态对话框2.非模态对话框3.练习代码 二、标准对话框1.消息对话框2.文件对话框3.颜色对话框4.字体对话框 对话框是 GUI 程序中不可或缺的组成部分&#xff0c;对话框通常会是一个顶层窗口出现在程序最上层&#xff0c;用于实现短期任…

在大规模推荐系统中整合 ML 模型的经验教训

一、说明 在这篇博文中&#xff0c;我们分享了将 Netflix 大规模搜索和推荐系统的多个相关机器学习模型整合到一个统一模型中的系统设计经验。给定不同的推荐用例&#xff0c;许多推荐系统将每个用例视为单独的机器学习任务&#xff0c;并为每个任务训练定制的 ML 模型。相比之…

python进阶之图像编程 pillow扩展库

一、概述 1.1pillow简介 Python Imaging Library (PIL)是python 下的图像处理模块,支持多种格式&#xff0c;并提供强大的图像处理功能&#xff0c;可以通过pip进行安装后使用。 1.2pillow具体应用 Pillow 库是 Python3 最常用的图像处理库&#xff0c;它支持多种图像格式&a…

npm script命令

1 串行/并行执行命令 //串行 npm-run-all text test npm run text && npm run test //并行改成& npm-run-all --parallel text test npm run text & npm run test2 传递参数 {"lint": "eslint js/*.js","lint:fix"&#xff1a…

VBA Excel自定义函数的使用 简单的语法

一个简单的教程&#xff0c;实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义&#xff0c;则认为是一块区域&#xff1b; 反之&#xff0c;如FindChar1 As String&#xff0c;则认为是输入的单值。 循环和分支如下例子&#xff0c;VB比较接近自然语…

第9章 【C语言】用户自己建立数据类型

9.1 定义和使用结构体变量 9.1.1 自己建立结构体类型 变量大多数是互相独立的、无内在联系的。C语言允许用户建立由不同类型数据组成的组合型的数据结构&#xff0c;它称为结构体。 在程序中可以自己建立一个结构体类型&#xff1a; struct Student{int num; //学号为整…