虚拟内存【Linux】

虚拟内存

  • 为什么需要虚拟内存
  • Linux虚拟内存的结构
    • 32位系统下的虚拟地址空间
    • 64位系统下的虚拟地址空间
    • 页表
    • 多级页表
    • TLB
  • 流程
  • 虚拟内存的作用

为什么需要虚拟内存

  为了在进行多进程编码进行内存访问的时候保持内存的隔离性,数据安全性,所以出现了虚拟内存。举一个例子:
  如果没有虚拟内存,我们在编码一个程序的时候将数据写在了编号为1000的物理内存上,当我们编码另外一个程序的时候,就需要注意,避免写入或修改上一个程序在编号为1000的物理内存处的数据,当已经有了几百个程序对物理内存进行过读写时,我们在进行内存读写的时候就会变得格外困难(因为需要避免覆写已经有数据的物理内存空间)。
  所以虚拟内存的出现解决了这个问题。

Linux虚拟内存的结构

  每一个进程都会分配一个独立的虚拟内存空间,独立的页表。不同的进程拥有相同结构的虚拟内存空间。分为32位和64位系统的虚拟地址空间。
在这里插入图片描述

32位系统下的虚拟地址空间

在这里插入图片描述
  可以看的出来,内核空间位1G,用户空间为3G。

64位系统下的虚拟地址空间

在这里插入图片描述

  进入内核态的时候使用内核空间,进入用户态的时候使用用户空间,比如使用系统调用的时候就会进入内核态,发生缺页中断也会进入内核态。
  不同进程的内核空间都是统一的,不同进程的用户空间都是独立的。
在这里插入图片描述

页表

  虚拟空间是通过页表,就能通过虚拟地址,得到物理内存上的物理地址,从而进行对物理内存上的读写。
  页表是存储在内核空间的,而内核空间是当操作系统启动的时候就加载到物理内存上的,一般不会进行内存交换。
在这里插入图片描述
  页表可以像上图一样理解,虚拟地址和物理地址一一映射,除了这个,其他的页表项,比如有效位可以分辨该空间是否被使用,读写权限可以保障数据的安全性。

多级页表

  虚拟内存和物理内存一定得是一一对应的,但是如果4Gb的物理内存和虚拟内存都一一映射的话,就会导致页表过于庞大。为了解决这个问题,引入了多级页表。如下图所示:
在这里插入图片描述
  但是如果多个进程都要实现自己的虚拟内存和物理内存一一映射的话,那么就算是多级页表,也会使得存储在内核空间的多进程的页表十分庞大。通过局部性原理我们知道,经常使用访问的数据大部分时候都是集中在那么几块页中,因此我们运行程序的时候不需要将全部程序都加载进内存中,需要时再换入,内存紧张时再换出到磁盘,这就使得每一个进程实际使用的物理内存空间不大,相应的,所需要的页表也就不需要那么多。这带来的好处就是进程使用的内存可以大于实际的物理内存。

TLB

  多级页表在检索的时候也会出现效率低下的问题,并且由于局部性原理,我们可以将一些常访问的页表项存储带I/O效率更快的硬件TLB(也叫做快表)中,这样就可以解决上述问题。

流程

  1. cpu拿到虚拟内存中的虚拟地址。
  2. 通过MMU(内存管理单元)查询TLB中的页表项是否含有该虚拟地址到物理地址的映射,如果有,直接返回,如果没有,MMU则查询页表。
  3. 如果在页表中查询到该虚拟地址到物理地址的映射,则直接返回,如此,cpu就拿到了相应的物理地址,可以进行操作。否则,cpu会触发一个缺页中断,然后操作系统会将磁盘上相应的页加载进物理内存,并且更新页表,将新加载进物理内存的页面进行同虚拟内存的映射。
  4. 然后回到第3步,MMU重新查询页表,此时已经有了映射,cpu成功拿到物理地址。

虚拟内存的作用

  1. 使得进程使用的内存空间大于物理内存实际的空间。
  2. 每个进程拥有独立的虚拟内存,在多进程的情况下,使得进程之间不会访问到除自己内存空间外的地址,解决了多进程地址冲突的问题。
  3. 页表项中还含有一些表明页面属性的项,比如读写权限,有效位,使得我们不可以随意访问一些不可修改的页, 增加了数据的安全性。
  4. 每一个进程都拥有相同的虚拟地址空间,使得我们对于内存管理更加容易了,减少了代码的错误和地址的冲突。

      😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄

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

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

相关文章

Linux | 安装lb-toolkits 1.2.4库

Linux | 安装 lb-toolkits 最近又需要下载葵花的数据,之前分享过一次代码。今天发现之前的环境不小心被我删了,而运行相关的代码需要安装lb-toolkits这个库,今天正好记录了一下安装lb-toolkits的过程。 这里安装的版本是1.2.4,别…

EPSON LQ80KF II驱动 打印机 0x00000003e3

1.添加打印机 2.按名次选择共享打印机,输入共享打印机ip 3.选择创建新端口 4.选择打印机驱动

办公助手推荐✨

办公助手来啦!✨ 办公助手来啦!✨🌟 主要亮点📝 全新PDF编辑器🎨 丰富的幻灯片版式🌍 改进的从右至左显示🌐 新增本地化选项 📊 应用场景在线办公套件📱 多平台支持&…

如何学好C++?

首先,对于零基础的想学习C的同学,我想要你们先明白一件事:C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言,在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…

6.Python学习:异常和日志

1.异常的抓取 1.1异常的概念 使用异常前: print(1/0)使用异常后:错误提示更加友好,不影响程序继续往下运行 try:print(10/0) except ZeroDivisionError:print("0不能作为分母")1.2异常的抓取 第一种:如果提前知道可…

idea集成本地tomcat

由于网课老师使用的是eclipse,但是……本人用的是idea,所以不得不去找教程。 解决方案1: https://blog.csdn.net/weixin_54048131/article/details/131359793 这个地方,路径一定要到这个tomcat 否则不识别: 这里的JRE也要配置一下 新问题&…

ISO/OSI七层模型

ISO:国际标准化/ OSI:开放系统互联 七层协议必背图 1.注意事项: 1.上三层是为用户服务的,下四层负责实际数据传输。 2.下四层的传输单位: 传输层; 数据段(报文) 网络层: 数据包(报…

python-23-零基础自学python open()和replace()函数运用

学习内容:《python编程:从入门到实践》第二版练习10-2 知识点: 打开文件,replace()替换文件内容,open(), 练习内容: 练习10-2:C语言学习笔记 可使用方法replace()将字符串中的特定单词都替换为另一个单…

C++初探究(2)

引用 对于一个常量,想要将其进行引用,则使用普通的引用相当于权限扩大(常量为只读,但此处的引用参数为可读可写),C编译器会报错. 例如: const int a 10;int& ra a;//权限放大&#xff0…

思维+数学,CF 1138B - Circus

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1138B - Circus 二、解题报告 1、思路分析 设第一组会小丑和杂技的人数分别为x1, y1 第二组会小丑和杂技的人数分别为x2, y2 显然根据要求有: x1 y2 > x1 x2 x2 y2 上式说明第二组每…

离线运行Llama3:本地部署终极指南_liama2 本地部署

4月18日,Meta在官方博客官宣了Llama3,标志着人工智能领域迈向了一个重要的飞跃。经过笔者的个人体验,Llama3 8B效果已经超越GPT-3.5,最为重要的是,Llama3是开源的,我们可以自己部署! 本文和大家…

QT入门看这一篇就够(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本,提出了利用低成本的多视角相机进行3D目标检测,以取代昂贵的LiDAR传感器。然而,仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…

游戏AI的创造思路-技术基础-蒙特卡洛树搜索(1)

本篇介绍蒙特卡洛树搜索算法,AlphaGo用于围棋计算的应用就是基于蒙特卡洛树搜索研发的~~~ 目录 1. 定义 2. 发展历史 3. 公式和函数 3.1.算法的公式和函数 3.2. Python实现公式和函数 4. 运行原理 4.1. 运行原理 4.2. 各步骤用Python代码 5. 优缺点和缺陷的…

一文实践强化学习训练游戏ai--doom枪战游戏实践

一文实践强化学习训练游戏ai–doom枪战游戏实践 上次文章写道下载doom的环境并尝试了简单的操作,这次让我们来进行对象化和训练、验证,如果你有基础,可以直接阅读本文,不然请你先阅读Doom基础知识,其中包含了下载、动作…

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完,切分子流程过程数不超25 ,A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…

vb.netcad二开自学笔记8:界面之任务窗格

使用net可以创建一个类似属性面板的自定义的任务窗格,从而实现应用程序更丰富的人机交互。 1、添加一个自定义控件 2、在前面创建的代码框架内增加一个命令函数ShowMyPalette Imports System.Windows.Media.Imaging Imports Autodesk.AutoCAD.ApplicationServices …

解码技术债:AI代码助手与智能体的革新之道

技术债 技术债可能来源于多种原因,比如时间压力、资源限制、技术选型不当等。它可以表现为代码中的临时性修补、未能彻底解决的设计问题、缺乏文档或测试覆盖等。虽然技术债可以帮助快速推进项目进度,但长期来看,它会增加软件维护的成本和风险…

PID控制与模糊PID控制的比较

一、PID控制器的设计 1.PID控制原理图: PID控制其结构框图如下图所示: 图1:PID控制器结构框图 2.PID控制器传递函数的一般表达式 PID控制器传递函数的一般表达形式为: 其中kp为比例增益;ki为积分增益;k…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…