广告
返回顶部
首页 > 资讯 > 操作系统 >Linux需要虚拟内存的原因有哪些
  • 472
分享到

Linux需要虚拟内存的原因有哪些

2023-06-16 02:06:19 472人浏览 八月长安
摘要

小编给大家分享一下linux需要虚拟内存的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存

小编给大家分享一下linux需要虚拟内存的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存是什么,它在操作系统中起到什么样的作用。正如软件工程中的其他抽象,虚拟内存是操作系统物理内存和进程之间的中间层,它为进程隐藏了物理内存这一概念,为进程提供了更加简洁和易用的接口以及更加复杂的功能。

Linux需要虚拟内存的原因有哪些

virtual-memory-layer

图 1 - 进程和操作系统的中间层

如果需要我们从头设计一个操作系统,让系统中的进程直接访问主内存中的物理地址应该是非常自然的决定,早期的操作系统确实也都是这么实现的,进程会使用目标内存的物理地址(Physical  Address)直接访问内存中的内容,然而现代的操作系统都引入了虚拟内存,进程持有的虚拟地址(Virtual Address)会经过内存管理单元(Memory  Mangament Unit)的转换变成物理地址[^2],然后再通过物理地址访问内存:

Linux需要虚拟内存的原因有哪些

virtual-memory-system

图 2 - 虚拟内存系统

主存储是相对比较稀缺的资源,虽然顺序读取只比磁盘快 1 个数量级,但是它能提供极快的随机访问速度,从内存上随机读取数据是磁盘的 100,000  倍[^3],充分利用内存的随机访问速度是改善程序执行效率的有效方式。

操作系统以页为单位管理内存,当进程发现需要访问的数据不在内存时,操作系统可能会将数据以页的方式加载到内存中,这个过程是由上图中的内存管理单元(MMU)完成的。操作系统的虚拟内存作为一个抽象层,起到了以下三个非常关键的作用:

  • 虚拟内存可以利用磁盘起到缓存的作用,提高进程访问指定内存的速度;

  • 虚拟内存可以为进程提供独立的内存空间,简化程序的链接、加载过程并通过动态库共享内存;

  • 虚拟内存可以控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性;

缓存

我们可以将虚拟内存看作是在磁盘上一片空间,当这片空间中的一部分访问比较频繁时,该部分数据会以页为单位被缓存到主存中以加速 CPU  访问数据的性能,虚拟内存利用空间较大的磁盘存储作为『内存』并使用主存储缓存进行加速,让上层认为操作系统的内存很大而且很快,然而区域很大的磁盘并不快,而很快的内存也并不大。

Linux需要虚拟内存的原因有哪些

virtual-memory-cache

图 3 - 虚拟内存、主存和磁盘

虚拟内存中的虚拟页(Virtual Page,PP)可能处于以下的三种状态 —  未分配(Unallocated)、未缓存(Uncached)和已缓存(Cached),其中未分配的内存页是没有被进程申请使用的,也就是空闲的虚拟内存,不占用虚拟内存磁盘的任何空间,未缓存和已缓存的内存页分别表示已经加载到主存中的内存页和仅加载到磁盘中的内存页。如上图所示,图中绿色的虚拟内存页由主存中的物理内存页(Physical  Page,PP)支撑,所以它是已经缓存过的,而黄色的虚拟内存页仅在磁盘中,所以没有被物理内存缓存。

当用户程序访问未被缓存的虚拟页时,硬件就会触发缺页中断(Page  Fault,PF),在部分情况下,被访问的页面已经加载到了物理内存中,但是用户程序的页表(Page  Table)并不存在该对应关系,这时我们只需要在页表中建立虚拟内存到物理内存的关系;在其他情况下,操作系统需要将磁盘上未被缓存的虚拟页加载到物理内存中[^4]。

Linux需要虚拟内存的原因有哪些

page-fault

图 4 - 虚拟内存的缺页中断

因为主内存的空间是有限的,当主内存中不包含可以使用的空间时,操作系统会从选择合适的物理内存页驱逐回磁盘,为新的内存页让出位置,选择待驱逐页的过程在操作系统中叫做页面替换(Page  Replacement)。缺页中断和页面替换技术都是操作系统调页算法(Paging)的一部分,该算法的目的就是充分利用内存资源作为磁盘的缓存以提高程序的运行效率。

内存管理

虚拟内存可以为正在运行的进程提供独立的内存空间,制造一种每个进程的内存都是独立的假象,在 64 位的操作系统上,每个进程都会拥有 256 TiB  的内存空间,内核空间和用户空间分别占 128 TiB[^5],部分操作系统使用 57 位虚拟地址以提供 128 PiB  的寻址空间[^6]。因为每个进程的虚拟内存空间是完全独立的,所以它们都可以完整的使用 0x0000000000000000 到  0x00007FFFFFFFFFFFF 的全部内存。

Linux需要虚拟内存的原因有哪些

virtual-memory-space

图 5 - 操作系统的虚拟内存空间

虚拟内存空间只是操作系统中的逻辑结构,就像我们上面说的,应用程序最终还是需要访问物理内存或者磁盘上的内容。因为操作系统加了一个虚拟内存的中间层,所以我们也需要为进程实现地址翻译器,实现从虚拟地址到物理地址的转换,页表是虚拟内存系统中的重要数据结构,每一个进程的页表中都存储了从虚拟内存到物理内存页的映射关系,为了存储  64 位操作系统中 128 TiB 虚拟内存的映射数据,Linux 在 2.6.10 中引入了四层的页表辅助虚拟地址的转换[^7],在 4.11  中引入了五层的页表结构[^8],在未来还可能会引入更多层的页表结构以支持 64 位的虚拟地址。

Linux需要虚拟内存的原因有哪些

four-level-page-tables

图 6 - 四层页表结构

在如上图所示的四层页表结构中,操作系统会使用最低的 12 位作为页面的偏移量,剩下的 32  位会分四组分别表示当前层级在上一层中的索引,所有的虚拟地址都可以用上述的多层页表查找到对应的物理地址。

因为有多层的页表结构可以用来转换虚拟地址,所以多个进程可以通过虚拟内存共享物理内存。我们在 为什么 Redis 快照使用子进程  一文中介绍的写时复制就利用了虚拟内存的这个特性,当我们在 Linux 中调用 fork  创建子进程时,实际上只复制了父进程的页表。如下图所示,父子进程会通过不同的页表指向相同的物理内存:

Linux需要虚拟内存的原因有哪些

process-shared-memory

图 7 - 进程间共享内存

虚拟内存不仅可以在 fork  时用于共享进程的物理内存,提供写时复制的机制,还能共享一些常见的动态库减少物理内存的占用,所有的进程都可能调用相同的操作系统内核代码,而 C  语言程序也会调用相同的标准库。

除了能够共享内存之外,独立的虚拟内存空间也会简化内存的分配过程,当用户程序向操作系统申请堆内存时,操作系统可以分配几个连续的虚拟页,但是这些虚拟页可以对应到物理内存中不连续的页中。

内存保护

操作系统中的用户程序不应该修改只读的代码段,也不应该读取或者修改内核中的代码和数据结构或者访问私有的以及其他的进程的内存,如果无法对用户进程的内存访问进行限制,攻击者就可以访问和修改其他进程的内存影响系统的安全。

如果每一个进程都持有独立的虚拟内存空间,那么虚拟内存中页表可以理解成进程和物理页的『连接表』,其中可以存储进程和物理页之间的访问关系,包括读权限、写权限和执行权限:

Linux需要虚拟内存的原因有哪些

virtual-memory-permission

图 8 - 读权限、写权限和执行权限

内存管理单元可以决定当前进程是否有权限访问目标的物理内存,这样我们就最终将权限管理的功能全部收敛到虚拟内存系统中,减少了可能出现风险的代码路径。

总结

虚拟内存的设计方法可以说是软件工程中的常见手段,通过结合磁盘和内存各自的优势,利用中间层对资源进行更合理地调度充分提高资源的利用率并提供和谐以及统一的抽象,而在实际的业务场景中,类似的缓存逻辑也比较常见。

操作系统的虚拟内存是非常复杂的组件,没有工程师能够了解其中的全部细节,不过了解虚拟内存的整体设计也很有价值,我们能够从中找到很多软件设计的方法。我们重新回到今天的问题  — Linux 操作系统中为什么需要虚拟内存:

  • 虚拟内存可以结合磁盘和物理内存的优势为进程提供看起来速度足够快并且容量足够大的存储;

  • 虚拟内存可以为进程提供独立的内存空间并引入多层的页表结构将虚拟内存翻译成物理内存,进程之间可以共享物理内存减少开销,也能简化程序的链接、装载以及内存分配过程;

  • 虚拟内存可以控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性;

以上是“Linux需要虚拟内存的原因有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网操作系统频道!

--结束END--

本文标题: Linux需要虚拟内存的原因有哪些

本文链接: https://www.lsjlt.com/news/282108.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux需要虚拟内存的原因有哪些
    小编给大家分享一下Linux需要虚拟内存的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存...
    99+
    2023-06-16
  • 需要将服务器虚拟化的原因有哪些
    需要将服务器虚拟化的原因有:1、能够整合服务器资源,提高资源利用率;2、能够节省数据中心的成本,降低服务器投入资金;3、提高了服务器可用性,从而保障业务连续性;4、将服务器虚拟化后能够提高运营灵活性,可动态调整资源分配,保障业务稳定性;5、...
    99+
    2022-10-24
  • linux需要分区的原因有哪些
    这篇文章主要为大家展示了“linux需要分区的原因有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux需要分区的原因有哪些”这篇文章吧。linux分区的原因:1、分区可以防止数据丢失,...
    99+
    2023-06-29
  • 虚拟主机要备案的原因有哪些
    虚拟主机需要备案的原因主要有以下几点:1.法律法规要求:根据我国《互联网信息服务管理办法》,提供网站信息服务的单位和个人都需要进行备...
    99+
    2023-09-07
    虚拟主机
  • 电脑出现虚拟内存不够有哪些原因造成
    本篇内容主要讲解“电脑出现虚拟内存不够的原因有哪些造成”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“电脑出现虚拟内存不够的原因有哪些造成”吧!1、感染病毒 有些病毒发作时会占用大量内存空间,导致...
    99+
    2023-06-14
  • 电脑为何出现虚拟内存不够有哪些原因造成
    大家都知道,如果计算机缺少运行程序或操作所需的随机存取内存 (RAM),则 Windows 使用虚拟内存进行补偿。内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序分配的内存的总量超过了内...
    99+
    2023-05-31
    虚拟内存 内存不足 原因 电脑
  • 虚拟主机太卡的原因有哪些
    虚拟主机太卡的原因有:1.配置过低,升级配置;2.网站程序问题或被攻击,排查攻击源,并解决;具体分析如下:配置过低配置过低,很容易导致虚拟主机太卡。例如数据量很大,访问量很大,加上配置过低。虚拟主机肯定要变卡,甚至宕机。网站程序问题或被攻击...
    99+
    2022-10-09
  • java内存高的原因有哪些
    Java内存高的原因主要有以下几个方面:1. 对象内存消耗:在Java中,每个对象都需要占用一定的内存空间。如果程序中存在大量的对象...
    99+
    2023-08-18
    java
  • DBaaS需要数据保护的原因有哪些
    本篇内容介绍了“DBaaS需要数据保护的原因有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!随着云计算...
    99+
    2022-10-18
  • vmware虚拟机打不开的原因有哪些
    虚拟机内存不足:如果虚拟机运行所需的内存超过了主机的可用内存,虚拟机可能无法启动。2. CPU资源不足:如果虚拟机需要的CPU资源超...
    99+
    2023-10-18
    vmware
  • golang内存逃逸的原因有哪些
    在Go语言中,内存逃逸指的是在函数执行过程中,将局部变量分配在堆上而不是栈上。内存逃逸会导致额外的性能开销,并可能导致垃圾回收器更频...
    99+
    2023-10-23
    golang
  • java内存溢出的原因有哪些
    Java内存溢出的原因主要有以下几点:1. 无限循环:当程序中存在无限循环或递归调用时,会导致内存溢出。每次循环或递归调用都会产生一...
    99+
    2023-08-11
    java
  • python内存泄漏的原因有哪些
    Python内存泄漏的原因有以下几个:1. 循环引用:当两个或多个对象相互引用时,如果没有妥善地处理,可能会导致内存泄漏。垃圾回收器...
    99+
    2023-09-15
    python
  • Android内存泄漏的原因有哪些
    Android内存泄漏的原因有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Android开发中,最容易引发的内存泄漏问题的是Context。比如Activity的Con...
    99+
    2023-06-17
  • php内存溢出的原因有哪些
    小编给大家分享一下php内存溢出的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!           ...
    99+
    2023-06-20
  • javascript内存泄漏有哪些原因
    本篇内容介绍了“javascript内存泄漏有哪些原因”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • php内存超限原因有哪些
    随着web应用程序的开发越来越复杂,PHP被广泛应用于开发各种类型的网站和应用程序。随之而来的一个普遍的问题是内存问题,这对于新手来说是一个常见且很难解决的问题。PHP内存超限是一种常见的问题,可能会导致应用程序崩溃或变得缓慢,影响用户体验...
    99+
    2023-05-14
  • 云服务器需要备案的原因有哪些
    云服务器需要备案的原因主要有以下几点:1. 国家政策要求:根据中国相关法律法规,云服务器提供商要求用户进行备案,以确保用户在云服务器...
    99+
    2023-09-23
    云服务器
  • 美国Linux服务器内存不足的原因有哪些
    美国Linux服务器内存不足的原因有:1、美国服务器中应用程序池无法及时释放内存导致;2、美国服务器本身内存不足导致;3、美国服务器上运行的程序过多,消耗内存资源过大导致。具体内容如下:应用程序池无法及时释放内存美国Linux服务器的应用程...
    99+
    2022-10-08
  • 海外虚拟vps速度慢的原因有哪些
    海外虚拟vps速度慢的原因有:1、网络问题,比如海外虚拟vps带宽不足、网络出现波动导致;2、海外虚拟vps后台加载程序过多、系统资源不足导致;3、海外虚拟vps中了木马病毒导致;4、海外虚拟vps中防火墙过多使用导致网速变慢;5、海外虚拟...
    99+
    2022-10-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作