![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
Здравствуйте. Пишу многопоточное сервер-приложение, работающее с блокирующими сокетами. Число подключений может быть очень большим. Все бы ничего, пока ради интереса не проверил, сколько 32-битное приложение, созданное в Делфи, сможет создать потоков. В моем случае оказалось всего 1542... и Thread Creation Error: невозможно создать новые дескрипторы потоков (что-то в этом духе).
Перекопал инет на эту тему, и узнал, что число создаваемых потоков в одном процессе ограничено двумя факторами: разрядностью ОС и свободной RAM. Т.к. компилятор Делфи все еще 32-битный, то выделяемое адресное пространство для процесса составляет 2гб. Для создаваемого процесса стек резервируется объемом 1мб+256кб. При создании нового потока в Делфи (своя реализация TThread) конструктор Create, если посмотреть его реализацию в Classes.pas, создает поток с помощью WinApi BeginThread, где параметру dwStackSize передается 0. Это означает, что создаваемому потоку выделится стек объемом как и самому процессу, т.е. 1,25мб. В принципе, баш на баш: 1,25*1542=1927,5мб, т.е. почти 2гб. Вот, собственно, и суть проблемы. И вопрос: есть способы увеличить число создаваемых потоков в 32-битовом процессе? Заранее спасибо!
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#2 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
вот ссылки, что нарыл:
http://blogs.technet.com/b/mark_russ...2/3290815.aspx http://vsokovikov.narod.ru/New_MSDN_...eatethread.htm
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
по мне так стоит менять подход, ибо 1500 активных потоков, это сильный тормоз выйдет...
да и не нужны же все эти потоки вечно. часто делают пул потоков, и когда надо, то выделяют поток на обработку запроса. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
а что такое пул потоков? и где можно почитать подробно про него?
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#5 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Если вы спрашиваете, сколько можно максимально создать потоков - это признак того, что вы что-то делаете неправильно.
В данном случае делается один поток и асинхронные запросы. А 1500 потоков - это всё равно что покупать новый автомобиль, чтобы заменить колесо.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
При создании более 1000 потоков основное время процессора будет тратиться на переключение между ними (если, конечно, у вас не кластер на 100-200 процов).
Можно и блокирующие сокеты оставить, делать только select(), чтобы не было блокировок. Тогда достаточно нескольких потоков, чтобы обрабатывать множество подключений. Но вобще, если у вас бывает 1500 (и более) активных подключений, то IOCP, AcceptEx(), WSARecv(), WSASend(), GetQueuedCompletionStatus() и т.п. придумано специально для вас. Никто кроме IOCP не сможет лучше нагрузить ваш пул потоков на все 100%.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#9 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
IOCP - что это такое? какая-то специальная технология распределения сокетов? Где-нибудь можно почитать про это?
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
IOCP = I/O Completion Port, порт завершения ввода-вывода
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
масив. максимальное число | viknik | Помощь студентам | 2 | 14.03.2011 12:23 |
Максимальное число из n колличества переменных | Красильников Илья | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 18.02.2011 15:42 |
Максимальное число | Tattoo-master | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 18.02.2011 12:15 |
Найти максимальное число в последовательности | vladoscom93 | Паскаль, Turbo Pascal, PascalABC.NET | 11 | 14.12.2010 21:43 |
Максимальное число | LOVELY | Помощь студентам | 2 | 12.02.2010 01:21 |