使用mlock锁定地址空间zz

通过mlock可以将进程使用的部分或者全部的地址空间锁定在物理内存中,防止其被交换到swap空间。
对时间敏感的应用会希望全部使用物理内存,提高数据访问和操作的效率。
例如,memcached就提供锁定内存的选项,保证memcached使用内存全部在物理内存中。

内存是宝贵,也是有限的,将地址空间全部锁定在内存中是有危险的。
当锁定的地址空间比较大的时候,为了得到足够的物理内存,linux可能会干掉一些进程,回收内存。
所有mlock操作只能root用户进行。

  
NAME
       mlock, munlock, mlockall, munlockall – lock and unlock memory
SYNOPSIS
       #include <sys/mman.h>
       int mlock(const void *addr, size_t len);
       int munlock(const void *addr, size_t len);
       int mlockall(int flags);
       int munlockall(void);
mlock主要有上面四个函数,mlock和mlockall用来锁定地址空间,munlock和munlockall用来释放锁定。
  
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    int mall_num = atoi(argv[1]);
    char *lock_mem = argv[2];
    char *t;

    if(strcmp(lock_mem,”true”) == 0) {
        int res = mlockall(MCL_CURRENT | MCL_FUTURE);
        if (res != 0) {
            printf(“warning: -k invalid, mlockall() failed: %s\n”,strerror(errno));
        }
    }

    t = (char *) calloc(mall_num,1048576);
    memset(t,0,sizeof(t));

    while(1)
    ;

    return 0;
}

用上面的代码来测试下mlock,两个参数,参数1是申请的内存大小,单位是M;参数2是地址锁定标志。
使用的是mlockall函数,后面的参数表示不仅锁定当前的地址空间,也要锁定将来申请的地址空间。

首先测试下不锁定地址空间的情况,查看内存占用通过top命令。
  
[hjl@sunwg test00]$ free
             total       used       free     shared    buffers     cached
Mem:        515340     109408     405932          0       4836      69248
-/+ buffers/cache:      35324     480016
Swap:      1048568      20812    1027756
  
当前系统的物理内存为512M,而交换空间为1G。

//测试1,申请内存100M,不锁定内存
=====================================================================
[hjl@sunwg test00]$ ./test.bin 100 false
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  536 hjl       25   0  101m 100m  260 R 50.0 19.9   0:12.12 test.bin   
 
内存使用101m,其中物理内存100m

//测试2,申请内存400M,不锁定内存   
=====================================================================
[hjl@sunwg test00]$ ./test.bin 400 false
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  539 hjl       25   0  401m 400m  260 R 49.9 79.5   0:08.53 test.bin   
 
内存使用401m,其中物理内存400m

//测试3,申请内存800M,不锁定内存
=====================================================================
[hjl@sunwg test00]$ ./test.bin 800 false
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  547 hjl       25   0  801m 467m   60 R 94.0 92.9   0:07.22 test.bin     
 
内存使用801m,其中物理内存467m,swap空间=801 – 467=334m
此时,物理内存不够用,会将一些内存交换到swap中

//测试4,申请内存100M,锁定内存
=====================================================================
[root@sunwg test00]# ./test.bin 100 true
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  582 root      25   0  101m 101m 1388 R 99.9 20.2   0:05.82 test.bin  
 
使用内存101m,均在物理内存中

//测试5,申请内存400M,锁定内存
=====================================================================
[root@sunwg test00]# ./test.bin 400 true
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
  585 root      25   0  401m 401m 1388 R 99.9 79.8   0:09.62 test.bin
 
使用内存401m,均在物理内存中 

//测试6,申请内存800M,锁定内存
=====================================================================
[root@sunwg test00]# ./test.bin 800 true

这时候没有申请成功,系统差点挂了,因为总的物理内存才512M。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值