Linux内存管理--smaps内存

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

swaps文件是Linux的proc文件系统提供的查看系统下运行进程内存使用情况的方法,Linux给每个进程都提供了一个这样的文件,学会查看并分析swaps文件有助于定位和解决诸如内存泄漏、性能瓶颈等内存资源相关问题。

一、内存的两个概念

了解smaps文件之前,需要先搞清楚Linux内存管理中的虚拟内存(Virtual Memory)和驻留内存(Resident Memory)这两个重要概念。

1、虚拟内存

首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼但是它们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理(process address space management)而精心设计的一个逻辑意义上的内存空间概念。虚拟内存是逻辑意义上的内存空间,为了使程序能够在物理内存上运行,需要将虚拟内存映射到物理内存,这一功能由操作系统中页映射表来完成。

2、驻留内存

驻留内存,是指被映射到进程虚拟内存空间的物理内存。进程的驻留内存就是进程实实在在占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

二、VIRT、RES和SHR内存        

Linux下常常使用top命令来查看进程内存使用情况,top命令中有VIRT、RES和SHR三种内存,三者代表的内存分别如下:

VIRT:已经映射到物理内存空间的部分和尚未映射到物理内存空间的部分总和。

RES:进程虚拟内存空间中已经映射到物理内存空间的部分的大小。

SHR:进程占用的共享内存大小。

其中,SHR内存存在的原因,是Linux动态库的使用,

我们写的程序会依赖于很多外部的动态库(.so),比如libc.so、libld.so等等。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映射到对应进程的虚拟内存空间中。多个进展之间通过共享内存的方式相互通信也会出现这样的情况。

这么一来,就会出现不同进程的虚拟内存空间会映射到相同的物理内存空间。这部分物理内存空间其实是被多个进程所共享的,所以我们将他们称为共享内存,用SHR来表示。

通过top命令我们已经能看出进程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其他进程共享的内存(SHR)。但是仅此而已,如果我想知道如下问题:

进程的虚拟内存空间的分布情况,比如heap占用了多少空间、文件映射(mmap)占用了多少空间、stack占用了多少空间?

进程是否有被交换到swap空间的内存,如果有,被交换出去的大小?

mmap方式打开的数据文件有多少页在内存中是脏页(dirty page)没有被写回到磁盘的?

以上这些问题都无法通过top命令给出答案,但是有时候这些问题正是我们在对程序进行性能瓶颈分析和优化时所需要回答的问题。针对这些问题,Linux的proc文件系统给出了解决方法,它给每个进程提供了一个smaps文件,通过分析该文件就可以一一回答以上问题。

三、smaps文件

1、smaps文件的概念

smaps文件是Linux的proc文件系统提供的一种可以查看内存资源使用情况的方法,Linux系统中运行的库、堆、栈等信息都可在smaps中查看。在Linux中,每一个进程都有其对应的smaps文件,它记录了该进程各种内存资源的详细使用情况。

在smaps文件中,每一条记录(如下图所示)表示进程虚拟内存空间中一块连续的区域。其中第一行从左到右依次表示地址范围、权限标识、映射文件偏移、设备号、inode、文件路径。详细解释可以参见understanding-linux-proc-id-maps。

接下来8个字段的含义分别如下:

• Size:表示该映射区域在虚拟内存空间中的大小。

• Rss:驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其他进程共享的内存。     

• Shared_Clean:和其他进程共享的未被改写的page的大小

• Shared_Dirty:和其他进程共享的被改写的page的大小

• Private_Clean:未被改写的私有页面的大小。

• Private_Dirty:已被改写的私有页面的大小。

• Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。

• Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。

2、查看smaps内存

Linux下使用如下命令查看smaps文件:

cat /proc/{pid}/smaps > smaps.txt

输出如下图所示

Linux内存管理--smaps内存,Linux内核,MMU

通过查看进程的smaps文件,可以获取进程每个内存映射块的详细信息,分析这些信息,可帮助定位和解决如内存泄漏、性能瓶颈等内存相关问题。文章来源地址https://www.toymoban.com/news/detail-705403.html

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

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

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

相关文章

  • 深入理解Linux内核——内存管理(3)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(40)
  • 【嵌入式环境下linux内核及驱动学习笔记-(10-内核内存管理)】

    对于包含MMU(内存管理单元)的处理器而言,linux系统以虚拟内存的方式为每个进程分配最大4GB的内存。这真的4GB的内存空间被分为两个部分–用户空间 与 内核空间。用户空间地地址分布为0~3GB,剩下的3 ~ 4GB 为内核空间。如下图。 用户进程通常只能访问用户空间的虚拟地址

    2024年02月11日
    浏览(53)
  • 深入理解Linux内核——内存管理(4)——伙伴系统(1)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月10日
    浏览(50)
  • 【Linux 内核源码分析】内存管理——Slab 分配器

    在Linux内核中,伙伴分配器是一种内存管理方式,以页为单位进行内存的管理和分配。但是在内核中,经常会面临结构体内存分配问题,而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存,将造成很大的内存浪费。因此,为了解决这个问题,Sun公

    2024年02月22日
    浏览(57)
  • Linux内核中内存管理相关配置项的详细解析5

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析4 对应配置变量为:CONFIG_SHUFFLE_PAGE_ALLOCATOR。 此项只有选中和不选中两种状态,默认为选中。 此项的内核源码详细解释为: Randomization of the page allocator improves the average utilization of a direct-mapped memory-side-cache. See section 5

    2024年02月08日
    浏览(38)
  • Linux内核中内存管理相关配置项的详细解析15

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析14 对应配置变量为:CONFIG_PTE_MARKER_UFFD_WP。 此项只有选中和不选中两种状态,默认为选中。 此项的内核源码详细解释为: Allows to create marker PTEs for userfaultfd write protection purposes. It is required to enable userfaultfd write protecti

    2024年02月08日
    浏览(42)
  • Linux 内核内存管理 virt_to_page 函数

    virt_to_page宏根据内核虚拟地址返回其struct page 结构体指针。 x86_64: virt_to_page(kaddr) 宏通过__pa宏将虚拟地址转换为物理地址,然后右移PAGE_SHIFT(12位)位将物理地址转换为页帧号pfn,最后调用pfn_to_page将页帧号pfn转换为struct page 结构体指针,实现了将虚拟地址转换为对应struc

    2024年02月12日
    浏览(34)
  • 【MMU】认识 MMU 及内存映射的流程

    MMU(Memory Manager Unit),是内存管理单元,负责将虚拟地址转换成物理地址。除此之外,MMU 实现了内存保护,进程无法直接访问物理内存,防止内存数据被随意篡改。 MMU: TLB模块:用于缓存从虚拟地址到物理地址的转换结果 TWU模块:负责完成页表的查过程 Cache:        

    2024年02月14日
    浏览(35)
  • Spark内核解析-内存管理7(六)

    Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文中阐述的原理基于 Spark 2.1 版本。 在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和

    2024年02月03日
    浏览(41)
  • Linux 内核学习 3 - 虚拟内存和物理内存

    虚拟内存其实是 CPU 和操作系统使用的一个障眼法,联手给进程编织了一个假象,让进程误以为自己独占了全部的内存空间 : 在 32 位系统中,进程以为自己独占了 3G 的内存空间。 在 64 位系统中,进程以为自己独占了 128T 的内存空间。 这么做的好处是,操作系统为每个进程

    2024年01月21日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包