广告
返回顶部
首页 > 资讯 > 操作系统 >浅谈Linux的虚拟内存
  • 796
分享到

浅谈Linux的虚拟内存

linux虚拟内存 2022-06-03 14:06:07 796人浏览 八月长安
摘要

目录由来虚拟内存分页和页表内存寻址和分配功能进程内存管理数据共享SWAP常见问题32位和64位直接操作物理内存JVM 进程占用虚拟内存过多常用管理命令查看系统内存状态pmap修改内存配置SWAP 操作小结由来 虚拟内

目录
  • 由来
    • 虚拟内存
    • 分页和页表
    • 内存寻址和分配
  • 功能
    • 进程内存管理
    • 数据共享
    • SWAP
  • 常见问题
    • 32位和64位
    • 直接操作物理内存
    • JVM 进程占用虚拟内存过多
  • 常用管理命令
    • 查看系统内存状态
    • pmap
    • 修改内存配置
    • SWAP 操作
  • 小结

    由来

    虚拟内存

    毋庸置疑,虚拟内存绝对是操作系统中最重要的概念之一。我想主要是由于内存的重要”战略地位”。CPU太快,但容量小且功能单一,其他 I/O 硬件支持各种花式功能,可是相对于 CPU,它们又太慢。于是它们之间就需要一种润滑剂来作为缓冲,这就是内存大显身手的地方。

    上图是虚拟内存最简单也是最直观的解释。

    操作系统有一块物理内存(中间的部分),有两个进程(实际会更多)P1 和 P2,操作系统偷偷地分别告诉 P1 和 P2,我的整个内存都是你的,随便用,管够。可事实上呢,操作系统只是给它们画了个大饼,这些内存说是都给了 P1 和 P2,实际上只给了它们一个序号而已。只有当 P1 和 P2 真正开始使用这些内存时,系统才开始使用辗转挪移,拼凑出各个块给进程用,P2 以为自己在用 A 内存,实际上已经被系统悄悄重定向到真正的 B 去了,甚至,当 P1 和 P2 共用了 C 内存,他们也不知道。

    操作系统的这种欺骗进程的手段,就是虚拟内存。对 P1 和 P2 等进程来说,它们都以为自己占用了整个内存,而自己使用的物理内存的哪段地址,它们并不知道也无需关心。

    分页和页表

    虚拟内存是操作系统里的概念,对操作系统来说,虚拟内存就是一张张的对照表,P1 获取 A 内存里的数据时应该去物理内存的 A 地址找,而找 B 内存里的数据应该去物理内存的 C 地址。

    我们知道系统里的基本单位都是 Byte 字节,如果将每一个虚拟内存的 Byte 都对应到物理内存的地址,每个条目最少需要 8字节(32位虚拟地址->32位物理地址),在 4G 内存的情况下,就需要 32GB 的空间来存放对照表,那么这张表就大得真正的物理地址也放不下了,于是操作系统引入了页(Page)的概念。

    在系统启动时,操作系统将整个物理内存以 4K 为单位,划分为各个页。之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G 内存,只需要 8M 的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且linux 还为大内存设计了多级页表,可以进一页减少了内存消耗。操作系统虚拟内存到物理内存的映射表,就被称为页表。

    内存寻址和分配

    我们知道通过虚拟内存机制,每个进程都以为自己占用了全部内存,进程访问内存时,操作系统都会把进程提供的虚拟内存地址转换为物理地址,再去对应的物理地址上获取数据。CPU 中有一种硬件,内存管理单元 MMU(Memory Management Unit)专门用来将翻译虚拟内存地址。CPU 还为页表寻址设置了缓存策略,由于程序的局部性,其缓存命中率能达到 98%。

    以上情况是页表内存在虚拟地址到物理地址的映射,而如果进程访问的物理地址还没有被分配,系统则会产生一个缺页中断,在中断处理时,系统切到内核态为进程虚拟地址分配物理地址。

    功能

    虚拟内存不仅通过内存地址转换解决了多个进程访问内存冲突的问题,还带来更多的益处。

    进程内存管理

    它有助于进程进行内存管理,主要体现在:

    • 内存完整性:由于虚拟内存对进程的”欺骗”,每个进程都认为自己获取的内存是一块连续的地址。我们在编写应用程序时,就不用考虑大块地址的分配,总是认为系统有足够的大块内存即可。
    • 安全:由于进程访问内存时,都要通过页表来寻址,操作系统在页表的各个项目上添加各种访问权限标识位,就可以实现内存的权限控制。

    数据共享

    通过虚拟内存更容易实现内存和数据的共享。

    在进程加载系统库时,总是先分配一块内存,将磁盘中的库文件加载到这块内存中,在直接使用物理内存时,由于物理内存地址唯一,即使系统发现同一个库在系统内加载了两次,但每个进程指定的加载内存不一样,系统也无能为力。

    而在使用虚拟内存时,系统只需要将进程的虚拟内存地址指向库文件所在的物理内存地址即可。如上文图中所示,进程 P1 和 P2 的 B 地址都指向了物理地址 C。

    而通过使用虚拟内存使用共享内存也很简单,系统只需要将各个进程的虚拟内存地址指向系统分配的共享内存地址即可。

    SWAP

    虚拟内存可以让帮进程”扩充”内存。

    我们前文提到了虚拟内存通过缺页中断为进程分配物理内存,内存总是有限的,如果所有的物理内存都被占用了怎么办呢?

    Linux 提出 SWAP 的概念,Linux 中可以使用 SWAP 分区,在分配物理内存,但可用内存不足时,将暂时不用的内存数据先放到磁盘上,让有需要的进程先使用,等进程再需要使用这些数据时,再将这些数据加载到内存中,通过这种”交换”技术,Linux 可以让进程使用更多的内存。

    常见问题

    在了解虚拟内存时,我也有过很多的问题。

    32位和64位

    最常见的就是 32位和64位的问题了。

    CPU 通过物理总线访问内存,那么访问地址的范围就受限于机器总线的数量,在32位机器上,有32条总线,每条总线有高低两种电位分别代表 bit 的 1 和 0,那么可访问的最大地址就是 2^32bit = 4GB,所以说 32 位机器上插入大于 4G 的内存是无效的,CPU 访问不到多于 4G 的内存。

    但 64位机器并没有 64位总线,而且其最大内存还要受限于操作系统,Linux 目前支持最大 256G 内存。

    根据虚拟内存的概念,在 32 位系统上运行 64 位软件也并无不可,但由于系统对虚拟内存地址的结构设计,64位的虚拟地址在32位系统内并不能使用。

    直接操作物理内存

    操作系统使用了虚拟内存,我们想要直接操作内存该怎么办呢?

    Linux 会将各个设备都映射到/dev/目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。 在 Linux 中,内存设置被映射为/dev/mem,root 用户通过对这个文件读写,可以直接操作内存。

    JVM 进程占用虚拟内存过多

    使用 TOP 查看系统性能时,我们会发现在 VIRT 这一列,Java 进程会占用大量的虚拟内存。

    导致这种问题的原因是 Java 使用 Glibc 的 Arena 内存池分配了大量的虚拟内存并没有使用。此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。具体可以查看为什么linux下多线程程序如此消耗虚拟内存。

    而真实占用的物理内存要看RES(resident) 列,这一列的值才是真正被映射到物理内存的大小。

    常用管理命令

    我们也可以自己来管理 Linux 的虚拟内存。

    查看系统内存状态

    查看系统内存情况的方式有很多,free、vmstat等命令都可输出当前系统的内存状态,需要注意的是可用内存并不只是 free 这一列,由于操作系统的 lazy 特性,大量的 buffer/cache 在进程不再使用后,不会被立即清理,如果之前使用它们的进程再次运行还可以继续使用,它们在必要时也是可以被利用的。

    此外,通过cat /proc/meminfo可以查看系统内存被使用的详细情况,包括脏页状态等。详情可参见:/PROC/MEMINFO之谜。

    pmap

    如果想单独查看某一进程的虚拟内存分布情况,可以使用pmap pid命令,它会把虚拟内存各段的占用情况从低地址到高地址都列出来。

    可以添加-XX参数来输出更详细的信息。

    修改内存配置

    我们也可以修改 Linux 的系统配置,使用sysctl vm [-options] CONFIG或 直接读写/proc/sys/vm/目录下的文件来查看和修改配置。

    SWAP 操作

    虚拟内存的 SWAP 特性并不总是有益,放任进程不停地将数据在内存与磁盘之间大量交换会极大地占用 CPU,降低系统运行效率,所以有时候我们并不希望使用 swap。

    我们可以修改vm.swappiness=0来设置内存尽量少使用 swap,或者干脆使用swapoff命令禁用掉 SWAP。

    小结

    虚拟内存的概念非常容易理解,但是它会衍生出来的一系列非常复杂的知识。本文只讲了些基本原理,略过了很多细节,比如虚拟内存寻址中段寄存器的使用,操作系统使用虚拟内存增强缓存、缓冲区的应用等,有机会单独拿出来说。

    以上就是浅谈Linux的虚拟内存的详细内容,更多关于Linux的虚拟内存的资料请关注编程网其它相关文章!

    --结束END--

    本文标题: 浅谈Linux的虚拟内存

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

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

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

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

    下载Word文档
    猜你喜欢
    • 浅谈Linux的虚拟内存
      目录由来虚拟内存分页和页表内存寻址和分配功能进程内存管理数据共享SWAP常见问题32位和64位直接操作物理内存JVM 进程占用虚拟内存过多常用管理命令查看系统内存状态pmap修改内存配置SWAP 操作小结由来 虚拟内...
      99+
      2022-06-03
      linux 虚拟内存
    • 浅谈Node的内存泄露
      目录1、node内存相关知识2、哪些情况会造成内存泄露第一、全局变量第二、函数闭包第三、事件监听3、内存泄露的监测4、Chrome DevTools进行分析和对比5、内存分析的意义1...
      99+
      2022-11-13
    • 浅谈Golang内存逃逸
      目录1.什么是内存逃逸2.什么是逃逸分析3.小结4.逃逸分析案例1.函数返回局部指针变量2.interface类型逃逸1.interface产生逃逸2.指向栈对象的指针不能在堆中3....
      99+
      2022-11-11
    • 浅谈QT内存泄漏
      目录01前言02 QT半自动化内存管理要点03实验过程详解Malloc分配的内存空间实践实例04总结01前言    前几天,项目开展了一次代码初次评审。会上,领导...
      99+
      2022-11-12
    • 浅谈GPU虚拟化技术(四)- GPU分片虚拟化
        让各位久等了,阿里小二这就开始上新菜:“GPU分片虚拟化”。  对于“分片”的理解,相信大家已经不陌生了。此处的分片从两个维度上来定义:其一,是对GPU在时间片段上的划分,与CPU的进程调度类似,一个物理GPU的计算engine在几个v...
      99+
      2023-06-04
    • 浅谈Java虚拟机对内部锁的四种优化方式
      自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化。这些优化主要包括锁消除(Lock Elision)、锁粗化(Lock Coarsening)、偏向锁(Biased Locking)以及适应性锁(Adaptive...
      99+
      2023-05-31
      java 虚拟机 优化
    • Linux虚拟内存是什么
      这篇“Linux虚拟内存是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux虚拟内存是什么”文章吧。虚拟内存由来毋...
      99+
      2023-06-27
    • linux怎么扩展虚拟内存
      本篇内容主要讲解“linux怎么扩展虚拟内存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux怎么扩展虚拟内存”吧!在linux磁盘刚分区的时候,我们会划分一个swap分区,这块分区作为一...
      99+
      2023-06-10
    • linux中虚拟内存是什么
      这篇文章主要为大家展示了“linux中虚拟内存是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中虚拟内存是什么”这篇文章吧。1. 讨论虚拟内存前的热身我们需要知道的是计算机对内存分...
      99+
      2023-06-15
    • linux如何实现虚拟内存
      今天小编给大家分享一下linux如何实现虚拟内存的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。虚拟内存的实现需要建立在离散分...
      99+
      2023-07-04
    • 浅谈Python 对象内存占用
      一切皆是对象 在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数。 参见stackoverflow上的一个问题 Is everything an object in pytho...
      99+
      2022-06-04
      浅谈 对象 内存
    • linux的虚拟内存机制是什么
      这篇“linux的虚拟内存机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux的虚拟内存机制是什么”文章吧。l...
      99+
      2023-07-01
    • linux中虚拟内存的示例分析
      这篇文章给大家分享的是有关linux中虚拟内存的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是虚存为什么需要它?   我们知道程序代码和数据必须驻留在内存中才能得以运行,然而系统内存数量很有限,往往...
      99+
      2023-06-13
    • Linux中怎么实现虚拟内存
      这期内容当中小编将会给大家带来有关Linux中怎么实现虚拟内存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  Linux虚拟内存怎么实现  第一个例子:下面一段程序会打...
      99+
      2022-10-18
    • Linux下如何扩展虚拟内存
      这篇文章主要介绍了Linux下如何扩展虚拟内存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当物理内存占用完了后,当系统还需要更多的物理内存时,物理内存中Inactive P...
      99+
      2023-06-27
    • 浅谈Tensorflow2对GPU内存的分配策略
      目录一、问题源起二、开发环境三、Tensorflow针对GPU内存的分配策略四、问题分析验证五、GPU分配策略分析六、扩展一、问题源起 从以下的异常堆栈可以看到是BLAS程序集初始化...
      99+
      2022-11-12
    • 浅谈Tomcat内存配置的正确姿势
      1.背景 虽然阅读了各大牛的博客或文章,但并没有找到特别全面的关于JVM内存分配方法的文章,很多都是复制黏贴 为了严谨,本文特别备注只介绍基于HotSpot VM虚拟机,并且基于JD...
      99+
      2022-11-12
    • Linux虚拟内存不够用怎么办
      这篇文章主要讲解了“Linux虚拟内存不够用怎么办”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux虚拟内存不够用怎么办”吧!解决方法:1、建立swapfile:2、格式化为swap格...
      99+
      2023-06-28
    • 浅谈C++内存管理基础知识
      目录概述c++可用内存c语言的可用内存c++新增内存区域new和malloc智能指针引入智能指针的实现java延伸java语言整体框架java的垃圾回收机制总结 概述 内存管理的原理...
      99+
      2022-11-12
    • Linux需要虚拟内存的原因有哪些
      小编给大家分享一下Linux需要虚拟内存的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存...
      99+
      2023-06-16
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作