Путешествие на втором году обучения в ИТ-школе привело меня к довольно интересному проекту: «LemIPC»

Цель состояла в том, чтобы создать арену с использованием IPC, «межпроцессного взаимодействия», где каждый игрок (IA) контролировался процессом.

Первый игрок, который присоединится, должен создать необходимые IPC и арену.
Команда игрока определяется параметром двоичного файла.
Игрок считается «мертвым», когда два игрока одного и того же врага команда находится в контакте с ним (8 квадратов, которые его окружают).

Игроки должны иметь возможность разговаривать через «очередь сообщений» и иметь доступ к карте с помощью «общей памяти».

Поскольку тема была бесплатной, я предполагаю, что целью было дать нам возможность бесплатно поэкспериментировать с IPC, создав довольно забавную и простую игру.

Межпроцессное взаимодействие (IPC)

IPC - это механизм, который позволяет процессам обмениваться данными и взаимодействовать.
Существует множество различных IPC, которые можно использовать по-разному. Хороший навык - это возможность выбрать, какой из них может конкретно решить вашу проблему.
К счастью, теперь я расскажу о некоторых IPC и их использовании:

Файловое хранилище

Начнем с самого простого: использование файла в качестве общей памяти, в которой процессы могут хранить данные и обмениваться ими. Этого можно добиться, просто записав в файл. Но будьте осторожны, наличие нескольких процессов, записывающих в один файл, может быть очень плохой идеей, поэтому установка защиты должна быть первоочередной задачей. Но я займусь этой защитой позже.

(примечание: множественный доступ для чтения не так важен, как запись.)

Сигнал

Несмотря на простоту, Signal представляет собой специфическую, но полезную библиотеку C.

Это позволяет вам создать функцию, которая будет реагировать на получение сигнала. Сигнал - это асинхронное уведомление, которое может быть отправлено процессу. Их существует множество, у которых всегда есть свои собственные утилиты и способы использования. Например, нажатие CTRL + C при открытии программы вызывает сигнал SIGINT, который прерывает процесс.

Его можно использовать для обмена данными в двоичном формате, например, с одним сигналом, представляющим 0, а другим - 1. Большим недостатком сигнала является то, что вам необходимо знать PID ( P не является идентификатором процесса (идентификатор) процесса приемника сигнала.

Розетки

Сокет - это поток данных, который может быть отправлен другому процессу, расположенному на том же компьютере, или через сеть.

Его можно использовать для получения или отправки данных, и к нему могут подключаться несколько процессов. Благодаря его удобному способу работы и множеству способов его использования, это один из наиболее часто используемых IPC.

Очереди сообщений

Очереди сообщений - это своего рода месиво между сигналами и сокетами. Это позволяет вам создавать поток данных сообщений, который может позволить одному или нескольким процессам обмениваться данными между ними. Отправку и получение можно осуществить с помощью простой функции.

Хотя использование довольно простое, я считаю, что использование очереди сообщений несколько ограничено и показывает свой истинный потенциал только в очень специфических ситуациях.

Общая память

Изучив все эти IPC, вы можете подумать, что IPC не предлагают достаточной гибкости. Что ж, общая память может быть именно тем, что вам нужно.

Это позволяет вам создавать сегменты памяти, к которым можно получить доступ и изменить несколько процессов. Настроить его невероятно просто (и похоже на очереди сообщений), и управление данным сегментом может быть единственной сложной частью.

Вы все равно захотите проверить действия процессов, чтобы предотвратить доступ двух потоков к одному и тому же сегменту памяти. Использование семафоров является подходящей стратегией из-за простоты использования и ее жизнеспособности при правильном использовании.

Есть еще несколько широко используемых IPC, которые я не буду представлять из-за отсутствия опыта работы с некоторыми из них. Я бы порекомендовал проверить документацию, если вы хотите использовать многопоточность.

Блокировка ресурсов

Одна из распространенных вещей, которые делают с IPC, - это создать блокировку, чтобы два процесса не записывали один и тот же сегмент памяти.

Есть несколько способов сделать это, и вы даже можете проявить немного творчества, чтобы добиться этого.

Я представлю самый гибкий: семафоры. Это позволяет вам создавать общие ценности для ваших процессов. Как бы просто это ни было, вы можете создать множество способов управления своими IPC. Например, установка значения 0 для связи с другими процессами, которые вы пишете, и они не должны мешать. Не забудьте сбросить значение, когда закончите писать, и все будет в порядке.

Тупиковые ситуации

Каким бы мудрым это ни было, вы можете получить тупиковые ситуации. Это состояние, при котором два или более процесса ожидают освобождения ресурса друг от друга. Они могут появиться, если блокировка ресурсов была выполнена неправильно или из-за сбоя алгоритма, поэтому обязательно проверяйте каждую ситуацию, когда два процесса блокируют ресурс.

Наше использование IPC

Как заявил субъект, мы использовали общую память, очередь сообщений и семафоры для защиты одновременной записи нескольких процессов.

Первые 400 персонажей общей памяти были ареной 20x20, на которой игроки могли сражаться. Игроки появляются на арене случайным образом, и они представлены номером своей команды. (Пустые квадраты обозначены буквой «X»)
Символы 401–410 обозначают номера игроков, которые участвовали в игре. Изначально это было сделано для того, чтобы не дать игрокам играть и заставить их ждать, если их будет недостаточно, чтобы начать игру, но из-за ошибки сегментации мы отключили эту функцию.

Общая память была успешно создана, но ни один игрок не мог отправлять сообщения.

Наш ИИ

Из-за нехватки времени в конце проекта в нашей последней сборке был случайный ИИ.

Мы все еще планировали создать несколько разных ИИ, чтобы разные команды играли по-разному. Цель состояла в том, чтобы создать 3 типа игрового процесса - нападение, защита, контролируемый случайный - наблюдать за которым было бы очень интересно, если бы мы могли это сделать.

В конце концов, наш проект потерпел неудачу в некоторых моментах (мы потерпели крах во время презентации), но я думаю, что мы многое узнали о IPC.

Я лично считаю, что бесплатный предмет был действительно хорошей идеей, давая нам выбор, как думать о проекте больше, чем когда-либо. Единственный недостаток - я в какой-то момент заблудился из-за отсутствия каких-то указаний.

Теперь, когда этот проект завершен, я надеюсь, что когда-нибудь на втором году обучения в ИТ-школе мы получим аналогичный предмет.

Спасибо за чтение этого,

Сезар Пшибила