转自:https://blog.csdn.net/yiyeguzhou100/article/details/78085857

mlock实现原理及应用
 
1 mlock简介
 
1) mlock(memory locking)是内核实现锁定内存的一种机制,用来将进程使用的部分或
全部虚拟内存锁定到物理内存。
 
2) mlock机制主要有以下功能:
a)被锁定的物理内存在被解锁或进程退出前,不会被页回收流程处理。
b)被锁定的物理内存,不会被交换到swap设备。
c)进程执行mlock操作时,内核会立刻分配物理内存(注意COW的情况)。
 
2 mlock原理
1) 每个进程都拥有一段连续的虚拟内存,内核并不是以整个虚拟内存为管理单位,而是将
整个虚拟内存划分为若干个虚拟内存区域。
2) 内核中使用vm_area_struct数据结构来管理虚拟内存区域,简称vma。vma管理虚拟内
存的方式如下图所示:
3) 每一个vma代表一个已映射的、连续的且属性相同(如可读/写)的虚拟内存区域。内核采用链表和
AVL树形式管理vma,其中链表用于遍历,AVL树用来查找(VMA的两种数据结构组织形式,就像pid的三种组织形式一样)。
4) mlock操作会给相应的vma的vm_flags置一个VM_LOCKED标记,而这个标记则会影响到物理内存回收和交换。 
#define VM_LOCKED 0x00002000
5) Linux分配内存到page且只能按页锁定内存,所以指定的地址会被round down到下一个page的边界。
6) 当mlock锁定的虚拟内存区域跟现有vma管理的虚拟内存区域并不完全重合时,由于同一个vma的内存属性要求一致,而VM_LOCKED标记也是其属性,因此会导致现有的vma被合并或分割,如下图所示:
说明:
 a) prev与next是已受链表管理的vma结构,new是将要新加入链表的vma。
 b) 当new加入时,如果new的起始地址与prev的结束地址相同,且new属性与prev属性均为VM_LOCKED
,则将prev和new合并成prev’。
 c) 如果new的结束地址与next的起始地址有重合,但next属性是VM_EXEC,则next被分割成两部分,一部分加入
prev’,另一部分变成next’。
 
7) 操作系统通过LRU算法来管理Linux进程的虚拟内存,LRU算法主要通过两个页面标志
符(PG_active和 PG_referenced)来标识某个页面的活跃程度,
从而决定页面如何在两个链表(active_list和inactive_list)之间进行移动。
8) 内核函数vmscan会遍历扫描active_list和inactive_list链表来回收页面。
9) 内核在LRU算法中新增了一个unevictable_list链表,将不可回收的页面都放在unevictable_list
中,mlock的页面就被放在unevictable_list中,同时给该页置一个PG_mlocked标记。
 
注:除了mlock的页,ramdisk或ramfs页以及共享内存映射的页也被放入unevictable_list中。
 
10) 解锁并不立刻将解锁的页回收,而是将解锁的页放回active_list或inactive_list链表,然后交由页回收流程处理,所以mlock的页不会被页回收流程处理。
11) 由于线程共享进程资源,所以线程的vma将继承VM_LOCKED标记。但fork后的子进程的vma并不继承VM_LOCKED
标记,以及调用exec执行其它程序时,不继承VM_LOCKED标记。
 
3 mlock函数
mlock机制通过提供四个函数来使用,如下所示:
 
注:
1) 上述函数只能由root用户执行。
2) mlock操作不可叠加,多次调用mlock的一段内存会被一次unlock解锁。
3) 锁定进程所有映射到地址空间的数据包括:代码、数据、栈片段分页,共享库、用户空间内核数据、
共享内存以及内存映射的文件
 
4 mlock应用
1) mlock机制在虚拟化中的应用
libvirt已提供对mlock支持,可以通过在Guest的xml文件中添加如下内容来开启qemu-kvm进程的mlock
机制
<memoryBacking> 
<locked/> 
</memoryBacking> 
 
注:默认情况下qemu-kvm进程中的mlock选项是关闭的。
 
2) mlock机制在实时环境下的应用 
mlocked  访问内存产生page fault次数 访问内存时间开销
on  1  低
off  >1  高
 
说明:
a) 采用mlock机制时,仅在虚拟内存和物理内存建立映射关系时产生一次page fault。
b) 未采用mlock机制时,每当访问不同的虚拟内存单元时,就会产生一次page fault。
 
3) mlock机制在多线程环境下的应用
mlocked  线程栈空间映射物理内存大小 映射物理内存时间开销
on  10MB  高
off  1MB  低
 
注: 
a) 假设线程整个栈空间大小10MB,其中1MB空间已使用。
b) 假设10MB虚拟内存和物理内存建立映射关系耗时1ms,1MB虚拟内存和物理内存建立映射关系
耗时0.1ms。
 
说明: 
当进程涉及多线程操作时:
a) 采用mlock机制时,线程整个栈空间10MB会被映射到物理内存,若一个进程中有2000
个线程,则线程栈空间和物理内存建立映射关系共耗时2000ms。
b) 未采用mlock机制时,线程栈空间已使用的1MB会被映射到物理内存,若一个进程中有2000
个线程,则线程栈空间和物理内存建立映射关系共耗时200ms。

mlock实现原理及应用【转】的更多相关文章

  1. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  2. android IPC及原理简介

    什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发.   Linux ...

  3. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析[转]

    前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户 ...

  4. 深入理解 Android 消息机制原理

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文讲述的是Android的消息机制原理,从Java到Native代码进行了梳理,并结合其中使用到的Epoll模型予以介 ...

  5. HDFS集中式的缓存管理原理与代码剖析--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=468 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache ...

  6. HDFS集中式的缓存管理原理与代码剖析

    转载自:http://www.infoq.com/cn/articles/hdfs-centralized-cache/ HDFS集中式的缓存管理原理与代码剖析 Hadoop 2.3.0已经发布了,其 ...

  7. mlock家族:锁定物理内存【转】

    转自:http://blog.csdn.net/fjt19900921/article/details/8074541 锁住内存是为了防止这段内存被操作系统swap掉.并且由于此操作风险高,仅超级用户 ...

  8. Input系统—ANR原理分析(转)

    一. 概述 当input事件处理得慢就会触发ANR,那ANR内部原理是什么,哪些场景会产生ANR呢. “工欲善其事必先利其器”,为了理解input ANR原理,前面几篇文章疏通了整个input框架的处 ...

  9. Android10_原理机制系列_事件传递机制

    前言和概述 Android的输入设备,最常用的就是 触摸屏和按键 了.当然还有其他方式,比如游戏手柄,比如支持OTG设备,则可以链接鼠标.键盘等. 那么这些设备的操作 是如何传递到系统 并 控制界面的 ...

随机推荐

  1. u-boot(四)命令实现

    目录 u-boot(四)命令实现 分析run_command 小结 自定义一个命令 代码 makefile title: u-boot(四)命令实现 tags: linux date: 2018-09 ...

  2. printf不定参数

    title: printf不定参数 tags: C ARM date: 2018-10-21 12:14:58 --- 不定参数的传递 函数调用时参数传递是使用堆栈来实现的,参数入栈顺序是从右向左,在 ...

  3. 利用 JMetal 实现大规模聚类问题的研究(一)JMetal配置

    研究多目标优化问题,往往需要做实验来对比效果,所以需要很多多目标方面的经典代码,比如NSGA-II, SPEA, MOEA,MOEA/D, 或者PSO等等. 想亲自实现这些代码,非常浪费时间,还有可能 ...

  4. getResource()和getResourceAsStream以及路径问题【转】【补】

    一 getResource 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就 ...

  5. JQuery和ASP.NET分别实现级联下拉框效果

    在学习JQuery之前知道下拉框的级联效果可以通过asp.net控件实现,现在学习了JQuery,知道了JQuery和select也能实现.我分别举两个小例子说明这两种方法如何实现. 1.用JQuer ...

  6. java操作数据库:分页查询

    直接上.... 还是用之前的goods表,增加了一些数据 1.实体类Goods // 封装数据 public class Goods { private int gid; private String ...

  7. 【BZOJ3697】采药人的路径 点分治

    [BZOJ3697]采药人的路径 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是 ...

  8. 双系统中卸载Ubuntu后又efi系统分区删除方法

    参考:https://blog.csdn.net/qq_28057541/article/details/51723914 首先 window键(窗口键) + R ,然后输入 Diskpart 打开命 ...

  9. 1.2 认识python(了解)

    一.Python发展背景 Python的作者,Guido von Rossum(吉多·范·罗苏姆,中国Python程序员都叫他 龟叔),荷兰人.1982年,龟叔从阿姆斯特丹大学获得了数学和计算机硕士学 ...

  10. 迅为IMX6开发板支持全网通4G模块丨GPS模块丨WIFI蓝牙丨千兆以太网

    迅为i.MX6开发板丨迅为i.MX6Q开发板丨四核imx6开发板丨Cortec-A9开发板丨资料介绍: 特点: 处理器:Freescale Cortex-A9四核i.MX6Q主频1GHz 核心板配置: ...