Примитивы бывают что блокируют и не блокируют, иногда они называются соответственно синхронными и асинхронными. При использовании примитива, который блокирует, процесс, который выдал запрос на его выполнение, прекращается к полному завершению примитива. Например, вызов примитива ПОЛУЧИТЬ прекращает процесс, который вызывает, к получению сообщения.

При использовании примитива, который не блокирует, управления поворачивается процесса, который вызывает, немедленно, еще до того, как необходимая работа будет выполнена. Преимуществом этой схемы есть параллельное выполнение процесса, который вызывает, и процесса передачи сообщения. Обычно в ОС есть один из двух видов примитивов и очень редко - оба. Однако выигрыш в производительности при использовании примитивов, которые не блокируют, компенсируется серьезным недостатком: отправитель не может модифицировать буфер сообщения, пока сообщение не отправлено, а узнать, отправленное ли сообщение, отправитель не может. Отсюда сложности в построении программ, которые передают последовательность сообщений с помощью примитивов, которые не блокируют.

Есть два возможных выхода. Первое решение - это заставить ядро копировать сообщение в свой внутренний буфер, а потом решить процесса продолжить выполнение. С точки зрения процесса эта схема ничем не отличается от схемы вызова, который блокирует: как только процесс снова получает управление, он может повторно использовать буфер.

Второе решение состоит в прерывании процесса-отправителя после отправления сообщения, чтобы проинформировать его, что буфер снова доступный. Здесь не нужно копирования, которое экономит время, но прерывание пользовательского  уровня делает программирование запутанным, сложным, может привести к возникновению гонок.

Вопросом, тесно связанным из что блокируют и не блокируют вызовами, есть вопросы тайм-аутов. В системе с  вызовом , который блокирует , ПОСЛАТЬ при отсутствия ответа процесс , который вызывает , может заблокироваться навсегда. Для предотвращения такой ситуации в некоторых системах  процесс , который вызывает , может задать временный интервал, на протяжении которого он ждет ответ. Если за это время сообщения не поступает, вызов ПОСЛАТЬ завершается с кодом ошибки.

 

Возможно стоит прочитать: