В данном проекте полная реализация задачи о перевозке железной руды на Урале. Репозиторий будет постоянно обновляться.
- Реализация SystemFile;
- Реализация программы, исполняющей роль одного самосвала (далее - Самосвал);
- Реализация программы, исполняющей роль регулировщика с одной стороны моста (далее - Регулироввщик);
- Реализация программы, отвечающей за запуск потоков регулировщиков и самосвалов (далее - Инициализатор).
- Очереди сообщений для сообщения регулировщикам о прибытии самосвала;
- Семафоры для передачи самосвалам разрешения на проезд и сигнала о завершении работы.
- У моста нет самосвалов;
- С одной стороны моста нет самосвалов;
- Самосвалы есть по обе стороны моста;
- Прибыл самосвал недопустимого веса.
- Все самосвалы одного веса;
- Регулировщик допускает на мосту наличие только одного самосвала.
- Шоислом;
- Вальтер;
- Глеб;
- Аян.
-
- Самосвал - Регулировщик:
- Самосвал посылает сообщение Регулировщику, расположенному с ним по одну сторону моста, после подъезда к мосту, а Регулировщик принимает его.
- Самосвал - Регулировщик:
-
- Самосвал - Регулировщик:
- Семафор очереди:
- Самосвал посылает уведомление Регулировщику о проезде по мосту;
- Семафор очереди:
- Регулировщик - Регулировщик:
- Операционный семафор (далее - семафор регулировщиков):
- Применяется для определения того, какой Регулировщик руководит движением на мосту в данный момент.
- Операционный семафор (далее - семафор регулировщиков):
- Общие:
- Завершающий семафор:
- Процессы завершают работу, если установлено значение 0.
- Семафор количества участников:
- значение семафора №0 соответствует количеству запущенных процессов;
- значение семафора №1 соответствует количеству активных регулировщиков.
- Завершающий семафор:
- Самосвал - Регулировщик:
Далее под сообщением подразумевается std::pair<int, int>, так как именно такой тип использует класс MessageQueue,
объявленный в sem_and_queue.hpp, для приёма и передачи сообщений
-
- После подъезда к мосту Самосвал посылает соответствующему Регулировщику сообщение типа
1по форме{"Номер Самосвала", "Масса Самосвала"}, а затем ждёт разрешение на проезд от Регулировщика; - Если Регулировщик разрешает Самосвалу движение по мосту, то посылает сообщение типа
"Номер Самосвала" + 2по форме `{0, 0}; - После выезда с моста Самосвал уменьшает значение Семафора очереди на 1 (гарантируется, что данная операция может быть выполнена);
- После подъезда к мосту Самосвал посылает соответствующему Регулировщику сообщение типа
-
- Для передачи управления движением Регулировщик меняет значение семафора на номер другого регулировщика, а затем ждёт, пока семафор не примет значение, соответствующее его номеру.
- Для получения ключа используем
ftok(const char *pathname, int proj_id); pathname = "transit"proj_idproj_id = 1, 2для очередей сообщений регулировщиковmineиfactoryсоответсвенно;proj_id = 3, 4для семафоров регулировщиковmineиfactoryсоответственно;proj_id = 5для семафора регулировщиков;prog_id = 6для семафора завершения;proj_id = 7для семафора количества участников (единственный семафор, в массиве которого содержутся 2 семафора).
- Использовать
enum Locationизinitialization.hppдля определения положения объектов. - Логировать существенные действия самосвалов / регулировщиков (каждое изменение семафоров и т.п. логировать не нужно).
- Самосвал:
Truck(bool init_location, int number, int weight, int speed); - Регулировщик:
TrafficController(bool location, int max_weight, int max_number_of_trucks, int bridge_lenth).
- Очереди сообщений регулировщиков и семафоры очереди создает первый обратившийся участник, а удаляют только соответствующие регулировщики;
- Семафор регулировщиков создаёт первый прибывший регулировщик, а удаляет последний отключившийся;
- Семафор завершения создаётся первым прибывшим участником, а удаляется последним отключившимся участником;
- Семафор количества участников создаётся первым прибывшим регулировщиком, а удаляется последним отключившимся участником.
- Инициализатор: реализация в файле
initialization.cpp, логирование в файлLogInitializator.txt; - Самосвал: объявление класса
Truckв файлеtruck.hpp, реализация - в файле,truck.cpp, логирование в файлLogTruck"номер самосвала".txt; - Регулировщик: объявление класса
TrafficControllerв файлеtraffic_controller.hpp, реализация - в файлеtraffic_controller.cpp, логирование в файлLogTrafficController"расположение регулировщика".txt; - SystemFile: объявление класса
SystemFileв файлеSystemFile.hpp, реализация - в файлеSystemFile.cpp.
- Инициализатор:
- Создаёт два объекта класса
TrafficControllerс различными параметрами (расположение относительно моста, максимальная допустимая нагрузка на мост, количество самосвалов, которых нужно пропустить), а затем вызывает методStartProcessу каждого из объектов; - Создаёт необходимое количество объектов класса
Truckс различными параметрами (изначальное расположение самосвала относительно моста, номер самосвала (0-индексация)), а затем вызываетStartProcessу каждого из объектов.
- Создаёт два объекта класса
- Самосвал (на усмотрение Вальтера):
- Создаёт инструменты межпроцессорного взаимодействия;
- Добавляет единицу к значению семафора количества участников (0 в массиве).
- Регулировщик:
- Создаёт инструменты межпроцессорного взаимодействия;
- Добавляет единицу к значению семафора количества участников (0 и 1 (если он не является владельцем семафора) в массиве).
- Инициализатор: ничего не делает;
- Самосвал:
- Отнимает единицу от значения семафора количества участников (0 в массиве);
- (правила создания и удаления семафоров / очередей сообщений).
- Регулировщик:
- Отнимает единицу от значения семафора количества участников (0 и 1 в массиве);
- Устанавливает значение семафора завершение равным 0;
- (правила создания и удаления семафоров / очередей сообщений).
- Самосвал завершает работу, если значение завершающего семафора == 0;
- Регулировщик завершает работу, если по мосту проехало заданное количество самосвалов, либо если значение завершающего семафора == 0, либо прибыл самосвал недопустимого веса. При завершении работы устанавливает значение завершающего семафора = 0 (если оно уже не было установлено);
- Инициализатор завершается сразу после запуска всех процессов.
- Используем стандартный ввод;
- В первой строчки параметры моста: максимальная нагрузка и длина;
- Во второй строчке количество самосвалов, которые могут проехать через мост;
- В третьей строчке единственное число
n- количество запускаемых самосвалов; - Далее
nстрочек, содержащих параметры запускаемых самосвалов: изначальное расположение относительно моста, масса, скорость.