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. Android之TextView灵活使用(转载)

    在项目中有无遇到过这样一种程况,例如文字"王明今年10岁了", 但是数字10是从网络返回的数据, 而你又想把这个文字写在xml中, 过往我的做法是分成3个TextView, 实现愚 ...

  2. mobx源码解读4

    这节介绍一下mobx的变动因子的稳定性. mobx整个系统是由ObservableValue, ComputedValue, Reaction这三个东西构建的 ObservableValue 是最小的 ...

  3. Sublime文本排序&查找重复行&删除重复行

    排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...

  4. 初识Android NDK

    本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...

  5. linux c学习笔记08--文件操作

    1 . 创建int creat(const char *filename, mode_t mode);参数 mode 指定新建文件的存取权限,它同 umask 一起决定文件的最终权限( mode&am ...

  6. 阿里中间件——diamond

    一.前言 最近工作不忙闲来无事,仔细分析了公司整个项目架构,发现用到了很多阿里巴巴集团开源的框架,今天要介绍的是中间件diamond. 二.diamond学习笔记 1.diamond简介 diamon ...

  7. linux 学习7 用户管理相关文件 r

    7.1.用户配置文件 7.2.用户管理相关文件 7.3.用户管理命令 7.4.用户组管理命令 删除用户userdel [root@localhost ~]# userdel [-r] 用户名 //一定 ...

  8. (转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍

    AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...

  9. c++面试题

    转自http://blog.csdn.net/jingxuewang110/article/details/6789557/ 1.new.delete.malloc.free关系 delete会调用对 ...

  10. 两个APP之间怎么调用《IT蓝豹》

    两个app之间怎么调用?   (1):通过显示Intent 启动    首先:配置好B app 的action,即AndroidManifest.xml中声明 <intent-filter> ...