1. Главная
  2. Библиотека
  3. Программирование
  4. Для этого процесс-родитель должен обязательно «прогреть...
Разбор задачи

Для этого процесс-родитель должен обязательно «прогреть» и записать каждую страницу до fork(), чтобы страницы стали резидентными и общими между процессом-родителем, а также процессом-ребёнком по COW. Необходимо написать на C программу, которая выполняет

  • Предмет: Программирование
  • Автор: Кэмп
  • #Основы алгоритмизации и программирования
  • #Языки программирования (C++, Java, Python и др.)
Для этого процесс-родитель должен обязательно «прогреть» и записать каждую страницу до fork(), чтобы страницы стали резидентными и общими между процессом-родителем, а также процессом-ребёнком по COW. Необходимо написать на C программу, которая выполняет

Условие:

Для этого процесс-родитель должен обязательно «прогреть» и записать каждую страницу до 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 прогонов программного кода. Зафиксировать поведение ОС в процессе эксперимента при возможной нехватке памяти и других событиях. Для всех экспериментов нужно обеспечить детерминизм при сравнении (сопоставимый набор данных, одинаковое выравнивание по длине). На языке Си.

Решение:

Описание решения:

  1. В начале подключаем необходимые заголовочные файлы: stdio.h, stdlib.h, stdint.h, sys/mman.h, sys/wait.h, unistd.h и string.h для работы с функциями mmap, fork, madvise, sysconf и строковыми операциями.

  2. Получаем размер страницы (pagesize) от системы с помощью sysconf(_SC_PAGESIZE). Это необходимо, чтобы работать корректно с границами страниц, так как условие задачи – проходить по памяти с шагом, равным размеру страницы.

  3. Обрабатываем аргументы командной строки. Программа должна принимать ключи, например, "--mode=write&quot...

Внутри — полный разбор, аргументация, алгоритм решения, частые ошибки и как отвечать на каверзные вопросы препода, если спросит

Попробуй решить по шагам

Попробуй один шаг и продолжи в режиме обучения или посмотри готовое решение

Какова основная цель «прогрева» памяти (записи в каждую страницу) перед вызовом `fork()` в родительском процессе при использовании механизма Copy-on-Write (COW)?

Что нужно знать по теме:

Что нужно знать по теме

Алгоритм решения

Топ 3 ошибок

Что спросит препод

Выбери предмет