Вы можете использовать eval
, чтобы получить чей-то домашний каталог.
eval echo "~$USER"
По крайней мере, для локальных пользователей это точно работает. Я не знаю, работает ли eval
с удаленными пользователями, такими как LDAP.
Then why is the text so sure that the most recent page is moved out of RAM immediately after being accessed?
Как правило, удаляется страница, к которой обращались наименее недавно, но это приводит к описанному патологическому поведению. При первом прохождении внутреннего цикла выгружаются первые n кадров; затем, когда страница n + 1 должна быть выгружена, страница 1 выгружается, и так далее, гарантируя, что все страницы должны быть выгружены обратно каждый раз вокруг цикла.
Однако этот сценарий действительно маловероятен. Если системе полностью не хватает физической памяти (и подкачки ), ядро уничтожит программу, чтобы освободить часть памяти; учитывая поведение тестовой программы, вряд ли это кандидат. Если системе не хватает только физической оперативной памяти, ядро выгрузит страницы или сократит свои кэши; если он меняет местами страницы, вряд ли он нацелится на тестовую программу. В обоих случаях тестовая программа будет иметь достаточно оперативной памяти для своего рабочего набора. Если вы каким-то образом умудряетесь голодать тестовую программу только (, например. увеличив свой рабочий набор так, чтобы он доминировал в системной памяти ), вы с большей вероятностью на практике увидите, что он будет уничтожен с помощью SIGSEGV
, чем вы увидите, как он постоянно просматривает свой рабочий набор. (Это нормально, это мысленный эксперимент в учебнике. Изучите получившиеся принципы, не обязательно пытаться применить пример на практике.)
Can it just keep "n-1" pages i.e. rows in RAM, and use the remaining one page for all the page faults and replacements?
Он мог бы , но это было бы необычно для системы; как система узнает, какими будут будущие шаблоны доступа к памяти? Вообще говоря, вы увидите вытеснение LRU, поэтому цикл будет демонстрировать патологическое поведение, как описано выше.
Если вы хотите поиграть с этим, исправьте программу, чтобы она соответствовала размеру страницы 4 КБ (, используемому на x86; Я предполагаю, что Linux на 64 -бит x86 здесь )и на самом деле компилируется:
int main(int argc, char **argv) {
int i, j;
int data[128][1024];
for (j = 0; j < 1024; j++)
for (i = 0; i < 128; i++)
data[i][j] = 0;
}
Затем запустите его с помощью /usr/bin/time
,который покажет количество ошибок страницы:
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 1612maxresident)k
0inputs+0outputs (0major+180minor)pagefaults 0swaps
Такой вид обработки массива на практике вызовет больше проблем с вытеснением строк из кэша, чем с ошибками страниц.