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

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

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

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

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

Процесс, который заинтересован в получении сообщений, оборачивается к ядру с запросом о создании для него почтового ящика и сообщает адрес, по которому ему могут поступать сетевые пакеты, после чего все сообщения с данным адресом будут помещены в его почтовый ящик. Такое средство часто называют буферизуемым примитивом.

 

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