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

Проблема читателей-писателей

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

Первая проблема читателей-писателей (приоритет читателя)

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

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

Вторая проблема читателей-писателей (приоритет писателя)

Проблема формулируется так.

Как только появился хоть один писатель, читателей больше не пускать. При этом читатели могут простаивать.

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

Третья проблема читателей-писателей (честное распределение ресурсов)

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

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

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

Вариант «Задачи об обедающих философах» демонстрируется рисунком 4.2 и следующим описанием:

• За круглым столом сидит несколько философов.

• В каждый момент времени каждый из них либо беседуетлибо ест.

• Для процесса еды одновременно требуются две вилки. Поэтому, прежде чем

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

• Немного поев, философ кладет вилки на стол и вновь присоединяется к беседе.

• Требуется разработать программную модель обеда философов.

Рисунок 4.2 - Схема стола для задачи обедающих философов

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

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

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

Для моделирования такой независимости предполагаем, что:

• время одной порции разговора философа - случайное значение trnd;

• время одной порции поедания обеда философа - случайное значение ernd;

• общее время поедания всего обеда — ограничено, поэтому философ может завершить обед в несколько приемов.

Описание действий философа:

• философ какое-то время беседует (trnd), затем пытается взять вилки слева и справа от себя;

• когда ему это удается, он некоторое время ест (ernd), после чего освобождает вилки;

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

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

Проблема спящего парикмахера

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

Решение: Программа имитирует работу парикмахера, который может обслуживать только одного клиента за раз. Когда клиент приходит, он вызывает метод add_client, который увеличивает количество клиентов и будит одного из парикмахеров. Парикмахер, который был разбужен, вызывает метод wait_for_client, который уменьшает количество доступных парикмахеров и блокирует текущий поток, ожидая, пока парикмахер не будет снова доступен. После ожидания клиентского обслуживания, парикмахер увеличивает количество доступных парикмахеров и будит всех остальных парикмахеров с помощью condition_variable::notify_all.

Модель железнодорожного перегона

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

Железная дорога, соединяющая два города А и В, включает участок, на котором имеется только единственный путь. Движение поездов на единственном пути подчиняется следующим ограничениям:

- на свободный единственный путь может войти поезд любого направления;

- пока на единственном пути находится поезд некоторого направления, на него не может войти поезд другого направления, но может войти поезд того же направления.

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