@Roddy - я уже читал ссылки, на которые вы указываете, на обе они ссылаются из презентации Пола Тима «Тысячи потоков и блокирующий ввод-вывод - старый способ написания серверов Java снова стал новым».
Однако некоторые вещи, которые не обязательно бросаются в глаза из презентации Пола, заключаются в том, что он указал -Xss:48k для JVM при запуске и что он предполагает, что реализация NIO JVM эффективна, чтобы она была действительной. сравнение.
Indy не указывает столь же уменьшенный и строго ограниченный размер стека. В кодовой базе Indy нет вызовов BeginThread (процедура создания потока Delphi RTL, которую следует использовать в таких ситуациях) или CreateThread (необработанный вызов WinAPI).
Размер стека по умолчанию хранится в PE, а для компилятора Delphi он по умолчанию равен 1 МБ зарезервированного адресного пространства (пространство выделяется ОС страница за страницей фрагментами по 4 КБ; фактически компилятору необходимо генерировать код для обращения к страницам, если в функции содержится >4 КБ локальных переменных, поскольку расширение контролируется ошибками страниц, но только для самой нижней (защитной) страницы в стеке). Это означает, что у вас закончится адресное пространство после максимум 2000 одновременных потоков, обрабатывающих соединения.
Теперь вы можете изменить размер стека по умолчанию в PE с помощью директивы {$M minStackSize [,maxStackSize]}, но это повлияет на все потоки, включая основной поток. Я надеюсь, что вы не будете делать много рекурсии, потому что 48 КБ или (аналогично) - это не так много места.
Теперь, прав ли Пол в отношении неэффективности асинхронного ввода-вывода, в частности, для Windows, я не уверен на 100% - мне нужно измерить это, чтобы быть уверенным. Однако я точно знаю, что аргументы в пользу того, что многопоточное программирование проще, чем асинхронное программирование на основе событий, представляют собой ложную дихотомию.
Асинхронный код не обязательно должен быть основан на событиях; он может быть основан на продолжении, как в .NET, и если вы укажете замыкание в качестве своего продолжения, вы получите состояние, поддерживаемое для вас бесплатно. Кроме того, преобразование из линейного кода в стиле потока в асинхронный код в стиле с передачей продолжения может быть выполнено компилятором механически (преобразование CPS является механическим), поэтому ясность кода также не требуется.
person
Barry Kelly
schedule
04.09.2008