Я пытаюсь исследовать поведение Linux при сбое страницы.Я сделал контейнер lxc с ограничением памяти до 1 ГБ (добавив lxc.cgroup.memory.limit_in_bytes = 1G в /etc/lxc/default.conf).Затем я запустил простой код, который получает доступ к объему данных 2 ГБ.
int main() {
char* buf = malloc(1024*1024*1024);
char* buf2 = malloc(1024*1024*1024);
if (buf == 0 || buf2 == 0) {
printf("Malloc failed!\n");
return 0;
}
int i,j,k;
for (i=0; i<1024; i++)
for (j=0; j<1024; j++)
for (k=0; k<1024; k++)
buf[i*1024*1024 + j*1024 + k] = i+j+k;
for (i=0; i<1024; i++)
for (j=0; j<1024; j++)
for (k=0; k<1024; k++)
buf2[i*1024*1024 + j*1024 + k] = i+j+k;
free(buf);
free(buf2);
while(1);
return 0;
}
Код компилируется с -O0 и запускается внутри контейнера.Когда программа достигает while (1); я проверяю, сколько ошибок страниц она испытывала при
ps -eo maj_flt,cmd | grep a.out
, где a.out - скомпилированный исполняемый файл.Иногда я получаю ошибки 200 ~ 300 страниц;однако иногда я вижу только 10 ~ 20 страниц ошибок.Поскольку память составляет всего 1 ГБ, я думаю, что по крайней мере всегда 1G / 4K = 256 КБ сбой страницы должен происходить.Почему иногда я вижу только ошибку в 10-20 страниц?Я подтвердил, что мой Linux использует страницы по умолчанию 4K.
Я новичок в Linux.Любые идеи будут очень полезны!Спасибо.