Linux C lock pages

2018-06-18 04:17:29来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

 

  虚拟内存按页划分,我们可以明确告诉系统:某一个虚拟内存页需要和实际内存帧相关联。这样一来,该内存页就被换进来了,而且不会被系统换出去。这一行为叫做锁页(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。不多介绍了。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:函数指针、回调函数、系统调用区别

下一篇:C文件I/O超详细教程