Прежде всего, классическая парадигма Unix-сервера основана на фильтрах.Например, различные сетевые службы могут быть настроены в / etc / services, и программа, подобная inetd, прослушивает все сокеты TCP и UDP для входящих соединений и дейтаграмм.Когда соединение / DG приходит, оно разветвляется, перенаправляет stdin, stdout и stderr в сокет с помощью системного вызова dup2, а затем исполняет процесс сервера. Вы можете взять любую программу, которая читает из stdin и записывает в stdout, и превращает ее в сетевой сервис, такой как grep .
Согласно Стивену в " Сетевое программирование Unix", существует пять видов серверных моделей ввода / вывода (стр. 154):
- блокирование
- неблокирование
- мультиплексирование (выбор и опрос)
- Управляемый сигналом
- асинхронный (функции POSIX aio_)
Кроме того, серверы могут быть итеративными или параллельными.
Вы спрашиваете, почемуTCP-серверы обычно работают одновременно, а UDP-серверы - итеративные.
На стороне UDP легче ответить.Обычно приложения UDP следуют простой модели ответа на запрос, когда клиент отправляет короткий запрос с последующим ответом, причем каждая пара представляет собой отдельную транзакцию.UDP-серверы - единственные, которые используют ввод-вывод Signal Drive, и очень редко.
TCP немного сложнее.Итеративные серверы могут использовать любую из моделей ввода-вывода, указанных выше, кроме # 4.Самые быстрые серверы на одном процессоре - это итеративные серверы, использующие неблокирующий ввод-вывод.Тем не менее, они считаются относительно сложными для реализации, и это плюс идиома фильтра Unix, где традиционно первичные причины для использования параллельной модели с блокирующим вводом / выводом, будь то многопроцессный или многопоточный.Теперь, с появлением обычных многоядерных систем, параллельная модель также имеет преимущество в производительности.