当前位置:   article > 正文

宋宝华Linux培训笔记-Linux内存管理_宋宝华内存管理笔记

宋宝华内存管理笔记

1、linux内存映射关系

内存映射中最重要的是页表,页表除了找到虚地址对应的物理地址外,在对应这一行中还存有两个标志位,一个是RWX标志位,表明该位置是可读还是可写,另一个是u/k标志位,区分用户空间和内核空间。每个进程看到4G内存,一般3G-4G虚地址对应kernel空间。

总结页表两个作用:虚实转换;权限管理。

 

2、linux物理内存分页

linux中物理内存页数为物理内存大小/4K,例如1G物理内存,则页数为1G/4K

linux物理内存进行分ZONE,通常分为DMA_ZONE,NORMAL_ZONE,HIGHMEM_ZONE,DMA_ZONE用于DMA设备,由于DMA访问内存地址线少,导致DMA访问内存区域较小,无法进行大内存分配,设定好ZONE后确保DMA不会因内存分配过大导致出错。

NORMAL_ZONE和DMA_ZONE位于0-896M,映射到linux的内核空间。

在每个ZONE内部,执行buddy算法,每次将2^n个连续的内存放在一起,查看如图

所以linux中申请页函数alloc_pages(order)是申请2^order页数

这种情况会导致碎片出现。

在针对内核分配空间时引入slab,slab从buddy那里取得内存后,切分为大小一样的小块,例如8字节,16字节等,然后进行分配。实现如下的二级管理机制:

通过slabtop可以对slab进行检测,可作为内存泄漏观察点

 

3、linux内存分配

linux内存分配为lazy allocation demanding page方式,刚申请时给的是零化空间,随着访问不断分配内存

如图所示,上面为写的部分分配内存成功,没有写的部分依然指向零化页面。

 

4、OOM机制

OOM机制是在linux上当内存使用枯竭时,找出最该杀的进程进行kill,从而释放内存。

决定一个进程是否该杀是根据oom_score.

可通过echo [-15,15] > /proc/pidof/oom_adj 设置一个进程的oom_score。Echo到oom_adj中的值越大,oom_score值也会越大,该进程就更容易被杀。

可通过dmesg查看一个进程被杀的原因。

上图为firefox的oom设置

如果不想启用OOM机制,可以将panic_on_oom设为1,这样内存枯竭时不再杀进程,而是操作系统崩溃

 

5、VMA

在进程task_struct中含有mm,指向mm_struct,其中包含进程所有的内存。

Vma为进程的虚拟地址空间

通过maps能够看到进程所有的VMA。VMA代表逻辑权限,不代表页表权限,VMA中的逻辑权限决定参考记录进程情况信息,进程发生page fault时参考VMA。

当出现page fault时有下面三种情况

  1. 无VMA,表明地址非法,杀进程
  2. 有VMA 但是权限不对,杀进程
  3. 有VMA,权限也对,分配空间给进程

 

RSS不同于VSS,RSS指驻留在内存条上的内存,属于真实内存。VSS>=RSS,采用lazy allocation技术,只有访问到某段空间时,才会在真实内存条上进行内存分配。

如上图所示,对线程1来说

VSS=1+2+3,表明进程虚拟内存大小

RSS=4+5+6,表明驻留在内存中的大小

PSS=4/3+5/2+6,因为有三个线程共享4,两个线程共享5,PSS表明的是均一化内存消耗,PSS能够反映物理内存如何被进程瓜分

USS=6,进程独占部分

 

6、smem

可以通过smem查看进程的uss,pss和rss

也可以通过smem –pie=command smem –bar=command.

检测内存泄漏,可以通过在n个时间点上看uss进行判断,内存泄漏趋势为uss不断变大。

 

7、page cache

用户进程通过两种方式访问硬盘

一种是直接访问dd,一种是挂载文件系统访问。其中两种方式都会在内存中产生page cache.

圆圈1产生的page cache被称为cached page cache

圆圈2产生的page cache称为buffers page cache

通过free命令可以看到内存使用情况

在第一行used中,包含了kernel使用的内存,app使用的内存以及page cached内存

其中page cached内存可以被回收,所以第二行显示了page cache被回收后的内存使用情况。

 

释放page cache可用

可以看到buffers和cached都减小了

 

8、mmap

mmap可以将文件映射到进程虚拟地址空间,*p=mmap(),文件对于程序来说就是一段内存区域,这样就可以通过指针直接操作硬盘上文件

上图中为firefox启动过程中的page cache信息,major page fault对应于操作硬盘,minor page fault不操作硬盘。

 

9、文件背景

一个页面有文件背景,其在硬盘上有对应文件

一个页面没有文件背景,通常为程序栈、堆、数据段内容,硬盘上没有对应文件,称为匿名页,常驻内存。

为了不让匿名页常驻内存,也能够被交换出去,linux中为匿名页伪造了文件背景,存放在swap分区(硬盘虚拟分区)

对应关系如下:

Swap替换算法采用LRU,和cache替换算法一样。

 

10、内存泄漏检查

在gcc 4.9版本以后,增加了内存泄漏检查工具

Gcc –fsanitize=address

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  • 文章浏览阅读2.2k次,点赞98次,收藏98次。expect是由DonLibes基于Tcl(ToolCommandLanguage)语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程... [详细]

  • 文章浏览阅读1w次,点赞141次,收藏140次。探索LinuxDocker管理神器Portainer,解锁远程访问技巧,轻松图形化管理你的容器。LinuxDocker图形化工具Portainer远程访问文章目录前言1.部署Portainer... [详细]

  • 文章浏览阅读4.6k次,点赞126次,收藏147次。操作系统进程状态,以及Linux中的进程状态,僵尸进程,孤儿进程【Linux】探索Linux进程状态|僵尸进程|孤儿进程最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现... [详细]

  • 文章浏览阅读5.1k次,点赞151次,收藏135次。LinuxAMH服务器管理面板远程访问LinuxAMH服务器管理面板远程访问文章目录1.前言2.Linux安装AMH面板3.本地访问AMH面板4.Linux安装Cpolar5.配置AMH面... [详细]

  • 文章浏览阅读1.1w次,点赞32次,收藏103次。Linux安装MySQL【超详细版】_linux安装mysqllinux安装mysql一、安装MySQL的准备工作1.查看系统版本cat/etc/redhat-release12.查看系统是... [详细]

  • 文章浏览阅读723次。拿到dotnet-sdk-8.0.100-linux-x64.tar.gz文件。1.有些环境比较老的服务器,会出现如下的错误提示,需要更新c++库。执行命令检测是否安装成功,执行dotnet--version。2.把文... [详细]

  • 文章浏览阅读1.6k次,点赞77次,收藏70次。ssh操作需要免密附上本机免密脚本ssh_keygen.sh。执行完脚本成功登录。【Linux】Centos7shell实现MySQL5.7tar一键安装... [详细]

  • 文章浏览阅读987次,点赞43次,收藏32次。使用上面的Cpolarhttps公网地址,在任意设备的浏览器进行访问,即可成功看到我们AMH面板界面,这样一个公网地址且可以远程访问就创建好了,使用了cpolar的公网域名,无需自己购买云服务器... [详细]

  • 文章浏览阅读950次,点赞49次,收藏46次。本篇博客作为Linux常见指令的总结,主要是方便个人进行回顾使用。以上就是我对于Linux常见指令的总结。!!Linux:常见指令个人主页:个人主页个人专栏:《数据结构》《C语言》《C++》文章... [详细]

  • 文章浏览阅读2.8w次,点赞73次,收藏317次。ps命令用来查看系统进程,ps-ef:查看所有进程ps-aux:查看所有进程ps-ef|greptomcat:查看指定进程_psefgrep命令看进程psefgrep命令看进程「作者主页」:... [详细]

  • 文章浏览阅读1.2w次,点赞64次,收藏74次。Crontab是一个在Unix和Linux操作系统上用于定时执行任务的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab是crontable的缩... [详细]

  • 文章浏览阅读1.1k次,点赞76次,收藏65次。Linux|创建|删除|查看|基本命名详解Linux|创建|删除|查看|基本命名详解Linux|创建|删除|查看|基本命名详解文章目录Linux|创建|删除|查看|基本命名详解前言一、安装Li... [详细]

  • DataEase是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。在本地搭建后,借助cpolar内网穿透实现远... [详细]

  • 介绍socket编程,简单实现一个UDP服务器✨✨【Linux】套接字编程目录套接字IP+PORTTCP和UDP的介绍TCPUDP网络字节序转换接口UDP服务器的编写服务器的初始化 socketbindsockaddr结构服务器的... [详细]

  • 本文是对Linux中文件和目录权限的总结。以上就是我对于Linux中文件和目录权限的总结。!!Linux:权限个人主页:个人主页个人专栏:《数据结构》《C语言》《C++》《Linux》文章目录前言一、Linux权限的管理文件访问者的分类(身... [详细]

  • 看了这篇文章你将学到软硬链接的使用,以及制作自己的动静态库,并使用他们✨✨_动态库的软连接动态库的软连接系列文章收录于【Linux】文件系统 专栏关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。可以... [详细]

  • 讲述Linux的基本指令:man、cp、mv、cat、more、less、head、tail等指令。【走进Linux的世界】Linux---基本指令(2)个人主页:平行线也会相交欢迎点赞... [详细]

  • 上一篇文章中我们讲到了很多的网络名词以及相关知识,下面我们就直接进入udp服务器的实现。一、udp服务器的实现cc=g++.PHONY:allclean:我们通过all就可以创建多个可执行程序了,对于cc这个变量我们设置为g++,以后如果想... [详细]

  • Linux防火墙服务和区的不同配置操作,放行端口或服务等_linux防火墙配置linux防火墙配置目录防火墙介绍zones预定义服务firewalld启动与停止查看firewalld当前状态和设置使⽤CLI查看firewalld设置fire... [详细]

  • Linux MeterSphere一站式开源持续测试平台远程访问
    MeterSphere是一站式开源持续测试平台,涵盖测试跟踪、接口测试、UI测试和性能测试等功能,全面兼容JMeter、Selenium等主流开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速高质量的软件交付,推... [详细]

相关标签
  

闽ICP备14008679号