2010-10-06 3 views
0
// 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); 
} 

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

Почему так?

ответ

3

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

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

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

На данный момент процесс A ожидает ресурса_2, а процесс B ожидает ресурса_1.

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

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

0

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

Смежные вопросы