Russian Qt Forum
Ноябрь 27, 2024, 01:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как Qt работает с памятью и вообще про память  (Прочитано 24839 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Январь 31, 2010, 02:11 »

Ну вот, запутали человека, а потом еще и накричали на него  Улыбающийся

1) У каждой thread (нитки) свой стек, выделяется OS'ом. Как он его выделяет - его личное дело, знание этих подробностей ничего практически не дает.

2) Наукообразные выражения типа "Выделение памяти на стеке" (так же как и "стековая память быстрее") - сбивают с толку, можно подумать что это что-то типа new. В действительности все "выделение" сводится к одной команде, а "освобождение" - к другой

Код:
sub  esp, 8    // "выделить" 8 байт на стеке
...
add  esp, 8    // "освободить" их
Пусть регистр esp указывал на какой-то адрес, напр 100 (условно конечно, реальный адрес смотрится типа 0xABD00F00). Вычли из esp 8, теперь esp = 92. Значит, в байтах [92..99]  можно что-то хранить. Если еще потребуется - опять вычтем из esp (стек растет в сторону уменьшения адресов). Ясно, до тех пор пока не исчерпаем стек. Когда мы добавили к esp - используемые байты никуда не делись - просто их может теперь использовать следующий "вычитающий".

Раньше была классная программа Turbo Debugger - там это все было видно живьем.
Записан
garryHotDog
Гость
« Ответ #16 : Март 05, 2010, 23:19 »

А как нибудь можно вычислить необходимы размер стека...а то у меня прога при разных значения то падает (segmentation fault) -указывал 1-2Мб то пишет ошбку - Qthread::start: Thread stack size error:....это все на линуксе
Записан
BRE
Гость
« Ответ #17 : Март 05, 2010, 23:31 »

Ты что на стеке потока большие буферы размещаешь?
Или рекурсию используешь?
По умолчанию размер стека, как бы совсем не мал для обычной работы.

$ ulimit -s
10240

Это в Кб.

Записан
garryHotDog
Гость
« Ответ #18 : Март 05, 2010, 23:37 »

внутри функции run цикл стоит в котором идет работа с сокетом...щас попробую до 2ух мегабайт увеличить в limits.conf
Записан
BRE
Гость
« Ответ #19 : Март 05, 2010, 23:41 »

внутри функции run цикл стоит в котором идет работа с сокетом...щас попробую до 2ух мегабайт увеличить в limits.conf
Размер стека можно задавать каждому потоку:
void QThread::setStackSize ( uint stackSize )

IMHO, что то у тебя в run не так...
« Последнее редактирование: Март 05, 2010, 23:47 от BRE » Записан
garryHotDog
Гость
« Ответ #20 : Март 05, 2010, 23:51 »

да я уже тоже думал так....но 400 потоков запускаюся а 500 нет...ограничения на открытые файлы снял....вот сижу и тыкась с размерами....по умолчанию в Ubuntu 8192 кб(слишком много на 400 потоков)...а еще вопрос setSocketSize в чем указывается размер б\Кб?Непонимающий
Записан
BRE
Гость
« Ответ #21 : Март 05, 2010, 23:53 »

да я уже тоже думал так....но 400 потоков запускаюся а 500 нет...ограничения на открытые файлы снял....вот сижу и тыкась с размерами....по умолчанию в Ubuntu 8192 кб(слишком много на 400 потоков)...а еще вопрос setSocketSize в чем указывается размер б\Кб?Непонимающий
Цитировать
Sets the maximum stack size for the thread to stackSize. If stackSize is greater than zero, the maximum stack size is set to stackSize bytes, otherwise the maximum stack size is automatically determined by the operating system.
Записан
garryHotDog
Гость
« Ответ #22 : Март 05, 2010, 23:55 »

спасибо...самое итересно дважды до этого читал и не заметил...спасибо еще раз...буду дальше мучаться с запуском!
Записан
ритт
Гость
« Ответ #23 : Март 06, 2010, 02:28 »

> 400 потоков запускаюся а 500 нет

у вас там кластер, что ли? похоже, что нет, раз какие-то проблемы с выделением памяти...
суперкомпьютер? похоже, что нет, раз какие-то проблемы с выделением памяти...
резолюция: нахера?! Улыбающийся
Записан
garryHotDog
Гость
« Ответ #24 : Март 06, 2010, 11:10 »

задача такая!!!! я согласен что звучить старнно, но что есть то есть....
Записан
Rcus
Гость
« Ответ #25 : Март 06, 2010, 19:47 »

Прикладная задача врядли в явном виде требует создания такого количества конкурентных потоков выполнения (если только задача не заключается в тестировании планировщика). Вполне может быть что вы не рассмотрели другие варианты решения изначальной проблемы (или не знали об их существовании), а потому считаете необходимость создания большого числа потоков частью проблемы, а не решения.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #26 : Март 06, 2010, 20:14 »

может задача учебная
Записан

Юра.
garryHotDog
Гость
« Ответ #27 : Март 07, 2010, 14:35 »

так и сделал...избавился от потоков - сокеты работают в асинхронном режиме....для себя сделал вывод что с если потоков много жди беды
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 22.