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匿名自执行函数
匿名自执行函数:没有方法名的函数闭包:闭包是指有权访问另一个函数作用域变量的函数: 通过一个实例来解释: 从网上找到了一个案例,使用了for循环.匿名自执行函数.setTimeout. 案例1: va ...
- C语言实现使用动态数组来构造栈结构
我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...
- 嵌入式project师考试知识点总结 微内核结构
在操作系统的结构设计中,微内核结构表示的是 A) 总体式结构 B) 层次结构 C) 分布式结构 D) 客户机/server结构 微内核是指把操作系统结构中的内存管理.设备管理.文件系统等 ...
- 跟上 Java 8 – 了解 lambda
原文出处: 王爵nice 从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能. 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流 ...
- 【b603】作业调度方案
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的 ...
- CSS拾遗(一)
重新看<精通CSS(第二版)>做一些记录,方便今后巩固. 1.外边距叠加 只有普通文档流中块框的垂直外边距才会发生外边距叠加.行内框.浮动框.或绝对定位框之间的外边距不会叠加. 2.相对定 ...
- git 修改仓库地址
公司服务器地址换了 , 原来的git代码地址也跟着需要变 , git remote rm origin 执行该操作 , 删除原来的git地址 git remote -v 查看一下有没有删除成功 , ( ...
- VC++实现Vista和Win7系统低权限程序向高权限程序发消息
Windows 7已经隆重发布,但是很多程序员已经通过RTM等版本尝到了Windows 7的甜处.那么在Windows 7下用户界面特权隔离,将是本文我们介绍的重点. 我们介绍了操作系统服务的Sess ...
- ubuntu grub 操作
系统开机时,按住 shift 进入 grub 1. 什么是 Grub GNU GRUB(GRand Unified Bootloader 简称"GRUB")是一个来自GNU项目的多 ...
- oracle 10g提升cluster失败
一个今天升级10g集群环境到10.2.0.5.下载补丁p8202632_10205_Linux-x86-64.zip,解压安装并运行后.中途岛错误: I/O ERROR cannt reading o ...