• 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。不多介绍了。

  • 相关阅读:
    awk: 两列相加
    awk: 多行转一行(一列转一行)并在加上双引号和逗号
    R也可以计算保守性得分(phastCons100way.UCSC.hg19)
    linux:提取列数一致的行
    本周最新文献速递20210509
    菠萝蜜成长记
    报错:UnavailableInvalidChannel: The channel is not accessible or is invalid解决方法
    awk无法比较数值
    【专利自助申请指引 ● 第1章. 申请流程介绍 ● 1.2.6 完成费减备案(可选)】
    【专利自助申请指引 ● 第1章. 申请流程介绍 ● 1.2.5 提前公布请求和实质审查请求】
  • 原文地址:https://www.cnblogs.com/san-fu-su/p/5743022.html
Copyright © 2020-2023  润新知