一)swap的概述
1)swap的作用可简单描述为:
当内存不够用时,将存储器中的数据块从DRAM移到swap的磁盘空间中,以释放更多的空间给当前进程使用.
当再次需要那些数据时,就可以将swap磁盘中的数据重新移到内存,而将那些不用的数据块从内存移到swap中.
2)数据从内存移动交换区的行为被称为页面调用,发生在后台的页面调用没有来自应用程序的干涉.
3)swap空间是分页的,每一页的大小和内存页的大小一样.
4)并不是一定要给每个系统划分SWAP,比如大多数的嵌入式就没有swap.
二)swap能让系统最多使用多少内存?
一个32位的LINUX系统在没有启用PAE的情况下最多可以用4GB的物理内存.在用户空间中最多可用3GB.
而增加swap会让系统增加可使用的内存空间吗?
用下面的测试回答这个问题:
查看内核版本
[root@test1 tmp]# uname -r
2.6.18-8.el5
建一个10GB的文件
[root@test1 tmp]# dd if=/dev/zero f=data.dat bs=10M count=1000
[root@test1 tmp]# mkswap data.dat
Setting up swapspace version 1, size = 10485755 kB
[root@test1 tmp]# free -m
total used free shared buffers cached
Mem: 503 43 460 0 13 9
-/+ buffers/cache: 20 482
Swap: 1027 22 1005
[root@test1 tmp]# swapon data.dat
[root@test1 tmp]# free -m
total used free shared buffers cached
Mem: 503 46 457 0 15 9
-/+ buffers/cache: 20 482
Swap: 11027 22 11005
[root@test1 tmp]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 1052248 23040 -1
/tmp/data.dat file 10239992 0 -3
现在的物理内存和swap加起来超过了4GB.而我们最多能用多少呢?
下面的程序会不断申请/分配内存空间.
源程序如下:test1
#include #include #include
int main (int argc, char *argv[])
{
void *ptr;
int n = 0;
while (1){
ptr = malloc(0x100000);
if (ptr == NULL)
break;
memset(ptr, 1, 0x100000);
printf("malloced %d MB\n", ++n);
}
pause();
}
[root@test1 tmp]# gcc test1.c -o callmem
[root@test1 tmp]# ./callmem
malloced 3039 MB
malloced 3040 MB
malloced 3041 MB
malloced 3042 MB
malloced 3043 MB
malloced 3044 MB
malloced 3045 MB
malloced 3046 MB
malloced 3047 MB
malloced 3048 MB
malloced 3049 MB
malloced 3050 MB
malloced 3051 MB
malloced 3052 MB
malloced 3053 MB
malloced 3054 MB
malloced 3055 MB
malloced 3056 MB
在分配了3056MB的内存之后,再不能分配了,说明即使通过swap给系统增加了10GB的内存,系统最终也只能使用3056MB的内存空间(用户空间),不能突破4GB的限制.
三)超过了系统最大可使用内存空间会怎样?
依旧是上面的例子,我们关闭掉swap文件data.dat
[root@test1 tmp]# swapoff data.dat
查看当前的swap空间
[root@test1 tmp]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 1052248 22760 -1
执行callmem
[root@test1 tmp]# ./callmem
malloced 1465 MB
malloced 1466 MB
malloced 1467 MB
malloced 1468 MB
malloced 1469 MB
malloced 1470 MB
malloced 1471 MB
malloced 1472 MB
malloced 1473 MB
malloced 1474 MB
malloced 1475 MB
malloced 1476 MB
malloced 1477 MB
malloced 1478 MB
malloced 1479 MB
malloced 1480 MB
malloced 1481 MB
malloced 1482 MB
malloced 1483 MB
malloced 1484 MB
malloced 1485 MB
Killed
在分配了1485MB内存后,程序