Linux C lock pages
虚拟内存按页划分,我们可以明确告诉系统:某一个虚拟内存页需要和实际内存帧相关联。这样一来,该内存页就被换进来了,而且不会被系统换出去。这一行为叫做锁页(locking a page)。
一般来讲页的换进换出是透明的,一般程序接触不到这一层。但是呢,锁页可以为我们带来如下好处:
1、速度:如果你的程序对速度有严格的要求,页错误导致页的换进换出会浪费掉一定的事件。当然为了提高程序速度,你可能还需要提高程序的优先级。
2、隐私安全:没错锁页可以让你的程序更加安全。如果你的密码恰好存放在某一页上,而这一页恰好被换出到硬盘的交换区,别人就有更多的机会获取你的密码了。
然而你不能锁太多的页(这样就抢了别的程序的资源)
具体细节:
内存锁只面向虚拟页,实际内存我们不关心。一个实际内存页可以对应多个虚拟内存页,只要有一个虚拟内存页是锁着的,实际物理内存页就不会被换出。
你不可以给一个虚拟内存页叠加锁,最多只能有一把锁。
内存锁在两种情况下会被解开:1、进程自行解锁,2、进程退出,一个进程对应一个虚拟内存,这时候其对应的虚拟内存无效,可以理解虚拟内存页解锁了(门都没了还要锁干嘛?)。
内存锁无法被子进程继承,(注意:现在的UNIX系统中,一旦进行fork操作产生子进程后,子进程和父进程的虚拟内存对应这相同的实际内存帧页。虽然没有继承锁,但实际享受到了所带来的好处)
由于会对其他进程带来影响,所以只有超级用户才可以锁页。但任何进程都可以解锁页。
系统会对一个进程可以锁多少内存加以限制。
即便两个虚拟内存页没有共享内存,但内核仍可能会把两个虚拟内存页关联到同一个内存帧。(事关效率,两个虚拟内存页具有完全相同的数据,为何要用两个不同的内存帧与之对应)如果有一个虚拟内存页发生数据修改,内核会进行写时复制(copy-on-write)。
相关函数:
mlock:
int mlock (const void *addr, size_t len)
//以addr为起始地址,len为长度的内存块所在页锁起来。(如果页本来被唤出了,这时候页会被调入,然后锁起来)
//返回值详见man手册
munlock:
int munlock (const void *addr, size_t len)
//执行与mlock相反的操作,解锁
还有其他的一些函数: mlockall和unmallocall。不多介绍了。
Linux C lock pages的更多相关文章
- Linux传统Huge Pages与Transparent Huge Pages再次学习总结
Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages).Huge Pages有时候也翻译成大页/标准大页/传统大页,它们都是Hu ...
- Linux Kernel Synchronization && Mutual Exclusion、Linux Kernel Lock Mechanism Summarize
目录 . 内核锁机制 . 同步与互斥 . 锁定内存总线原子操作 . 信号量 . 自旋锁 . RCU机制 . PERCPU变量 . 内存和优化屏障 . 读者/写者锁 . 大内核锁 . 互斥量 1. 内核 ...
- Linux Transparent Huge Pages 对 Oracle 的影响
1 Transparent Huge Pages 说明 官网上有2篇文章对THP 做了说明: https://access.redhat.com/solutions/46111 https://acc ...
- SQL Server 2017 on Linux
此文转载,原文地址:https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-whats-new CTP 2.0 The CTP 2.0 ...
- [Linux] Linux下谁在消耗我们的cache
一.缘由: 曾经看到MySQL服务器上Cache占用特别大,其实大家都知道这是合理的,这些都是可用内存: 那么问题来了,是谁在占用这些Cache呢?如果去掉不合理的Cache占用,系统内存会更充分的得 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- mutex,thread(c++11 windows linux三种方式)
一 c++11 windows linux三种方式 //#include <stdio.h> //#include <stdlib.h> //#include <uni ...
- 转:如何在32位程序中突破地址空间4G的限制
//如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...
- 配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations
配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations 目录表->页表->物理内存页 看这篇文章之前可以先看一下下面这篇文章 ...
随机推荐
- js实现金额小写转大写
function convertCurrency(currencyDigits) { var MAXIMUM_NUMBER = 1000000000000.00; var CN_ZERO = &quo ...
- 【p081】ISBN号码
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定 ...
- spring boot中servlet启动原理
启动过程及原理 1 spring boot 应用启动运行run方法 StopWatch stopWatch = new StopWatch(); stopWatch.start(); Configur ...
- Cocos2D-html5 公布游戏js编译为jsc
搞了老半天.这么回事啊.工具都在tools中. jsb模式下是通过打包spidermonkey来执行JS代码的. JS文件都在assets目录中.我们都知道assets目录.打包后的结果,将apk包解 ...
- CentOS 7安装fcitx中文输入法
安装过程例如以下: 1.增加EPEL源 EPEL7差点儿是CentOS必备的源: sudo yum install epel-release 2.加入mosquito-myrepo源 mosquito ...
- 【poj3225】Help with Intervals
Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12084 Accepted: 3033 Case Time Limit ...
- [Ramda] Convert a Promise.all Result to an Object with Ramda's zip and zipObj
In this lesson, we'll use Promise.all to get an array that contains the resolved values from multipl ...
- oracle表空间查询维护命令大全之中的一个(数据表空间)史上最全
表空间是数据库的逻辑划分,一个表空间仅仅能属于一个数据库. 全部的数据库对象都存放在建立指定的表空间中.但主要存放的是表, 所以称作表空间.在oracle 数据库中至少存在一个表空间.即S ...
- Docker for Windows 安装
原文:Docker for Windows 安装 前言: 环境:windows10专业版 64位 正文: 官方下载地址:https://hub.docker.com/editions/communit ...
- Cordova各种事件
原文:Cordova各种事件 Cordova事件 Cordova框架了一组事件,开发者用来对某些运行Cordova应用的设备上的事件作出反应.事件处理的一种情况是硬件相关活动,如电池状态变化或用户按了 ...