Рекомендую открыть всю папку как проект в VScode или Atom и удобно и быстро прыгать по ссылкам на файлы из отчета.
Ответ, который вы видете в папках ./X points/resaults на следующей конфигурации:
> OS: Ubuntu 22.04
> Processor: Intel I7 10750H
> RAM: 16 GB DDR4 3200
Для работы с файлами использовались только функции fprintf, fscanf, fopen.
Завершение программ происходит по выполнению поставленной задачи или по сигналу SIGINT CTRL+C с полноценным завершением и чисткой.
Результаты работы программы вы можете посмотреть в паках resaults для каждого балла.
Задача для агронома. Председатель дачного кооператива Сидоров В.И. получил указание, что в связи с составлением единого земельного кадастра, необходимо представить справку о площади занимаемых земель. Известно, что территория с запада и востока параллельна меридианам, на севере ограничены параллелью, а с юга выходят к реке, описываемой функцией f(x). Требуется создать приложение, вычисляющее площадь угодий методом адаптивной квадратуры. Замечание: кривизну Земли из-за малой занимаемой площади не учитывать. Количество процессов, участвующих в вычислениях определяется опционально. Агроном нанимает счетоводов, каждый из которых обсчитывает небольшой участок после чего добавляет свой результат к общей площади полученной в ходе проводимых расчетов. Аграном и каждый счетовод должны быть представлены отдельными процессами.
Мы используем метод адаптивной квардитуры, разделяя задачи между счетоводами, которые оказываются связаны с Агрономом. Функция f(x) (представление реки) для тестирования будет задаваться как x * x / 1000 и может быть изменена в любой момент. A и B - координата медиан по широте, будет задаваться в тестирующих файлах. Каждый из процессов счетоводов получает ответственный район и, чтобы оптимизировать колличество обменов, сам контролирует считаемый участок площади. Счетовод завершает свою работу, когда сам понимает, что закончил с выделеными участатками в районе, что позволяет честно разделить работу между процессами, давая возможность не тратить драгоценное время исполения на закидывание нового участка счетоводу.
В задачах с отдельными процессами было решено использовать сервер-клиент подход, где только сервер (Агроном) знает, сколько счетоводов ему нужно нанять. Клиент (счетвод) при запуске читает из общей памяти свой id, а также способен изменять сумму площади, прибавляя к ней результаты своих расчетов. Агроном завершается только по сигналу или в том случае, как все счетоводы пришли на работу и отработали свой район.
Путь к тестам: ./tests
В работе выполнены требования на 8.
Путь: ./4 points
Выбранный стиль Множество процессов взаимодействуют с использованием именованных POSIX семафоров. Обмен данными ведется через разделяемую память в стандарте POSIX.
Описание Главный родительский процесс main проверяет аргументы командной строки и создаёт заданное колличество дочерних процессов, которые знают входные данные и свой порядковый номер. Доступ к семафору (отвечает за синхронизацию) и разделяемой памяти (хранит площадь) осуществляется по имени по стандарту POSIX.
- Процесс родителя (Агроном) - получает данные из файла ввода и помогает использовать их дочерним процессам, после завершения всех дочерних процессов считывает данные из общей памяти и записывает в файл вывода конечный ответ.
- Процесс решения (Счетовод) - получает данные от родительского процесса и добавляет посчитаную площадь в разделёную память + записывает информацию в файл вывода.
Тесты
Как запускать тестирование?
./main ../tests/inX.txt resaults/outX.txt <кол-во дочерних процессов>
А где результаты?
Результаты 5 тестов: resaults
Путь: ./5 points
Выбранный стиль Множество процессов взаимодействуют с использованием неименованных POSIX семафоров расположенных в разделяемой памяти. Обмен данными также ведется через разделяемую память в стандарте POSIX.
Описание Главный родительский процесс main проверяет аргументы командной строки и создаёт заданное колличество дочерних процессов, которые знают входные данные и свой порядковый номер. Доступ к семафору (отвечает за синхронизацию) и разделяемой памяти (хранит площадь) осуществляется по стандарту POSIX. Неименованный семафор хранится в разделяемой памяти.
- Процесс родителя (Агроном) - получает данные из файла ввода и помогает использовать их дочерним процессам, после завершения всех дочерних процессов считывает данные из общей памяти и записывает в файл вывода конечный ответ.
- Процесс решения (Счетовод) - получает данные от родительского процесса и добавляет посчитаную площадь в разделёную память + записывает информацию в файл вывода.
Тесты
Как запускать тестирование?
./main ../tests/inX.txt resaults/outX.txt <кол-во дочерних процессов>
А где результаты?
Результаты 5 тестов: resaults
Путь: ./6 points
Выбранный стиль Множество процессов взаимодействуют с использованием семафоров в стандарте UNIX SYSTEM V. Обмен данными ведется через разделяемую память в стандарте UNIX SYSTEM V
Описание Главный родительский процесс main проверяет аргументы командной строки и создаёт заданное колличество дочерних процессов, которые знают входные данные и свой порядковый номер. Доступ к семафору (отвечает за синхронизацию) и разделяемой памяти (хранит площадь) осуществляется по стандарту UNIX SYSTEM V.
- Процесс родителя (Агроном) - получает данные из файла ввода и помогает использовать их дочерним процессам, после завершения всех дочерних процессов считывает данные из общей памяти и записывает в файл вывода конечный ответ.
- Процесс решения (Счетовод) - получает данные от родительского процесса и добавляет посчитаную площадь в разделёную память + записывает информацию в файл вывода.
Тесты
Как запускать тестирование?
./main ../tests/inX.txt resaults/outX.txt <кол-во дочерних процессов>
А где результаты?
Результаты 5 тестов: resaults
Путь: ./7_points
Выбранный стиль Множество независимых процессов взаимодействуют с использованием именованных POSIX семафоров. Обмен данными ведется через разделяемую память в стандарте POSIX.
Описание Главный процесс agronomist (сервер) проверяет аргументы командной строки и создает общую память, структуру типа:
{
"sum" = 0.0 // Отвечает за хранение общей площади
"account_finished" = 0 // Показывает кол-во завершенных процессов
"account_all" = 0 // Показывает, сколько всего процессов должно быть
}
С которой уже будут взаимодействовать остальные независимые процессы счетоводов (клиенты). Доступ к семафору (отвечает за синхронизацию) и разделяемой памяти (хранит площадь) осуществляется по имени по стандарту POSIX.
- Процесс сервер (Агроном) - получает данные из файла ввода, создаёт общую память со структурой данных, после завершения всех процессов считывает данные из общей памяти и записывает в файл вывода конечный ответ.
- Процесс клиент (Счетовод) - получает из разделяемой (общей) памяти структуру, по которой понимает, какой он счетовод и какой район считать, получает общие размеры территории из файла ввода, после подсчетов записывает данные в разделяемую память и завершается.
Тесты
Как запускать тестирование?
// В первом терминале (стартуем сервер):
./agronomis ../tests/inX.txt resaults/outX.txt <кол-во клиентов>
// Во остальных терминалах (можно и в одном, но так не интересно):
./account ../tests/inX.txt resaults/outX.txt
А где результаты?
Результаты 5 тестов: resaults
Путь: ./8_points
Выбранный стиль Множество независимых процессов взаимодействуют с использованием семафоров в стандарте UNIX SYSTEM V. Обмен данными ведется через разделяемую память в стандарте UNIX SYSTEM V.
Описание Главный процесс agronomist (сервер) проверяет аргументы командной строки и создает общую память, структуру типа:
{
"sum" = 0.0 // Отвечает за хранение общей площади
"account_finished" = 0 // Показывает кол-во завершенных процессов
"account_all" = 0 // Показывает, сколько всего процессов должно быть
}
С которой уже будут взаимодействовать остальные независимые процессы счетоводов (клиенты). Доступ к семафору (отвечает за синхронизацию) и разделяемой памяти (хранит площадь) осуществляется по имени по стандарту UNIX SYSTEM V.
- Процесс сервер (Агроном) - получает данные из файла ввода, создаёт общую память со структурой данных, после завершения всех процессов считывает данные из общей памяти и записывает в файл вывода конечный ответ.
- Процесс клиент (Счетовод) - получает из разделяемой (общей) памяти структуру, по которой понимает, какой он счетовод и какой район считать, получает общие размеры территории из файла ввода, после подсчетов записывает данные в разделяемую память и завершается.
Тесты
Как запускать тестирование?
// В первом терминале (стартуем сервер):
./agronomis ../tests/inX.txt resaults/outX.txt <кол-во клиентов>
// Во остальных терминалах (можно и в одном, но так не интересно):
./account ../tests/inX.txt resaults/outX.txt
А где результаты?
Результаты 5 тестов: resaults