以前在项目中,大家为了避免自己使用的page被换出,使用的方式是mlock,从mlock的实现的看,它限制了page被swap,

然后在一个swap off的系统中,这样其实和mlock调用与否没有关系了。

我们使用mlock,最终的目标无非了latency,但是mlock却没有阻止内核将页面进行迁移,也就是虽然保证了对应的虚拟地址

访问的时候不会需要swap迁入,但无法保证对应的物理页面和虚拟地址对应关系不变,如果变化了,访问该虚拟地址的话,还会

出现pagefault,虽然不会io,但对于实时性要求高的场景,依然不爽。

有人提出,干脆pin住内存吧,也就是不让他swap,也不让他迁移,这样物理页面和虚拟地址的对应关系一直不变,是不是就解决了

这个问题呢?这样就带来了一个问题,既然你可以pin住那么多内存,相当于在mm的地盘划出来了一片自留地,这种虽然比系统上电

的时候reserve部分内存,改动起来方便一些,但就不好管理了,为了更好地追踪这个pin住的页面,就有必要固定页保留在单独的虚拟内存区域(VMA)中,

该区域用 VM_PINNED标志标记(不过我在较新的内核中也没找到这个合入)?

这个pin住的页面和我们 mdev中看到的

    .pin_pages      = vfio_iommu_type1_pin_pages,
    .unpin_pages        = vfio_iommu_type1_unpin_pages,
是一样的么?不是的,从实现可以看出,这个pin_pages只是加了引用计数,这个页面的物理地址和虚拟地址映射保持不变,但没有防止它被swap。
 
总而言之:

vfio_iommu_type1_pin_pages内部是通过try_get_page(page)struct page_refcount加一,来实现所谓的「pin住内存」的效果的。这样做的实际效果是:

  • 该物理页仍可以被换出
  • 该页不会被迁移,即虚拟地址和物理地址的对应关系被锁定

另一方面,mlock系统调用的「锁住内存」,其含义则是:

  • 内存不会被换出
  • 内存可以被迁移,即虚拟地址不变,物理地址改变

而mpin的实现,则是两者的交集,即不会换出,也不会改变映射关系,它处于nomoveable区域。具体可以参考《https://lwn.net/Articles/600502/》。

从统计的角度说,目前使用pin_pages方式pin住的内存,统计计数也是放在

mm->locked_vm 中,这个和mlock调用并lock的内存是放在同一个成员,并没有区分。

what the difference betweent pin page and lock page ?的更多相关文章

  1. Library Cache: Lock, Pin and Load Lock

    What is "Library cache lock" ? This event controls the concurrency between clients of the ...

  2. 外键约束列并没有导致大量建筑指数library cache pin/library cache lock

    外键约束列并没有导致大量建筑指数library cache pin/library cache lock 清除一个100大数据表超过一百万线,发现已经运行了几个小时: delete B001.T_B1 ...

  3. Add custom and listview web part to a page in wiki page using powershell

    As we know, Adding list view web part is different from custom web part using powershell, what's mor ...

  4. Page Cache与Page回写

    综述 Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能.此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page ...

  5. page cache 与 page buffer 转

    page cache 与 page buffer 标签: cachebuffer磁盘treelinux脚本 2012-05-07 20:47 2905人阅读 评论(0) 收藏 举报  分类: 内核编程 ...

  6. Response.Write,Page.RegisterClientScriptBlock和Page.RegisterStartupScript的区别

    Response.Write("<script>");输出在文件头部,一打开就执行. RegisterClientScriptBlock一般返回的是客户端函数的包装, ...

  7. man page ,info page 和/usr/share/doc/整理自鸟哥

    - 比如查看date指令   - 命令:vbird@www ~]$ man date   - 返回示例(部分):DATE(1) User Commands DATE(1)   - 部分释义(注释2): ...

  8. 【Linux】在线求助man page与info page

    先来了解一下Linux有多少命令呢?在文本模式下,你可以直接按下两个[Tab]按键,看看总共有多少命令可以让你用? [knife@www ~]$ <==在这里不要输入任何字符,直接输入两次[ta ...

  9. man page及info page用法

    Linux系统的在线求助man page与info page 先来了解一下Linux有多少命令呢?在文本模式下,你可以直接按下两个[Tab]按键,看看总共有多少命令可以让你用? [vbird@www ...

随机推荐

  1. DOM树

    一.DOM树一共有12种节点类型,常用的有4种: 1.Document类型(document节点)--DOM的"入口点" 2.Element节点(元素节点)--HTML标签,树构建 ...

  2. 隐私计算FATE-模型训练

    一.说明 本文分享基于 Fate 自带的测试样例,进行 纵向逻辑回归 算法的模型训练,并且通过 FATE Board 可视化查看结果. 本文的内容为基于 <隐私计算FATE-概念与单机部署指南& ...

  3. 2分钟实现一个Vue实时直播系统

    前言 我们在不敲代码的时候可能会去看游戏直播,那么是前台怎么实现的呢?下面我们来讲一下.第一步,购买云直播服务 首先,你必须去阿里云或者腾讯云注册一个直播服务.也花不了几个钱,练手的话,几十块钱就够了 ...

  4. ABAP CDS DDHEADANNO

  5. Turtle绘图——python简单上手小案例

    Turtle绘图 Turtle模块提供了在二维平面上移动的环境. Turtle可以实现位置.航向和各种可能的状态和动作. import turtle as tu roo = tu.Turtle() # ...

  6. 虚拟机使用docker 外部机器无法访问端口问题

    1,排查防火墙firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接 ...

  7. 013(oulipo)

    题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1455 题目描述:在母串里找子串出现的次数 题目思路:与字符串的搜索有关那就立刻找到哈希 从s[1 ...

  8. java中的内存划分和一个数组的内存图

    内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存   Java虚拟机要运行程序 ...

  9. 迷宫类dp整合

    这是迷宫类dp我自己取的名字,通常比较简单,上货 简单模型 数字三角形 状态表示:f[i][j]表示起点第\(i\)行第\(j\)个数最短路径的长度 状态转移:\(f[i][j] = max(f[i ...

  10. Seata-初体验以及避坑

    Seata是什么 这里引用官方解释 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用 ...