文档章节

Linux内存及页面缓存管理概要总结

LastRitter
 LastRitter
发布于 2017/09/14 09:17
字数 1582
阅读 934
收藏 18
点赞 2
评论 0

物理内存管理

页面内存管理

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函数, 查看命名页面状态。

© 著作权归作者所有

共有 人打赏支持
LastRitter
粉丝 34
博文 36
码字总数 168045
作品 0
武汉
高级程序员
Oracle Linux 系统如何去注册使用坚不可摧 Linux 网络(ULN)

大多数人都知道 RHEL 的订阅 ,但是知道 Oracle 订阅及细节的人却很少。 甚至我也不知道关于它的信息,我是最近才了解了有关它的信息,想将这些内容共享给其他人。因此写了这篇文章,它将指导...

01% ⋅ 06/18 ⋅ 0

深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo ⋅ 04/20 ⋅ 0

Linux的page cache使用情况/命中率查看和操控

这里总结几个Linux文件缓存(page cache)使用情况、命中率查看的工具。 perf-tools里面的cachestat 来自于大名鼎鼎的Brendan Gregg的cachestat,已经被加到他的perf-tools http://www.brendan...

21cnbao ⋅ 05/25 ⋅ 0

linux2.6.28内核对页面置换算法的改进--理论

最新的2.6.28放出来了,以前很欣赏windows的内存管理,看来linux也不甘示弱,追上来了,我觉得新内核的页面置换算法非常好。新内核采用 了双指针时钟置换算法,这样的话每次就不用扫描整个页...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

HBase最佳实践-管好你的操作系统

本文由 网易云 发布 作者:范欣欣 本篇文章仅限本站分享,如需转载,请联系网易获取授权。 操作系统这个话题其实很早就想拿出来和大家分享,拖到现在一方面是因为对其中各种理论理解并不十分...

wangyiyungw ⋅ 05/07 ⋅ 0

阿里linux内核月报201702

The future of the page cache 持久化内存用得越来越多, 促使了内核的一系列变更, 内核是否还真的需要页面缓存呢? 在2017 linux.conf.au会上, Matthew Wilcox先是纠正了数年前的一个错误...

wdjjwb ⋅ 05/22 ⋅ 0

Linux性能监控工具收集(转)

一、基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令。同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能够使你对...

easonjim ⋅ 2017/12/24 ⋅ 0

kswapd和pdflush

首 先,它们存在的目的不同,kswap的作用是管理内存,pdflush的作用是同步内存和磁盘,当然因为数据写入磁盘前可能会换存在内存,这些缓存真正写 入磁盘由三个原因趋势:1.用户要求缓存马上写...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

Linux内核内存管理算法Buddy和Slab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管...

p23onzq ⋅ 04/12 ⋅ 0

Slab,小对象也能搞出大事情

排查内存使用(泄露、耗尽)问题的一个的技巧是,区分“批发商”和“零售商”这两类不同的内存管理机制。这里的“批发商”,指的是按页面管理并分配内存的机制。而“零售商”,则是指从“批发...

声东 ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 38分钟前 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 42分钟前 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 42分钟前 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 50分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 50分钟前 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 54分钟前 ⋅ 0

Jira接入钉钉机器人

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.9Z9czj&treeId=257&articleId=106075&docType=1...

谢思华 ⋅ 56分钟前 ⋅ 0

微信公众号开发

一、开通微信服务号,填写URL,微信将想你发送验证信息。接收并处理微信发来的GET请求 二、处理客户向公众号发送的各种消息: 如文本、图片、乐音、视频、音乐 : 消息分为:1 请求消息(文本...

无敌小学僧 ⋅ 今天 ⋅ 0

广州三本找Java实习经历

前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应该会...

Java3y ⋅ 今天 ⋅ 0

php json_encode()不转义中文字符 和 斜杠"/"

php格式化json的函数 json_encode($value,$options) 其中有2个比较常用到的参数 JSON_UNESCAPED_UNICODE (中文不转为unicode ,对应的数字 256) JSON_UNESCAPED_SLASHES (不转义斜杠,对应的...

一只大橘子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部