MemoryHierarchy
  为了理解内核中的页替换算法,有必要认识linux中的存储体系分层架构、访问模式以及混合工作mixed workloads.

存储器分层架构
  有两种类型的存储分层架构。第一种是我们熟知的架构:从最顶端的cpu cache 到 最顶层的RAM内存的层级结构。其中在金字塔模型的最顶端的L1级cache最靠近cpu,cpu访问它的速度也最快,但是容量却最小;而靠近金字塔底端的附近的其他cahces(这些caches可以作为L2级和/或L3级,但是仍然比RAM要快)容量更大,但是访问速度比L1级cache更慢。

这种架构下最有效的访存方式为:cpu迅速的重复访问某一小部分数据,于此同时还缓存了更大量的数据。这种假设的本质就是:程序在一段时间内访问的数据都集中/缓存在L1 cahce(这样cache命中率更高,速度更快),短期类只进行少量的其他数据。

这样的cache层级架构是存在着一种超集关系:L1 cache中的数据在 L2级cache以及内存中也一定存在;只要L1级中的数据还在,L2级cache中的某一行与之对应的数据不能被替换出去;当L1级cache要访问不久前刚访问的数据,但是又不在L1中,而这些数据很有可能还缓存在L2 cache中,这时候就可以从L2 cache加载回L1 cache.

第二种类型的层级架构比较特别:即使第一层级的数据还在,对应的第二层级的cache也能够将这组数据替换出去,这在一些存储服务器上比较常见,如NFS或Samba服务器以及其他的NAS/SAN设备。这种分层模型最典型的情况是:最顶层是本地工作站或计算节点的RAM,而最底层是存储服务器的cache。

访问方式
  有几种以LRU作为替换策略的访存情形。

流式IO
  流式IO访问在文件服务器上是一种较为普遍的访问方式,文件服务器为客户端提供各种文件服务。如多媒体应用、存储备份等等。

LRU基于“最近被访问的页很可能很快将再次被访问”的替换策略并不适用于流式IO场景。在流媒体应用中,下一次被访问的数据页很可能是从来没有访问过的;而已经访问过的页很可能在很长一段时间内再也不会去访问。

因而在这样的使用场景中,cache替换算法需要仔细研究对症下药。

垃圾回收
  垃圾回收意味着程序不用显式的释放它们不再使用的内存,也不会再重用上次使用过的内存。此外,垃圾回收程序会扫描大片的内存区域并且和其他程序访存方式完全不同。

交互式用户程序
  用户经常希望计算机有快速的响应能力、更好的交互体验。考虑这样一种比较普遍的场景:当用户正在计算机上看电影或者看邮件时,另外一个用户任务(如浏览器)一般都会被暂时搁置或低优先级处理;当用户再切换回浏览器应用时,他们当然期望浏览器程序仍然还缓存在内存中以能够快速的响应。然而,用户刚才访问过的其他数据在将来的一段时间将不会再被访问,那还有必要将其他数据刷出cache而保留刚才访问过的应用程序数据么?

所以针对这种应用场景,也需要特别的替换算法来处理。

文件服务器 / secondary cache
  在文件服务器系统中,客户端会将访问最频繁的页面缓存起来,这样一来,服务器端最近访问过的文件一旦缓存到客户端后很可能在一段时间内都不会再被访问到。实际上在上一次访问某页之后到再次访问到这个页,这中间可能已经访问了许多其他页面了,这样的话,之前访问的那个页面(按照LRU算法)早已经被替换出cache了。

为了检测出哪个页面在文件服务器端访问的最频繁,VM需要记住替换出去的页面的一些信息,正如NonResidentPages(非驻留内存页面)描述的一样。一旦VM了解到哪些页面被访问的最频繁,他们就会被缓存起来而不会被其他页面替换出去。

要注意的是,在文件服务器端访问最频繁的页面不一定在客户端也频繁访问。相反,理想状态下,文件服务器端和客户端缓存不同的页面,这样文件服务器缓存可以和客户端互补,避免重复。

Mixed Workloads
  典型的计算机系统中跑着各种各样的不同程序,VM需要均衡这些不同任务的内存使用以保持各个任务的性能和响应能力在一个可接受范围内。

Graceful Degradation
  当系统超负荷运行,系统性能就会慢慢降低,而不会立刻崩溃。为了能够防止这种情况,我们不仅需要进行一些负载控制和认为干涉,我们还需要知道如何可靠的检测到系统超负荷运转。这种检测可能需要集成到页面替换机制中去。

LinuxMM--MemoryHierarchy的更多相关文章

  1. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  2. Linux 内核的文件 Cache 管理机制介绍

    Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...

  3. linux内核调试指南

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  4. linux page cache和buffer cache

    主要区别是,buffer cache缓存元信息,page cache缓存文件数据 buffer 与 cache 是作为磁盘文件缓存(磁盘高速缓存disk cache)来使用,主要目的提高文件系统系性能 ...

  5. Linux 内核的文件 Cache 管理机制介绍-ibm

    https://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使 ...

  6. mmtests使用简介

    1.简介 mmtests是一个可配置的测试套件,可以被MM开发者用来进行一个常规测试.理想情况下,它可以与LTP,xfstests等测试工具结合起来实现自动化测试. 2.软件组织 run-mmtest ...

  7. 加速 lucene 的搜索速度 ImproveSearchingSpeed

    * Be sure you really need to speed things up. Many of the ideas here are simple to try, but others w ...

  8. 如何展开Linux Memory Management学习?

    Linux的进程和内存是两座大山,没有翻过这两座大山对于内核的理解始终是不完整的. 关于Linux内存管理,在开始之前做些准备工作. 首先bing到了Quora的<How can one rea ...

  9. linux状态及原理全剖析

    Table of Contents 1 linux 1.1 proc filesystem 1.1.1 /proc 1.1.1.1 /proc/meminfo 1.1.1.2 /proc/stat 1 ...

随机推荐

  1. 关于已配置log4j,运行tomcat时显示警告的分析

    有时候,我们在JavaEE项目中配置了log4j及其参数信息,但是启动tomcat时,仍会显示如下信息:

  2. 短视频APP+不同类型社交应用发展分析+化妆品电商

    短视频APP——昙花一现还是发展趋势? 在这个互联网与科技并行且飞速发展的时代,各种app不断涌入市场,其中短视频app便是一个典型,美拍,就成功入围2014年十大最火app.而短视频app也势必要成 ...

  3. 记一次项目中的css样式复用

    本文同步至微信公众号:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401616238&idx=1&sn=3c6e9 ...

  4. 对 clear:both 这个样式的一些理解

    看下我今天一直研究的两个例子吧.希望对自己跟大家有帮助: 例子一: <!DOCTYPE html> <html> <head lang="en"> ...

  5. 深入理解js——作用域

    "javaScript没有块级作用域",所谓"块",就是{}中间的内容.所以在声明变量的时候不要在"块"里面,要在一开始声明就好了. 其实j ...

  6. spring mvc 4.3.2 + mybatis 3.4.1 + mysql 5.7.14 +shiro 幼儿园收费系统 之 动态组合条件查询

    实际应用中,系统设计无法预料到用户最终的查询条件是怎样的.通常的做法是给出一些限制死的查询条件让用户查询.业务稍有改动,就要重新设计界面,增加查询字段等,费时费力. 比较好的做法是,除了常用的查询外, ...

  7. JavaScript流程控制语句

    一.JavaScript分支语句 -alert()    弹出警告对话框 -prompt() 弹出输入框 1.if(){}else{} 栗子: var num=prompt("请输入电话号码 ...

  8. Interpreter(解释器)-类行为型模式

    1.意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.动机 如果一种特定类型的问题发生的频率足够高,那么可能就值的将该问题的各个实例表述为一个 ...

  9. @SpringBootApplication

    1. spring 文档说明 Many Spring Boot developers always have their main class annotated with @Configuratio ...

  10. laravel(一):如何安装laravel

    1.前提条件 本文针对想从零开始开发 Laravel 程序的初学者,不需要预先具备任何的 Laravel 使用经验.不过,为了能顺利阅读,还是需要事先安装好一些软件: PHP 5.4 及以上版本 包管 ...