- スワップ・アウトはページ・アウトのサブクラスである。
- ページ・アウトはディスクにページを書き出すことすべてを指している。
- スワップ・アウトはページを書き出す行為がスワップのために行われる、つまり書き出し先のディスクがスワップ領域である場合のページ・アウトである。
- ページ・アウトはスワップ・アウトを含むため、すべての瞬間でページ・アウト回数>=スワップ・アウト回数である。
- pswpout/sは『スワップ・アウトした"ページ数"』を表し、pgpgout/sは『ページ・アウトした"キロバイト数"』を表す。そのため、1秒間に100ページをスワップ・アウトした場合、pswpout/sは100となり、pgpgout/sは400となる。これは1ページが通常4KBであるため。
- スワップが多発しているかどうかを判断する指標はpswpout/s(およびpswpin/s)であり、pgpgout/s(およびpgpgin/s)ではない。
概念図
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<time.h>
#define MALLOC_UNIT_MB 100
#define MALLOC_UNIT (MALLOC_UNIT_MB*1024*1024)
int memGet = 0;
int memSet = 0;
unsigned char* segments[1024];
void getVirtualMemory() {
unsigned char* ptr = NULL;
printf(" malloc...\n");
ptr = (unsigned char*)malloc(MALLOC_UNIT);
if ( ptr == NULL )
printf(" malloc failed (%s)\n", strerror(errno));
else
segments[memGet++] = ptr;
}
void setPhysicalMemory() {
time_t pre, post;
for ( ; memSet < memGet; memSet++ ) {
printf(" memset %dth segment... ", memSet); fflush(stdout);
pre = time(NULL);
memset(segments[memSet], 'A', MALLOC_UNIT);
post = time(NULL);
printf("(%0.0f sec)\n", difftime(post, pre));
}
}
int main( int argc, char* argv[] ) {
char ch;
while ( true ) {
printf("type g to malloc, s to memset, r to re-memset(%d get, %d set): ", memGet, memSet);
scanf("%1s", &ch);
switch ( ch ) {
case 's': setPhysicalMemory(); break;
case 'g': getVirtualMemory(); break;
case 'r': memSet = 0; setPhysicalMemory(); break;
}
}
return 0;
}