Skip to content

Kochnev Roman lab1#6

Open
poma12390 wants to merge 8 commits intomasterfrom
lab1-dev
Open

Kochnev Roman lab1#6
poma12390 wants to merge 8 commits intomasterfrom
lab1-dev

Conversation

@poma12390
Copy link

@poma12390 poma12390 commented Sep 23, 2025

Диаграмма взаимодействия между объектами

sequenceDiagram
    autonumber
    %% Участники
    participant P as Programmer (Thread)
    participant F as FairnessStrategy
    participant D as DeadlockStrategy
    participant L as Left Spoon (ReentrantLock)
    participant R as Right Spoon (ReentrantLock)
    participant Q as BlockingQueue<RefillRequest>
    participant W as Waiter (Thread)
    participant S as FoodStock
    participant M as SimulationStats

    %% Долив порции (запрос → обработка → результат)
    P->>Q: Поместить запрос на еду (RefillRequest)
    Note right of Q: Producer/Consumer<br/>межпоточная передача
    W->>Q: Забрать запрос
    Q-->>W: Передать RefillRequest официанту
    W->>S: Списать одну порцию со склада (если остались)
    S-->>W: Успех / Пусто
    Note over W,P: Ответ возвращается через<br/>завершение CompletableFuture
    W-->>P: Сообщить результат пополнения (успешно / еды нет)

    alt Еды больше нет и тарелка пуста
        Note over P: Условия завершения выполнены
        P-->>P: Завершить работу
    else Есть локальная порция
        loop Цикл приёма пищи
            %% Предварительный допуск по справедливости
            P->>F: Можно ли начинать есть сейчас?
            F-->>P: Да / Нет
            alt Нет
                P->>P: Небольшая пауза → вернуться к размышлению
            else Да
                %% Войти в "ворота" против дедлока
                P->>D: Войти в зону захвата двух ложек
                D-->>P: Вход разрешён

                %% Захват ложек (сначала меньший id)
                P->>L: Попытаться захватить первую ложку
                alt Ложка получена
                    P->>R: Попытаться захватить вторую ложку
                    alt Вторая получена
                        %% Повторная проверка справедливости перед едой
                        P->>F: Подтвердить возможность поесть
                        F-->>P: Да / Нет
                        alt Нет
                            Note over P: Освободить обе ложки и отступить
                        else Да
                            P->>F: onStartEat(id)
                            P->>P: Съесть одну порцию
                            P->>M: Зарегистрировать съеденную порцию
                            P->>F: onFinishEat(id)
                        end
                    else Таймаут на второй
                        Note over P,L: Освободить первую ложку и откатиться
                    end
                    P->>R: Освободить вторую ложку
                else Таймаут на первой
                    P->>P: Небольшая пауза → вернуться к размышлению
                end
                P->>L: Освободить первую ложку
                P->>D: Покинуть зону захвата
            end

            %% Проверка завершения цикла
            alt Склад пуст и локальной порции больше нет
                P-->>P: Выйти из цикла и завершиться
            else Иначе
                P-->>P: Вернуться к запросу
            end
        end
    end
Loading

Описание действий

  1. Поток-программист просыпается в своём цикле и проверяет тарелку: пусто или нет
  2. Если пусто — формирует запрос на пополнение и помещает его в очередь
  3. Официант из своего пула извлекает запрос
  4. Официант пытается списать одну порцию со склада — операция проводится атомарно
  5. По результату официант сообщает программисту: «порция выдана» или «еды больше нет»
  6. Программист дожидается ответа: при успехе отмечает, что в тарелке появилась порция; при отказе готовится к завершению
  7. Перед тем как тянуться к ложкам, программист сверяется со стратегией
  8. Если справедливость не пускает — делает короткую паузу и пробует позже
  9. Если допуск есть — для предотвращения дедлока одновременно к ложкам допускается не больше, чем n-1 прогеров
  10. Программист определяет очередность ресурсов: сперва ложка с меньшим идентификатором, затем — с большим
  11. Программист предпринимает попытку взять ложку в пределах ограниченного времени ожидания
  12. Если ложка не досталась вовремя — возвращается к размышлению.
  13. Если ложку удалось занять — пытается получить вторую в тот же ограниченный промежуток
  14. Если вторую взять не получилось — освобождает первую
  15. Когда обе ложки в руках — снова сверяется с правилом справедливости
  16. Если повторная проверка запрещает есть — освобождает обе ложки
  17. Если всё разрешено — приступает к еде и опустошает тарелку
  18. По завершении еды обновляет свой счётчик
  19. После этого освобождает обе ложки и уступает шанс другим участникам
  20. Если на складе ещё остались порции — возвращается к размышлению и готовит следующий запрос
  21. Если склад пуст, но в тарелке ещё есть порция — доедает её
  22. Если склад пуст и тарелка пуста — завершает свой цикл и завершает работу
  23. Остальные программисты параллельно проходят те же фазы; официанты продолжают обслуживать
  24. Симуляция дожидается, пока все программисты закончат, и только после этого просит официантов остановиться
  25. Оставшиеся в очереди запросы закрываются отказом, чтобы ни один ожидающий не завис
  26. В финале собирается статистика

Диаграмма состояний программиста

stateDiagram-v2
    [*] --> THINKING

    THINKING --> REQUESTING_REFILL : тарелка пуста
    REQUESTING_REFILL --> WAITING_REFILL : put(request)
    WAITING_REFILL --> WAITING_SPOONS : granted (hasPortion=true)
    WAITING_REFILL --> DONE : denied && !hasPortion && stock.depleted

    WAITING_SPOONS --> THINKING : tryLock timeout (любая ложка)
    WAITING_SPOONS --> THINKING : fairness denied
    WAITING_SPOONS --> EATING : обе ложки взяты & fairness ok

    EATING --> THINKING : consume exactly 1 portion (hasPortion=false)

    THINKING --> DONE : stock.depleted && !hasPortion
    DONE --> [*]
Loading

@kechinvv
Copy link

Попробуйте пж замерить разницу между вашим подходом к очереди и очереди с приоритетом

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants