Files
2026-05-12 19:16:13 +07:00
..
2026-05-12 19:13:20 +07:00
2026-05-12 19:13:20 +07:00
2026-05-12 19:13:20 +07:00
2026-05-12 19:13:20 +07:00

Лабораторная работа 4. Сетевые соединения. Сокеты

Вариант из лабораторной работы 1: рекурсивная сортировка разделением.

Программа строит дерево процессов. Каждый внутренний процесс открывает TCP ServerSocket на 127.0.0.1 с портом port_base + pid % span, порождает двух потомков через fork(), принимает от них локальные соединения и передает им левую и правую части массива.

По умолчанию port_base = 20000. Это сделано из-за того, что чистый порт pid может оказаться меньше 1024 и потребовать root-права. Формула соответствует замечанию из задания про ServerSocketBase + <pid родителя>.

Формат обмена

Родитель отправляет потомку:

  1. uint32_t depth — глубина рекурсии потомка;
  2. uint64_t size — размер массива;
  3. int32_t array[size] — часть массива.

Потомок возвращает:

  1. uint64_t counter — счетчик операций сравнения при слиянии;
  2. uint64_t size — размер отсортированной части;
  3. int32_t array[size] — отсортированная часть;
  4. uint64_t processes — расширение для статистики количества процессов.

Первые три поля ответа соответствуют заданию: счетчик / размерность / массив.

Сборка и запуск

make
./lab4 --size 10000 --depth 3 --min-size 1

Полезные параметры:

./lab4 --size 1000 --depth 2 --min-size 16 --seed 42 --print
./lab4 --size 2048 --depth 2 --min-size 64 --log
./lab4 --size 10000 --depth 3 --port-base 30000

Проверка

make test

В конце программа печатает статистику в stderr:

STAT: size=... depth=... min_size=... processes=... counter=... valid=1 time=... sec

valid=1 означает, что итоговый массив действительно отсортирован.