linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结

物理内存管理

页面内存管理

Linux把物理内存划分为若干个大小相同(通常是4k)的页面,每个页面使用struct page描述,在内核初始化时会根据物理内存大小和页面大小,初始化一个struct page数组mem_map[]对系统中所有的页面进行统一管理。

物理页面描述

使用Node,Zone,Page三级结构进行管理。

对于NUMA计算机,有多个Node,非NUMA计算机则只有一个Node。

每个Node中有3个Zone,分别为DMA,Normal和HighMem(有的还有DMA32等其他Zone,不是必须,有的有特殊用途,此处忽略)。在32位CPU中,DMA为从3G开始的16M地址空间,Normal为接下来的880M地址空间,HighMem为最后的128M地址空间。在64位CPU中,由于目前只用了48位地址,共256T地址空间,内核态占用高128T地址空间,所有物理内存都可以被映射到内核,所以没有HighMem Zone(其实也是有的,只是跟32位的有区别)。

Page是内核物理内存管理的最小单位,包含各种该页面内存的状态信息,分配状况等。

物理页面分配

使用Buddy,以2的N次方个页面为单位进行内存分配,主要解决外部碎片问题。

物理页面回收

回收类型

内存中并非所有物理页面都是可以进行回收的,内核占用的页不会被换出,只有与用户空间建立了映射关系的物理页面才会被换出。总的来说,以下这些种物理页面可以被 Linux 操作系统回收:

进程映射所占的页面,包括代码段,数据段,堆栈以及动态分配的“存储堆”( malloc 分配的)。

用户空间中通过 mmap()把文件内容映射到内存所占的页面。

匿名页面(没有映射到文件的都是匿名映射,用户空间的堆和栈):进程用户模式下的堆栈以及是使用 mmap 匿名映射的内存区(共享内存 区)。注:堆栈所占页面一般不被换出。

特殊的用于 slab 分配器的缓存,比如用于缓存文件目录结构 dentry 的 cache,以及用于缓存索引节点 inode 的 cache

tmpfs 文件系统使用的页。

回收时机

周期性的检查:这是由后台运行的守护进程 kswapd 完成的。该进程定期检查当前系统的内存使用情况,当发现系统内空闲的物理页面数目少于特定的阈值时,该进程就会发起页面回收的操作。

“内存严重不足”事件的触发:在某些情况下,比如,操作系统忽然需要通过伙伴系统为用户进程分配一大块内存,或者需要创建一个很大的缓冲区,而当时系统中 的内存没有办法提供足够多的物理内存以满足这种内存请求,这时候,操作系统就必须尽快进行页面回收操作,以便释放出一些内存空间从而满足上述的内存请求。 这种页面回收方式也被称作“直接页面回收”。

swap内存管理

在低速磁盘上选定一块空间,以页面大小(通常是4k)为单位划分空间(开头还有4k的swap分区描述结构),以页面为单位进行管理。

虚拟内存管理

内核态虚拟内存管理

内核态虚拟内存分配

使用slab分配器(嵌入式系统使用轻量级slub分配器,大型服务器使用支持大量大内存分配的slob分配器),主要解决外部碎片问题。

在此基础上创建一系列的页面缓存,比如task_struct,inode,file缓存。

kmalloc使用slab创建一系列以2的N次方大小为单位的页面缓存进行内存分配,所以分配的内存的物理连续的,且地址空间位于Normal Zone。

vmalloc与vmalloc使用的分配方法稍有不同,分配的内存可能是屋里不连续的,且映射空间在HighMem Zone。

用户态虚拟内存分配

malloc进行内存分配实际上是通过brk和mmap函数实现的,brk和mmap函数仅仅是在进程的task_struc中创建新的vma,以及为进程创建新的页表,并未进行实际内存分配。

实际内存分配发生在当用户初次访问内存引起的缺页中断中,使用buddy分配器以页面为单位进行分配。

页面缓存管理

命名页面,比如所有的文件或者块设备所对应的页面缓冲,也就是有后备存储的缓冲。在Linux的所有文件或者块设备的IO过程中,除了使用DirectIO方式之外,全部会使用内存进行缓冲。如果使用read/write方式,则会有块缓冲,如果使用mmap方式,则会使用页缓冲。在新版的Linux内核中,这二者已经融为一体,使用相同的不同的数据结构描述相同的数据页面,且对于inode相同的文件或块设备,其缓冲在整个内核中只有唯一的一份。

匿名页面,比如用户态分配的内存,无论是brk还是mmap分配,也就是没有后备存储的页面。

在页面回收时,对于命名页面,如果为脏则陷入后备存储后丢弃,对于匿名页面,如果为脏则写入swap存储。

页面缓存回收使用LRU2Q算法,将不常用的页面释放掉。

用户态可以对命名页面进行控制的函数

fadvise系列函数,控制缓存页面的加载,丢弃。

mlock系列函数,锁定或解锁缓存页面。

mincore函数, 查看命名页面状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jpa 异常捕获_JPA和CMT –为什么捕获持久性异常不够?

jpa 异常捕获使用CMT( 容器管理的事务 )进入EJB和JPA的世界非常舒适。 只需定义一些注释来划分事务边界(或使用默认值)即可,仅此而已–无需摆弄手动开始,提交或回滚操作。 回滚事务的一种方法是从EJB的业务…

linux 线程等待时间,线程超时等待方法 linux中select()函数使用

线程超时等待方法 linux中select()函数使用select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,通过socket函数的声…

使用Spring @Transactional进行数据源路由

卡尔帕帕(Carl Papa)在Spring框架中使用方面来确定要使用的DataSource (读写或只读)启发了我。 所以,我正在写这篇文章。 我必须承认,我对Spring的AbstractRoutingDataSource早已熟悉。 但是我不知道在哪里…

linux应用程序是什么,linux下c开发了一个应用程序,它的扩展名是什么?

这个貌2113似涉及到linux文件系统。linux文件系统与windows的不相同5261,windows系统应该是通4102过文件后缀来进行文件类型是别的,而1653linux虽然也会借鉴后缀信息,但好像不完全依赖于文件后缀。比如,在windows下,讲…

linux服务器带宽设置,linux 系统查看服务器带宽使用

使用linux服务器中,可能刚接触的同学不会查看系统的带宽使用,这里收集了一个脚本,可以实时显示服务器的带宽使用喔~vi cs.sh然后粘贴以下内容:#!/bin/bashif [ -z "$1" ]; thenechoecho usage: $0 network-interfaceech…

moxy json介绍_MOXy的对象图– XML和JSON的输入/输出局部模型

moxy json介绍假设您有一个要公开为RESTful服务的域模型。 问题是您只想输入/输出部分数据。 以前,您将创建一个代表子集的单独模型,然后使用代码在模型之间移动数据。 在EclipseLink 2.5.0中,我们有一个称为“对象图”的新功能,使…

linux设置新硬盘权限,Linux 下挂载新硬盘以及更改为普通权限

1、启动终端,以root用户登录2、查看硬盘信息:#fdisk -l3、进入磁盘,对磁盘进行分区:#fdisk /dev/sda(注意看你要挂载哪一个磁盘,我的是sda,有的是sdb)4、格式化分区:#mkfs.ext3 /dev/sda1 //注&…

使用Payara Micro的Easy Java EE Microservices

想知道如何开始使用Java EE Microservices? 使用Java EE API只需很少的步骤即可部署微服务。 许多人认为Java EE无法与微服务一起使用,但事实并非如此……特别是如果您仅使用服务所需的Java EE规范。 在这篇简短的文章中,我将演示如何使用Jav…

linux终端lex程序运行,lex的简单使用

Lex & Flex 简介Lex是lexical compiler的缩写,是Unix环境下非常著名的工具, Lex (最早是埃里克施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式,而且这个工具所作的行为被详列为 POSIX 标准的一部分…

Linux内存page,Linux虚拟内存管理 - Page Table的作用

虚拟内存的作用:1.扩展实际有限的物理内存,当然这种扩展是虚拟的,比如物理内存512M,对于一个需要1G空间的进程来说,照样可以运行。这增加了操作系统是应用范围。2.使得进程中的数据空间增大,增大到多少与硬…

entitymanager_实体管理器的类型:应用程序管理的EntityManager

entitymanagerJPA规范定义了几种类型的EntityManagers / Persistence Context。 我们可以有: 扩展和事务范围的EntityManager, 容器管理或应用程序管理的EntityManager。 JTA或本地资源EntityManager, 除了上述区别之外,我们还…

linux安装无法添加挂载,linux-无法在已挂载/ etc / passwd和/ etc / shadow的docker容器中添加新用户...

问题示例:docker run -ti -v my_passwd:/etc/passwd -v my_shadow:/etc/shadow --rm centos[root681a5489f3b0 /]# useradd test # does not work !?useradd: failure while writing changes to /etc/passwd[root681a5489f3b0 /]# ll /etc/passwd /etc/shadow # pe…

CDI中的事务异常处理

在Java EE中,在执行事务性业务方法期间引发的异常导致事务回滚。 但是,只有系统异常(即运行时异常)才是这种情况,该方法异常未在方法签名中声明。 对于应用程序异常(即检查的异常)或任何带Appl…

openoffice+linux+jodconverter+乱码,OpenOffice安装和转换乱码解决方案

前言:OpenOffice项目中用途:word转换pdfWindows安装、转换:安装包下载后一路OK就可以正常安装,转换没有问题Linux安装、转换:安装有分DEB包和RPM包,下面会说明各自安装方法在en_US.UTF-8 系统环境下会出现乱…

linux常用操作符,Shell常用操作符总结

一、算术操作 - * / %二、关系操作> < ! && ||三、测试操作测试命令 : test [ ] [[ ]] (( ))1、测试文件状态-d 目录-b 块设备-s 文件长度 > 0、非空-f 正规文件-w 可写-L 符号连接-u 文件有 suid 位设置-r 可读…

junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例

junit 参数化测试用例几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&…

华硕台式机安装linux进不去系统,[已解决]求助,无法进入系统

之前一直用arch系统盘&#xff0c;Windows系统盘是在另一台电脑上的&#xff0c;我另外一台电脑昨天摔了&#xff0c;我还以为是硬盘坏了&#xff0c;把这块windows硬盘换到这台华硕主板的电脑&#xff0c;发现硬盘没坏。我于是把windows硬盘从机箱拿出来&#xff0c;现在碰到了…

处理JAX-RS中的自定义异常类型

JAX-RS支持处理自定义异常&#xff08;以EJB或CID Bean形式抛出&#xff09;以处理自定义HTTP响应。 假设我们有一个“异常” EJB&#xff1a; Stateless public class Hello {public String greeting() {if (new Random().nextBoolean())throw new GreetingException("…

MX250和第三方Linux版区别,MX250和MX350哪个好一点,区别和差距在哪里?求推荐?_科技数码通...

MX350系列显卡使笔记本颜值变得更高&#xff0c;性能更强&#xff0c;更轻便&#xff0c;在轻便笔记本需求变得越来越大&#xff0c;但性能也要求越来越高&#xff0c;特别是在图像处理方面&#xff0c;这个时候MX系列的显卡便应运而生&#xff0c;其拥有者超低的功耗&#xff…

linux r包默认安装位置,R-Language(R语言或称r-project)的安装

1、R语言的简介R语言(r-project)是主要用于统计分析、绘图的语言和操作环境。2、配置yum源2.1、安装说明由于编译安装相对繁琐&#xff0c;故而安装使用repoforge的源解决&#xff0c;免去编译的麻烦。注意&#xff1a;请根据实际的系统OS版本选取合适的YUM源。2.3、rpmforge源…