Почему может быть нельзя передать одному процессу ресурс пока другой процесс не закончит системный вызов связанный с этим ресурсом?
=====================================================================================================================================

 Цитирую книгу:  

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

  
  

Вроде бы ничего сложного нет, ядру достаточно перевести процесс в режим ожидания и дать другому процессу возможность использовать ресурс.  
  

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

 Классический пример: предположим у нас есть два вида процессов - "читатели" и "писатели", причем работают данные пишутся и читаются в стек (читать и писать можно только с вершины, при завершении чтения инкремент уменьшается на 1, при завершении записи - увеличивается на 1), пишут и читают они по 4 байта.   
  

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