Условие:
Для этого процесс-родитель должен обязательно «прогреть» и записать каждую страницу до fork(), чтобы страницы стали резидентными и общими между процессом-родителем, а также процессом-ребёнком по COW. Необходимо написать на C программу, которая выполняет анонимное отображение на N байт (N % pagesize == 0) при помощи:\nuint8_t *buf = mmap(NULL, N, PROT_READ|PROT_WRITE, MAP_PRIVATE|\nMAP_ANONYMOUS, -1, 0);
Обязательно отключить THP (объединение соседних страниц памяти в большие страницы) для тестируемого диапазона: madvise(buf, N, MADV_NOHUGEPAGE).
Заполнить каждую страницу: for (size_t ind = 0; ind < N; ind += pagesize) buf[ind] = 1; Главный процесс выполняет fork(). Далее следует сравнить два сценария:
а) в дочернем процессе пройти по страницам и увеличить первый байт:\nfor (size_t ind = 0; ind < N; ind += pagesize) buf[ind] += 1;
б) в альтернативном сценарии — дочерний процесс только читает эти байты страницы без записи:\nvolatile uint64_t sink = 0;\nfor (size_t ind = 0; ind < N; ind += pagesize) sink += buf[ind];
(void)sink;
Рекомендуемая команда для сбора статистики:\nsudo perf stat -r 5
-e task-clock,context-switches,cpu-migrations,\npage-faults,minor-faults,major-faults,\ninstructions,cycles
./lab2_c.o --mode=write
Аналогичный запуск возможен с ключем --mode=read. Ключи предусмотреть в пользовательской программе.
Для тестов рекомендуется использовать 3–5 прогонов программного кода. Зафиксировать поведение ОС в процессе эксперимента при возможной нехватке памяти и других событиях. Для всех экспериментов нужно обеспечить детерминизм при сравнении (сопоставимый набор данных, одинаковое выравнивание по длине). На языке Си.

