通过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。