Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзамену СПО.docx
Скачиваний:
1
Добавлен:
18.01.2024
Размер:
1.11 Mб
Скачать
  1. Механизмы взаимодействия процессов (потоков): очереди сообщений, разделяемая память, обмен сообщениями, сокеты.

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

Создающий процесс может выполнять следующие действия над очередью:

• создание очереди;

• просмотр очереди;

• закрытие очереди.

Записывающий процесс осуществляет действия:

• открыть очередь;

• записать в очередь;

• закрыть очередь.

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

Этот способ обеспечивает наиболее быстрый обмен данными между процессами.

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

Существует несколько способов обмена сообщениями между процессами:

– Синхронный обмен сообщениями: процесс отправляет сообщение другому процессу и ждет, пока тот не ответит.

– Асинхронный обмен сообщениями: процесс отправляет сообщение и продолжает свою работу, не дожидаясь ответа.

– Использование разделяемой памяти: процессы могут совместно использовать общую область памяти для обмена данными.

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

Выбор способа обмена сообщениями зависит от конкретной задачи и требований к производительности системы.

Сокеты. Сокет — это средство связи, позволяющее разрабатывать клиент-серверные системы для локального или сетевого использования.

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

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

Используется не только для обмена по сети, но и для обмена на одном устройстве.

  1. Понятие семафора. Решение задачи взаимоисключения с использованием семафора. Понятие сигнализирующего семафора, мьютекса, монитора.

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

Управление семафором реализуется с помощью функций:

• установки семафора с целью сигнализации;

• ожидание вызывающим потоком, пока семафор не будет выключен;

• ожидание потоком выключения одного из нескольких семафоров.

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

Мьютекс (от англ. mutual exclusion — «взаимное исключение») — это примитив синхронизации, который предоставляет механизм взаимного исключения. Мьютекс позволяет только одному потоку находиться в критической секции кода одновременно. Если поток пытается войти в критическую секцию, когда другой поток уже находится там, он блокируется до тех пор, пока другой поток не выйдет из критической секции.

Создается мьютекс вызовом функции CreateMutex, которая имеет следующий прототип:

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты

BOOL bInitialOwner, // начальный владелец мьютекса

LPCTSTR lpName // имя мьютекса

);

В случае удачного завершения функция CreateMutex возвращает дескриптор созданного мьютекса. В случае неудачи эта функция возвращает значение NULL. Если мьютекс с заданным именем уже существует, то функция CreateMutex возвращает дескриптор этого мьютекса, а функция GetLastError, вызванная после функции CreateMutex вернет значение ERROR_ALREADY_EXISTS.

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

  1. Классические проблемы взаимодействия процессов (потоков): производителей и потребителей, читателей и писателей, обедающих философов, спящего парикмахера, железнодорожного перегона.

    Проблема производитель-потребитель

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

Давайте рассмотрим диаграмму, показывающую этот простой сценарий:

По своей сути, эта проблема имеет определенные сложности для решения :

  • И производитель, и потребитель могут попытаться обновить очередь одновременно. Это может привести к потере данных или несоответствиям.

  • Производители могут быть медленнее, чем потребители. В таких случаях потребитель будет быстро обрабатывать элементы и ждать.

  • В некоторых случаях потребитель может быть медленнее производителя. Эта ситуация приводит к проблеме переполнения очереди.

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

На диаграмме ниже показан случай с несколькими производителями и несколькими потребителями:

Программа для решения проблемы “производитель-потребитель” может работать следующим образом:

  1. Процессы-производители создают данные и помещают их в общую очередь.

  2. Процессы-потребители считывают данные из очереди и обрабатывают их.

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

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

  5. Если очередь пуста, процессы-потребители блокируются до тех пор, пока процесс-производитель не добавит новые данные в очередь.