Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 03.09.2011, 13:18   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 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-битовом процессе?

Заранее спасибо!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.09.2011, 13:21   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

вот ссылки, что нарыл:
http://blogs.technet.com/b/mark_russ...2/3290815.aspx
http://vsokovikov.narod.ru/New_MSDN_...eatethread.htm
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.09.2011, 13:23   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

по мне так стоит менять подход, ибо 1500 активных потоков, это сильный тормоз выйдет...
да и не нужны же все эти потоки вечно.
часто делают пул потоков, и когда надо, то выделяют поток на обработку запроса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2011, 13:28   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

а что такое пул потоков? и где можно почитать подробно про него?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.09.2011, 13:36   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
создает поток с помощью WinApi BeginThread, где параметру dwStackSize передается 0
Ничто не мешает создать тот же поток прямым вызовом BeginThread, указав ему нужный размер стека.
mss вне форума Ответить с цитированием
Старый 03.09.2011, 13:58   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

http://ru.wikipedia.org/wiki/Объектный_пул
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2011, 15:58   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если вы спрашиваете, сколько можно максимально создать потоков - это признак того, что вы что-то делаете неправильно.

В данном случае делается один поток и асинхронные запросы. А 1500 потоков - это всё равно что покупать новый автомобиль, чтобы заменить колесо.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 03.09.2011, 17:31   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

При создании более 1000 потоков основное время процессора будет тратиться на переключение между ними (если, конечно, у вас не кластер на 100-200 процов).

Можно и блокирующие сокеты оставить, делать только select(), чтобы не было блокировок. Тогда достаточно нескольких потоков, чтобы обрабатывать множество подключений.

Но вобще, если у вас бывает 1500 (и более) активных подключений, то IOCP, AcceptEx(), WSARecv(), WSASend(), GetQueuedCompletionStatus() и т.п. придумано специально для вас. Никто кроме IOCP не сможет лучше нагрузить ваш пул потоков на все 100%.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.09.2011, 13:50   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

IOCP - что это такое? какая-то специальная технология распределения сокетов? Где-нибудь можно почитать про это?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 05.09.2011, 13:54   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

IOCP = I/O Completion Port, порт завершения ввода-вывода
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
масив. максимальное число viknik Помощь студентам 2 14.03.2011 13:23
Максимальное число из n колличества переменных Красильников Илья Паскаль, Turbo Pascal, PascalABC.NET 2 18.02.2011 16:42
Максимальное число Tattoo-master Паскаль, Turbo Pascal, PascalABC.NET 1 18.02.2011 13:15
Найти максимальное число в последовательности vladoscom93 Паскаль, Turbo Pascal, PascalABC.NET 11 14.12.2010 22:43
Максимальное число LOVELY Помощь студентам 2 12.02.2010 02:21


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS