深入解析:虚拟内存——理解现代计算机内存管理的关键概念

目录

一、引言

二、程序的“搬家”记:从硬盘到内存

1. 把剧本搬上舞台

2. 分配角色和位置

3. 开始排练与演出

三、虚拟内存:理想与现实的桥梁 

1.虚拟内存:运行原理

2. 虚拟内存:让每个程序都有个“私人剧场”

3. 虚拟内存的好处:让程序“傻傻地幸福”

4.虚拟地址空间


一、引言

你是否好奇过,当你点击电脑桌面上的一个图标,那个小小的程序是如何瞬间活跃起来,开始为你工作?这其中,内存扮演着至关重要的角色。今天,我们就来聊聊内存世界里的三个关键概念——虚拟内存、内存壁垒和段错误,它们就像程序执行过程中的“幕后英雄”,虽然低调,却影响着程序的稳定性和效率。我们将用更通俗的语言,带你揭开它们神秘的面纱。

二、程序的“搬家”记:从硬盘到内存

想象一下,你的程序好比一位演员,等待在后台(硬盘)的剧本里,等待被召唤到舞台(内存)上表演。当你要运行一个程序时,操作系统这位导演就开始忙碌起来:

1. 把剧本搬上舞台

  • 剧本加载:操作系统先跑到硬盘上找到程序的“剧本”(也就是可执行文件),把它从硬盘搬到内存里。这个过程就像把剧本一页页复印到舞台的大屏幕上,让演员能随时看到自己的台词。

  • 演员集合:如果程序依赖其他“演员”(静态链接的库文件),导演也会把他们请到舞台上,确保所有角色齐全,可以顺利开演。

2. 分配角色和位置

  • 角色定位:每个演员(程序指令和数据)都有自己的“台词本”(虚拟地址)。导演要根据舞台的实际布局(物理内存),给每个演员安排确切的位置。这就是所谓的“地址重定位”。

  • 舞台布局:导演还要为整个剧组规划一个虚拟的“舞台平面图”(虚拟地址空间),并用“秘密地图”(页表)告诉演员们如何从虚拟位置找到实际位置。这样,演员们就可以在舞台上自由活动,而无需关心复杂的舞台布置细节。

3. 开始排练与演出

  • 排练道具:演员在表演过程中可能需要临时找一些道具(动态分配的内存),导演就在舞台一侧的仓库(堆)里给他们准备。用完后,道具会被放回仓库,供其他演员使用。

  • 上下场通道:演员们进出舞台也有专门的通道(栈)。每场戏开始时,新演员从通道进入,旧演员从通道离开。通道会自动调整大小,确保进出有序。

  • 正式演出:一切准备就绪,指挥者(CPU)按照剧本(内存中的指令)开始表演。他们一边看大屏幕(内存)上的台词,一边与其他演员互动,呈现出精彩的演出。

三、虚拟内存:理想与现实的桥梁 

1.虚拟内存:运行原理

可执行文件这位“剧本作家”先将自己的作品小心翼翼地保存到磁盘上,静静地等待被“导演”(操作系统)选中。当导演决定上演这部戏时,剧本就会被快速地读取到内存条上。请注意,这些剧本页并不一定按照原本的顺序整齐排列,而是可以分散存放,就像演员们在后台各自找位置准备上台一样。

中央处理器(CPU)就像一位严厉的指挥家,按照剧本(内存中的指令)精确地指导演员们(数据)从头到尾完成整场演出。你可能会问,为什么不能直接从磁盘上指挥呢?那是因为磁盘这位“剧本保管员”虽然忠于职守,但翻阅剧本的速度实在慢得让人着急(磁介质不像内存那样用电来传递信息)。

现实生活中,剧场往往热闹非凡,一台戏接着一台戏,演员们络绎不绝。当有很多应用程序(戏班子)轮番登场时,内存这位“舞台经理”可得精打细算。它会把暂时没戏份的演员(空闲程序)暂时送回后台(磁盘),为即将登台的新戏腾出空间。这样一来,数据和指令就在内存与磁盘之间不停地“换乘”,忙得不亦乐乎。

这就解释了为什么有时候你正在酣畅淋漓地玩游戏,突然想打开某个应用程序,却发现它加载得特别慢。其实,这是因为那个程序的“演员阵容”还在磁盘那边排队等候,好不容易才搭上通往内存舞台的“班车”。

为了应对这种情况,剧场特意设立了一个临时休息室。当内存实在挤不下时,它可以暂时代替内存接待那些从磁盘过来、还没来得及上台的演员们。虽然条件简陋些,总比在门外风吹日晒强多了。有了这个缓冲地带,尽管磁盘读写速度慢,但至少能让等待的演员有个落脚之处,不至于耽误整场演出的进度。而这里的休息区就是交换分区,Windows系统里称为虚拟内存),从内存到磁盘,叫页面换出,磁盘到内存,页面换入

2. 虚拟内存:让每个程序都有个“私人剧场”

虚拟内存就像是为每个程序打造了一个专属的“私人剧场”。在这个剧场里,每个程序都可以拥有一个看似无限大的、完全属于自己的舞台(虚拟地址空间)。每个演员(指令和数据)都有固定的“座位号”(虚拟地址)。(比如声明和定义一个int a =1;输出&a会得到一个地址,此时这个地址并不是真实的内存条上的物理地址,而是上面说的虚拟地址,但是这个虚拟地址和物理地址之间有一定的对应关系能关联上,关联的内存会一一对应的存在一个表中,这个表就叫内存映射表),注意:

int a = 5;
int* p = &a;

上面的代码中我们定义了一个a和地址p,如果我们做如下操作

*p = 10;

即更改指针p指向的变量的值,当程序试图访问(读写)通过指针 p 指向的内存时,CPU会将虚拟地址提交给内存管理单元(MMU)。MMU 使用内存映射表(如页表)将虚拟地址转换为对应的物理地址,然后更改这个地址上面的值为10.但是如果使用

p++;
*p = 20;

这里会出现段错误,核心以转储。 因为这样的操作产生的虚拟地址在映射表中没有对应的物理地址,(正确使用p++一般是,p记录一个数组的首个元素的地址,而数组的地址是连续的。)

3. 虚拟内存的好处:让程序“傻傻地幸福”

  • 防止“串戏”:每个“私人剧场”之间有看不见的墙,防止一个剧团误闯入另一个剧团,保证了各自表演的独立性,避免数据混乱。

  • 共享“经典片段”:如果有多个剧团想表演相同的“经典片段”(共享库或数据),导演只需要把这些片段投影到每个剧场,大家就能同时看到,既省时又省力。

  • 灵活调整“舞台布局”:如果剧场不够大,导演可以把暂时不用的部分“剧本”(内存页)暂时存放到后台(硬盘),待需要时再调回舞台,这样小剧场也能演出“大制作”。

4.虚拟地址空间

虚拟地址空间是操作系统为每个进程构建的一片独立、连续且庞大的内存视界。它是程序与硬件内存之间的一层抽象(程序加载到内存之后,给出的虚拟地址的范围),通过以下特性为程序提供了一个理想的工作环境:

布局图:

 

以32位的系统举例,从下往上就是从0*00000000 到0*ffffffff,这是系统会划分的虚拟内存地址的范围。

逻辑连续性:每个进程看到的是一段从零开始、向上延伸的连续地址空间,尽管实际物理内存可能并非如此。这种逻辑连续性简化了程序的编写与理解,程序员无需关心物理内存的具体分布和碎片化问题。

空间隔离:每个进程的虚拟地址空间相互独立,一个进程无法直接访问另一个进程的地址空间。这种隔离机制确保了进程间的安全性,防止恶意或错误的程序篡改其他进程或系统数据。

大小可扩展:虚拟地址空间的大小通常远大于物理内存,如32位系统的4GB虚拟空间与64位系统的近乎无限大的空间。即使物理内存不足,通过虚拟内存与交换分区的配合,程序仍能使用超出物理内存限制的内存,实现“大制作”的演出。

动态映射:虚拟地址通过页表(“秘密地图”)动态映射到物理内存。操作系统可以根据需要调整映射关系,如在内存紧张时换出部分内存页到硬盘,或在进程需要时重新加载内存页。这种动态性使得内存资源得以高效利用。

权限控制:虚拟地址空间支持设置不同区域(如代码段、数据段、堆、栈)的访问权限(读、写、执行),防止程序错误或恶意行为破坏重要数据或执行非法指令

五、结语

虚拟内存与内存管理,这两个概念共同构成了程序执行背后的故事。理解它们,就如同掌握了剧本创作、舞台调度与后勤保障的艺术。在编程的世界里,做个懂行的“观众”,不仅能欣赏到精彩的“演出”,还能在遇到问题时,迅速找出症结,让程序重回正轨。不断探索内存管理的奥秘,将使你在软件开发的道路上更加游刃有余。

 

 

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

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

相关文章

多态【C/C++复习版】

目录 一、多态是什么?如何实现? 二、 什么是重写?有什么特点? 三、什么是协变? 四、析构函数能实现多态吗?为什么要实现? 五、override和final的作用是什么? 六、 多态的原理是…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开…

数据可视化-ECharts Html项目实战(10)

在之前的文章中,我们学习了如何在ECharts中编写雷达图,实现特殊效果的插入运用,函数的插入,以及多图表雷达图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错&…

vue快速入门(十九)使用动态类绑定实现TabBar动态样式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 vue绑定动态样式根据点击事件获取当前点击部分序号 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…

spring快速搭建聊天AI

官网url: https://spring.io/projects/spring-ai 本文演示的是open AI 1创建java项目 2.拿到AI的key&#xff08;没有的话可以去淘宝花几块钱买一个&#xff09; //YOUR_API_KEY写你自己的open AI的key spring.ai.openai.api-keyYOUR_API_KEY spring.ai.openai.chat.options.…

STM32之FreeRTOS移植

1.FreeRTOS的移植过程是将系统需要的文件和代码进行移植和裁剪&#xff0c;其移植的主要过程为&#xff1a; &#xff08;1&#xff09;官网上下载FreeRTOS源码&#xff1a;https://www.freertos.org/ &#xff08;2&#xff09;移植文件夹&#xff0c;在portable文件夹中只需…

Github 2024-04-09 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Vue项目1JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

【通信原理笔记】【三】模拟信号调制——3.6 角度调制的抗噪声性能

文章目录 前言一、FM的解调二、FM的输出信噪比总结 前言 这一节内容介绍的是FM信号的抗噪声性能&#xff0c;与之前学的幅度调制不同&#xff0c;角度调制系统是非线性的&#xff0c;其信噪比的推导计算很多地方添加了假设&#xff0c;最后得到一个估计值。当初我学这部分内容…

C#如何用NPOI创建、读取、更新Excel文件

一.获取引用NPOI VS2017&#xff0c;通过Nuget工具包下载NPOI到指定的项目中&#xff0c;如下 二.添加如下命名空间,其中HSSF是操作*.xls文件&#xff0c;XSSF操作*.xlsx文件. using NPOI; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; …

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

linux进阶篇:下载工具wget的安装以及应用

1 wget工具介绍 wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。 wget支持HTTP&#xff0c;HTTPS和FTP协议&#xff0c;可以使用HTTP代理。所谓的自动下载是指&a…