Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.12.2009, 07:51
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Вопрос Потоки... Потоки... Очень Много Потоков...

Многопоточность... Это уже все понятно... В интернете куча примеров... Сам реализовывал такие программы... Находил что новое понимал... А вот сдесь столкнулся с реальной проблемой... И так...
Есть приложение которое должно выполнить цикл и создать ну например ~ 10000 потоков которые будут че то делать... Вот примерный пример кода:
Код:
type
  TT = class(TThread)
  private
    URLRW: String;
    PSRW: String;
    PPRW: Integer;
  protected
    procedure Execute; Override;
  public
    property URL: String read URLRW write URLRW;
    property PS: String read PSRW write PSRW;
    property PP: Integer read PPRW write PPRW;
end;

procedure TT.Execute;
begin
Sleep(99999);
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
T: TT;
I: Integer;
begin
for I:=0 to 10000 do
begin
T:=TT.Create(True);
T.FreeOnTerminate:=True;
T.OnTerminate:=DoneTerminate;
T.Resume;
MainForm.Caption:=IntToStr(I);
Application.ProcessMessages;
end;
end;

В данном примере, поток создается и "СПИТ"... Создание идет до ~2000 потока хорошо а потом вылетает ошибка "Thread creation error: Недостаточно памяти для обработки команды"...
Где то слышал что под поток Windows выделяет определенное количество памяти... Так вот... Если это так... Можно ли изменить это???
Например выделить больше памяти... Или меньше...
Ну не верю я просто что 2Гб оперативной и 2Гб виртуальной памяти не хватает для 3000 потоков... Можно подсчитать... 4000Мб / 2000Потоков = 2Мб на пустой поток... Но если верить "диспетчеру задач"... То на 2010 созданных потоков, расходуется 21Мб оперативной и 51Мб виртуальной памяти... Так как же все таки изменить размеры памяти выделяемой для потока??? Или как создать например 20000 потоков??? Уверен "железо" позволяет...
Буду рад Любым Мыслям... Заранее огромное спасибо...
Ответить с цитированием
  #2  
Старый 31.12.2009, 13:24
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

На каждый поток ОС создает свой хэндл, а их количество намного меньше виртуальной памяти.
К тому же при переключении на другие потоки сохраняются регистры и состояние процессора ( не в файл же подкачки ).
Интересно при таком количестве потоков система сможет еще чтонибуть делать кроме переключения между ними?
Вот пару ссылок
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Ответить с цитированием
  #3  
Старый 31.12.2009, 17:52
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Че то, как то не верю я... Что количество потоков зависит от максимального количества хэндлов... Тогда как быть с сервером Apache например?!! Неужели максимальное количество подключившихся клиентов равна ~2000??? Или я че то непонимаю???
Ответить с цитированием
  #4  
Старый 31.12.2009, 19:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Romix
Че то, как то не верю я... Что количество потоков зависит от максимального количества хэндлов... Тогда как быть с сервером Apache например?!! Неужели максимальное количество подключившихся клиентов равна ~2000??? Или я че то непонимаю???
Это уже совсем другая история. Подробно не скажу. Но все зависит и от времени обработки одного запроса ( постоянное соединение не поддерживается в таких случаях ), создается пул потоков, в каждом потоке очередь обслуживания запросов, далее механизм перенаправления на менее загруженный сервер ( посмотрите, что написано на однокласниках вместо www - каждая комбинация свой сервер и не уверен что один ). Лучше эту инфу погуглить, поискать.
Ответить с цитированием
  #5  
Старый 31.12.2009, 19:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По некоторым экспериментам несколько раз назад, уже при 500 потоках комп начинает жутко тормозить и эффективность падает до нуля. Если правильно помню MSDN, то Microsoft не рекомендует делать больше 50 потоков в одном придожении.
Ответить с цитированием
  #6  
Старый 02.01.2010, 04:42
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Как найду решение, сразу же сообщу... А пока буду искать... Спасибо Вам, за то что направили Меня...
Ответить с цитированием
  #7  
Старый 02.01.2010, 12:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Нашел тут инфу, что при создании потока каждому под стек по умолчанию отводится по мегабайту. И тогда становится понятно, почему ваших 2 гигов хватает только на 2000 потоков.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 02.01.2010, 12:25
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Страдалецъ
Нашел тут инфу, что при создании потока каждому под стек по умолчанию отводится по мегабайту. И тогда становится понятно, почему ваших 2 гигов хватает только на 2000 потоков.
Если можно дайте пожалуйста ссылочку на инфу. А то гложат сомнения.
Что для процесса ( при запуске exe ) знаю ( в Delphi 7 можно изменить в свойствах проекта на вкладке Linker ), dll, насколько помню, пользуется стеком загружающей ее программы, а вот про потоки ? ( всегда думал что общим стеком пользуются ).
Ответить с цитированием
  #9  
Старый 02.01.2010, 12:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Проверьте на практике. Вытащите одну планку памяти или если есть виртуальная машина там попробовать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 02.01.2010, 12:35
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Поправлюсь - неправильно сказал, про стек для потоков не задумывался.
Это почему-то в последнее время встречаю уже несколько раз попытки создания огромного количества потоков.
Ответить с цитированием
  #11  
Старый 02.01.2010, 12:39
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от Страдалецъ
Проверьте на практике. Вытащите одну планку памяти или если есть виртуальная машина там попробовать.
На досуге проведу эксперименты - правда надеюсь хватит окна CPU в отладчике.
Ответить с цитированием
  #12  
Старый 02.01.2010, 12:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вот интересная статейка:
http://www.devdoc.ru/index.php/conte...i_thread_1.htm т.е. можно попробовать задать собственно размер стека при создании процесса, а не выдергивать память
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 02.01.2010, 12:52
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Спасибо большое, разобрался положил на полочку ( сам никогда пул больше 10 нитей не делал ).
Вот еще ссылочку нашел: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Цитата:
Remarks

The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,048 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.
Ответить с цитированием
  #14  
Старый 02.01.2010, 17:49
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Круто... Не ожидал... Что всем так будет интерестно... Спасибо огромное... Так а терь вопрос!!! Как изменить размер стэка если потоки создавать через класс TThread, а не WINApi... Я с Вами... Буду искать... Кстати инфы про "пул потоков в Delphi" так и не нашел...
Ответить с цитированием
  #15  
Старый 02.01.2010, 17:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А вот такую инфу по этой теме еще нарыл. http://vsokovikov.narod.ru/New_MSDN_...reatefiber.htm
Может вам будет полезно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter