为什么要有虚拟内存?

这篇具有很好参考价值的文章主要介绍了为什么要有虚拟内存?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是虚拟内存?

多个进程如果同时操作真实的地址内存的话,会产生冲突。 于是操作系统就提供了一种机制,让每个进程都仿佛拥有全部的内存地址,这些内存地址是虚拟的,由操作系统提供统一的方式映射到真实的物理地址。

虚拟内存的作用:

  • 进程隔离,进程层面不用考虑内存的问题,操作系统会统一包办
  • 灵活的内存管理,操作系统能够更加灵活的管理和分配资源
  • 地址空间扩展
  • 内存保护,防止进程访问未分配给它的内存空间,通过在虚拟地址空间中标记页的访问权限,操作系统可以捕捉到地址越界

操作系统是通过内存分段和内存分页的方式管理虚拟内存地址和物理内存地址之间的关系

内存分段

程序是由若干个逻辑分段组成的,代码分段、数据分段、栈段、堆段组成,不同的段有不同的属性,所以就用分段的形式分离开。

分段机制下的虚拟内存由两部分组成,段选择因子段内偏移量。段选择因子里面有段号,段号是段表的索引,段表是一个表,里面保存的有该段的基地址、段的界限和特权等级。段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

分段机制会把程序的虚拟地址分为4个段,每个段在段表中有一个项,在这一个项找到段的基地址,然后加上偏移量,就能找到在物理内存中的地址。

每个段的长度是不一样的,而且每个段内部都是从0开始编制的。 每个段内部是连续分配内存,但是段和段之间是离散分配的。

为什么要有虚拟内存?,操作系统,数据库

 分段的方式解决了程序员不需要关心具体的物理地址内存的问题,但是有一些不足之处:

  • 存在内存碎片(外部碎片),可以通过内存交换的方式解决
  • 内存交换的效率低,把内存写到硬盘上面太慢了

分段的好处是:

  • 能产生连续的内存空间

 内存分页

内存分页是为了减少内存碎片、加快内存交换的方式。

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。每个页的大小是4k。 虚拟地址与物理地址之间通过页表来映射。

为什么要有虚拟内存?,操作系统,数据库

MMU是内存管理单元 ,当进程访问虚拟内存地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核分配物理内存,更新进程页表,然后再返回用户空间,恢复进程的运行

分页是怎么解决分段的「外部内存碎片和内存交换效率低」的问题?

分页的话,页与页之间是紧密排列的,所以不会存在外部碎片。内存分页机制分配内存的最小单位是一页,即使程序不足一页大小,最少只能分配一个页,所以页内会出现内存浪费,所以针对内存分页机制会存在内部内存碎片的现象。

如果内存分页不够,操作系统会把其他正在运行的进程中的最近没有被使用的内存页给换出到硬盘上面。 一旦需要的话,再从磁盘上面换入到内存里面。由于一次性换入或者换出的只有少数几个页,所以不用花费太多的时间。

更进一步,分页的方式使得我们在加载程序的时候,不再需要一次性把全部的程序加载到物理内存中。我们可以在进行虚拟内存和物理内存的页之间映射之后,并不把真正的页加载到物理内存里面,而是只有在程序运行中,需要用到对应的虚拟内存页里面的指令和数据的时候,在加载到物理内存中去

分页机制下,虚拟地址和物理地址是如何映射的?

虚拟地址分为两部分,页号和页内偏移,页号是页表的索引,页表中存储的是虚拟页号和物理页号,物理页号可以查找物理内存的基地址,基地址划伤页内偏移量就能找到真实的物理地址。

简单的分页有什么问题? 

32位的环境下,每个进程的虚拟地址空间都有4GB,一个页的大小是4kb,那么就会存在4GB / 4KB = 100万个页,每个页中有的页表项 需要4个字节大小来存储,那么整个4GB的映射需要4MB的内存来存储页表。 如果有100个进程的话,需要400M来存储,耗费比较大。

多级页表是什么?

每个进程的100万个页共用的一个页表 ,该页表占用的4MB空间。 4M空间来说有些大了,我们把这100万个页表项的单级页再分页,将一级页表再分为1024个二级页表,每个二级页表中包含1024个页表项。

分了二级表,映射 4GB 地址空间就需要 4KB(一级页表)+ 4MB(二级页表)的内存,这样占用空间不是更大了吗?

如果把4GB的虚拟地址全部都映射到了物理内存上的话,确实二级分页占用的空间更大了,但是,我们不会为一个进程分配太多的内存。

对于每个进程来说,其使用的空间没有达到4GB,因为会存在部分对应的页表项都是空的,对于已经分配的页表项,如果最近一段时间没有被使用,在物理内存紧张的情况下,也是会被换出的。

那么为什么不分级的页表就做不到这样节约内存呢?

保存在内存中的页承担的职责是将虚拟内存翻译成物理地址,假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。

页表一定要覆盖全部的虚拟地址空间,不分级的页表需要100万个页表项来映射,而分级的页表只需要1024个页表项。

分段和分页有什么区别?

  • 分段对程序员来说是透明的,但是分段需要程序员显式的划分每个段
  • 分页的地址空间是一维的,分段是二维的
  • 页的大小不可变,段的大小可以动态改变
  • 分页主要用于实现虚拟内存,可以获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护

什么是空间交换(内存交换) ?

当内存资源不足的时候,操作系统吧某些页或者某些段的内容转移到硬盘的一块空间上面,从而达到释放内存空间的效果。

缺页中断异常

在了解页面置换算法之前,我们需要了解一下缺页中断异常

当CPU访问的页面不在物理内存时,便会产生一个缺页中断,请求操作系统将缺页调入到物理内存。它与一般的中断不一样:

  • 缺页中断在指令执行期间产生和处理中断信号,而在一般的中断在一条指令执行完成之后检查和处理中断信息
  • 缺页中断返回到该指令的开始重新执行该指令,一般中断是返回到该指令的下一个指令执行

页面替换算法有哪些?

最佳页面置换算法

先进先出页面置换算法
LRU缓存淘汰算法

时钟页面置换算法

最不常用淘汰算法文章来源地址https://www.toymoban.com/news/detail-614667.html

到了这里,关于为什么要有虚拟内存?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是分布式操作系统?我们为什么需要分布式操作系统?

    分布式操作系统是一种特殊的操作系统,本质上属于多机操作系统,是传统单机操作系统的发展和延伸。它是将一个计算机系统划分为多个独立的计算单元(或者也可称为节点),这些节点被部署到每台计算机上,然后被网络连接起来,并保持着持续的通信状态。在分布式操作

    2024年02月16日
    浏览(41)
  • 为什么不用Go开发操作系统?

      操作系统 (OS) 是计算机系统的心脏和灵魂,它管理着计算机的硬件和软件资源,并为用户提供与计算机交互的方式。传统上,C 和 Assembly 等语言因其低开销和 “接近机器码” 的特性而被用于开发操作系统。 但诸如 Go 等高级语言的兴起引入了一些特性,这些特性或许可以使

    2024年02月06日
    浏览(43)
  • 97-TCP为什么要有一个“TIME_WAIT“的状态

    \\\"TIME_WAIT\\\"状态存在的原因主要有两点: 假设上图中用于确认服务器结束报文段6的TCP报文段7丢失,那么服务器将重发结束报文段,因此客户端需要停留在某个状态以处理重复收到的结束报文段.否则客户端将以复位报文段来回应服务器,服务器则认为这是一个错误,因为他期望的是一

    2024年02月01日
    浏览(44)
  • 为什么MCS-51 单片机总线和端口要有匹配的驱动电路?

            MCS-51系列单片机是一种广泛使用的8位微控制器,它通常用在嵌入式系统中。单片机的总线和端口可能需要额外的驱动电路,这取决于外部设备的电气特性和所需的电流能力。下面将从以下几个方面分析为什么驱动电路这么重要:          电流驱动能力: MCS-51单片机

    2024年02月20日
    浏览(45)
  • 【Linux(0)】为什么要学习Linux,为什么互联网公司在招聘时,会提出要有Linux经验,及其使用;一些Linux常见指令

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        在学习完C语言后,紧接着,我们要来 学习Li

    2024年02月05日
    浏览(47)
  • 【C/C++】详解程序环境和预处理(什么是程序环境?为什么要有程序环境?如何理解程序环境?)

    目录 一、前言 二、 什么是程序环境? 三、 为什么要有程序环境? 四、如何理解程序环境? 🍎 ANSI C 标准  🍐 翻译环境和执行环境  五、详解翻译环境和执行环境  🍇翻译环境(重点!!)  💦编译环境(预处理---编译---汇编)  💦链接环境(链接)  🍉执行环境

    2024年02月21日
    浏览(42)
  • 【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上\\\"-c\\\"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的\\\"-c\\\"选项和main函数的参数a

    2024年02月12日
    浏览(49)
  • ThreadLocal-为什么会导致内存泄漏

    一个Thread中存在字段为ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals = null; 也就是说我们使用threadLocal进行set操作和get操作,其实就是操作该Thread的threadLocalMap。 这个map是一个基于数组的key和value的格式,在进行get的时候,会将调用对象this作为key进行查询。 hashMap是通过链表法,

    2024年02月03日
    浏览(46)
  • 为什么要用虚拟 DOM?

    虚拟DOM(Virtual DOM)是一种将应用程序的状态(state)与DOM分离的技术。它是一个JavaScript对象,它的结构类似于实际DOM元素的结构。使用虚拟DOM的目的是在减少DOM操作的数量的同时,提高应用程序的性能和响应速度。 当应用程序的状态发生变化时,使用虚拟DOM可以计算出需要

    2024年02月01日
    浏览(37)
  • 为什么你的手机需要更大的内存

    可以确定的是,手机已经先于电脑开启了AI计算时代,新发布的手机几乎都集成了AI处理器,那为什么你还需要更大的内存呢,下面我们来探讨下这个问题。 虽然目前新发布的手机并不都集成了AI处理器,但AI处理器已经成为了一种趋势和特色,越来越多的手机厂商开始开发和

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包