Важная проблема тупиковой ситуации в работе сервера
Многие реализации серверов имеют один важный недостаток, а именно — сервер может легко оказаться в тупиковой ситуации. Чтобы понять, как может возникнуть тупиковая ситуация, рассмотрим последовательный сервер с установлением логического соединения. Предположим, что клиентское приложение (например, С) выполняет недопустимые действия. В простейшем случае предположим, что приложение С формирует соединение с сервером, но не присылает никаких запросов. Сервер принимает запрос на установление соединения и вызывает функцию recv или read для получения ожидаемого запроса. Поэтому серверная программа заблокируется в этом системном вызове, ожидая запроса, который никогда не поступит. Юридическое обслуживание. Юридическое обслуживание в Перми. Тарифы на обслуживание юридических лиц.
Тупиковая ситуация в сервере может возникнуть при еще менее очевидных обстоятельствах, если клиенты действуют неправильно, не считывая отправленные сервером ответы. Например, предположим, что клиент С установил соединение с сервером, передал ему ряд запросов, но не прочитал ни одного ответа. Сервер принял один за другим запросы, сформировал ответы и отправил их клиенту. Применяемое на сервере программное обеспечение протокола TCP выполнило передачу нескольких первых байтов через соединение с клиентом. В этот момент вступает в действие механизм управления потоком данных TCP. После заполнения буфера приема данных клиента протокол TCP прекращает передачу данных. Серверная прикладная программа продолжает формировать ответы. Локальный выходной буфер TCP, применяемый программным обеспечением этого протокола для хранения исходящих данных соединения, заполняется, а сервер блокируется.
Тупиковая ситуация возникает в связи с тем, что при отсутствии возможности выполнения операционной системой системного вызова вызывающая программа блокируется. В частности, при вызове функции send или write вызывающая программа блокируется, если программное обеспечение TCP не имеет свободного локального буферного пространства для размещения передаваемых данных, а при вызове функции recv или read вызывающая программа блокируется до тех пор, пока программное обеспечение TCP не получит данные. В параллельных серверах блокируется только один ведомый поток, связанный с конкретным клиентом, если этот клиент окажется не в состоянии отправлять запросы или читать ответы. Однако в реализациях, основанных на использовании одного потока выполнения, блокируется весь сервер. После возникновения блокировки сервер теряет способность поддерживать остальные соединения. Это означает, что любой сервер, в котором используется только один поток, может оказаться в тупиковой ситуации.

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