Предположим, у меня есть система с N процессами. Каждый процесс требует максимальных ресурсов K (K < < N). Для предотвращения конфликтов процесс должен блокировать каждый ресурс перед его доступом. Возможна ли взаимоблокировка, и если да, то каков максимальный N, для которого система по-прежнему безголовая?Тупик для системы с N потоками
ответ
Максимальное значение N равно 1. При использовании двух или более потоков, взаимодействующих в одном и том же процессе с одной и той же памятью, взаимоблокировка вполне возможна. Сценарий:
A asks for and receives lock 1
B asks for and receives lock 2
A asks for lock 2 and pauses
B asks for lock 1 and pauses
A and B now deadlock
Порядок блокировки должны быть согласованы в течение> 1 замков для того, чтобы полностью предотвратить тупики.
«Для предотвращения столкновений процесс должен блокировать каждый ресурс перед его доступом» - это вводит в заблуждение/неверно. Он должен заблокировать КАЖДЫЙ ресурс, который ему нужен, в одной операции блокировки или оставаться заблокированным до тех пор, пока весь комплект не станет доступен. Вполне возможно, что потоки будут представлять требование к ресурсам, установленное для структуры/экземпляра управления ресурсами, и оставаться заблокированными до тех пор, пока ВСЕ ресурсы в наборе не станут доступны, не предотвращая доступ к любому из них во время ожидания.
Применение блокировки для каждого ресурса и создание потоков для последовательной блокировки ресурсов - это наивное решение, которое, скорее всего, не сработает для любого N> 1, как объясняет Хейни.