Код с потенциальной тупиковой ситуацией - PullRequest
0 голосов
/ 06 октября 2010
// down = acquire the resource
// up = release the resource

typedef int semaphore;
  semaphore resource_1;
  semaphore resource_2;


 void process_A(void) {
    down(&resource_1);
    down(&resource_2);
    use_both_resources();
    up(&resource_2);
    up(&resource_1);
 }

 void process_B(void) {
    down(&resource_2);
    down(&resource_1);
    use_both_resources();
    up(&resource_1);
    up(&resource_2);
 }

Почему этот код вызывает взаимоблокировку?

Если мы изменим код process_B, когда оба процесса запрашивают ресурсы в том же порядке:

 void process_B(void) {
    down(&resource_1);
    down(&resource_2);
    use_both_resources();
    up(&resource_2);
    up(&resource_1);
 }

Тогда нет тупика.

Почему так?

Ответы [ 2 ]

3 голосов
/ 06 октября 2010

Представьте, что процесс A запущен, и попытайтесь получить resource_1 и получить его.

Теперь процесс B получает контроль и пытается получить resource_2.И получает это.Теперь процесс B пытается получить resource_1 и не получает его, потому что он принадлежит ресурсу A. Затем процесс B переходит в спящий режим.

Процесс A снова получает управление и пытается получить resource_2, но он принадлежитпроцесс B. Теперь он тоже идет спать.

На этом этапе процесс A ожидает resource_2, а процесс B ожидает resource_1.

Если вы измените порядок, процесс B никогда не будетзаблокировать resource_2, если он не получит resource_1 первым, то же самое для процесса A.

Они никогда не будут заблокированы.

0 голосов
/ 06 октября 2010

Необходимым условием для тупика является цикл поступления ресурсов. Первый пример конструирует этот цикл 1-> 2-> 1. Второй пример получает ресурсы в фиксированном порядке, что делает цикл и впредь невозможным тупиком.

...