Отказ от применения блокирующих операций

Как можно предотвратить блокировку сервера во время передачи? Для этого могут применяться два основных варианта: организовать параллельную работу сервера или исключить использование в сервере вызовов, которые могут заблокироваться. В первом варианте для обслуживания каждого клиента применяется отдельный процесс, поэтому задержка, созданная одним из клиентов, не отражается на работе других клиентов. В последнем случае в сервере может применяться механизм закрытия по тайм-ауту активных соединений. Перед выполнением каждого вызова такой блокирующей операции, как send, в сервере необходимо проверять, не будет ли заблокирован данный вызов. Если система сообщает, что сокет не готов к приему данных, сервер устанавливает таймер, а затем снова пытается проверить готовность. Если сокет не переходит в состояние готовности в течение установленного тайм-аута, сервер может закрыть это соединение. Тумбы для обуви: обувница для обуви. Мир полной моды - одежда оптом больших размеров.

31.10. Процессы, соединения и связанные с ними ограничения

Хотя параллельная организация работы позволяет решить многие проблемы тупиковых ситуаций, распараллеливание также имеет свои пределы. Как было указано в главе 16, необходимо управлять распараллеливанием работы, поскольку при использовании неограниченного числа параллельных процессов вполне могут возникнуть проблемы. В частности, функционирование сервера, создающего новый процесс для каждого клиентского соединения, может быть нарушено при взаимодействии с неправильно разработанными клиентскими программами, поскольку операционная система не допускает применения произвольной степени распараллеливания. В конечном итоге такой параллельный сервер исчерпает все ресурсы системы. Например, в любой операционной системе ограничено число процессов, активных сокетов, суммарное число доступных дескрипторов, а также число блоков управления передачей (ТСВ — Transmission Control Block), которые могут быть распределены программным обеспечением TCP. В частности, в каждом открытом соединении TCP используется буферное пространство, поэтому для создания каждого дополнительного соединения требуется соответствующий объем памяти.

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

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

Похожие статьи Меню Опрос Фото Популярное