这是新公司有个同事提到的,我恰好是负责这一块的,因而给他解答以下。数组
问题:ide
写了一个简单的测试程序,申请2G内存但不使用,理论上不使用的内存不会占用系统的物理内存和swap。top显示这个进程使用了2G swap,但整个系统只使用了1G swap。感受TOP显示的swap信息彻底是忽悠。
top - 12:03:30 up 109 days, 4:14, 16 users, load average: 1.00, 1.02, 1.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 9.2%us, 3.4%sy, 0.0%ni, 87.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 12462160k total, 7966312k used, 4495848k free, 465772k buffers
Swap : 4192956k total, 1257252k used , 2935704k free, 5561148k cached
PID USER PR VIRT RES SHR S %CPU %MEM TIME+ SWAP DATA COMMAND
22051 zhouzm 15 2050m 388 320 S 0.0 0.0 0:00.00 2.0g 2.0g a.out测试
解答:spa
汇总区域显示的Swap: 1257252k used是正确的,不过任务区域的SWAP 2.0g其实也不算是错的,我以为是表达的意义不同。top源代码里面,不像其它参数,SWAP不是直接读取/proc/pid/stat文件数据的, 是这样计算的:SWAP = VIRT - RES,依赖于VIRT和RES。其中,VIRT(虚拟内存)是分配和释放内存时会变化的,而RES(即RAM)是使用的时候随着页面交换变化的。在刚分配大量内存但尚未使用的时候,VIRT明显变大但RES没有明显变化,致使SWAP变得出奇的大。
如下是我分配和使用2G大的数组,使用top捕捉到的变化过程:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
before malloc 2G memory
4415 liangry 16 0 2404 248 192 S 0.0 0.0 0:00.00 2156 test_top_swap
after malloc 2G memory
4415 liangry 16 0 2050m 292 228 S 0.0 0.0 0:00.00 2.0g test_top_swap
start using the array
4415 liangry 25 0 2050m 733m 260 R 99.9 73.3 0:03.57 1.3g test_top_swap
end of assignment
4415 liangry 18 0 2050m 893m 84 R 24.3 89.3 0:11.19 1.1g test_top_swaporm
测试代码:进程
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { sleep(15); long size = (long) 1024 * 1024 * 1024 * 2; char *s = (char *) malloc(sizeof(char) * size); sleep(15); long offset = 0; printf("starting.../n"); while ( offset < size ) { strcpy(s + offset, "hello"); offset += strlen("hello"); } printf("sleeping.../n"); sleep(99999); free(s); return 0; }