![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
Artemon |
|
|||
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: нет Всего: 20 |
1. Есть класс
2. Есть внешняя ф-ия по отношению классу, но объявленная как friend Внутри класса создаю поток и в качестве параметра передаю ему ту самую внешнюю фию и сам экземпляр класса. Я в потоке улаляю переданный экземпляр класса и вродебы все нормально удаляется, ао крайнй мере управление передается в деструктор. На первый взгляд кажется все чинно, но вот попробовла подряд создать около 300 таких класов с потоками и вдруг мне Linux начал говорить что ему нехватает памяти на создание потока ? С чего бы это, ведь вроде потоки создаются и удаляются нормально, а памяти говорит не хватает. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 3 Всего: 162 |
Artemon, ну ты понял, код давай сюда
![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Artemon, у тебя потоки NPTL или старые линуксовые?
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Artemon,
давай сюда код в плане использования памяти разницы нет -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
MAKCim, разве? я читал, что NPTL отличается тем, что не выполняется копирование страниц памяти процесса - значит память выделяется... Видимо, что-то не то читал...
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
любой процесс в Linux, созданный с помощью clone() с указанием флага CLONE_VM, получает в "наследство" адресное пространство родителя и LT, и NPTL реализованы с помощью clone() + CLONE_VM другое дело, что NPTL использует для создания потока еще и CLONE_THREAD, который специально ввели для эффективной имплементации POSIX-потоков CLONE_THREAD включает в себя следующие нововведения: 1. Группы потоков (TGID, TID) 2. Изменение семантики exec*, exit, работы сигналов (вообще там много всего, но это основное) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
MAKCim, спасибо, буду знать.
|
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
А сам поток при этом завершается? pthread_join вызывали или detached статус потоку ставили?
Память - да, а вот собственно потоки - неизвестно ![]() Это сообщение отредактировал(а) xvr - 3.12.2007, 15:32 |
||||
|
|||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
Каждый поток имеет свой собственный стек, по умолчанию стек равен 8 метров. Получается если в какой-то момент у процесса оказалось 300 рабочих потоков, то только их стек занял 2.5 гига виртуальной памяти. Всего на 32-битной системе процесс может забрать около 3 гиг, кажется даже чуть меньше. Вот и получается нехватка памяти. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
vinick,
в таком случае используется swap + стек расширяется динамически, по мере надобности -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
vinick |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
Своп используется когда заканчивается физическая оперативная память. Я же говорю о виртуальном адресном пространстве процесса, когда оно заканчивается то получается out of memory. В 32-битных системах процесс может адресовать всего 4 гига памяти, но в linux около гига забирает ядро и по-моему что-то отдается загруженным динамическим библиотекам, итого процессу на личные нужды остается меньше 3 гиг. На каждый созданный поток по умолчанию резервируется 8 метров стека из этого адресного пространства, если потоков много, то их стек съедает все. Расширяемость стека к топику не относится. Но стало интересно Я не смог найти в сети ни подтверждений вашего тезиса ни опровержения. Но вот такой пример при ulimit -s == 8192 почучает ошибку сегментирования. Или стек надо какими-то системными вызовами принудительно расширять?
|
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Ядру гиг не нужен. Просто память некоторых устройств (видеокарт, например) отображается в адресное пространство процессора. Это приводит к тому, что когда установлено 4Гига памяти, часть из нее перекрывается отображаемой памятью. И это не только в Linux. |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
bsa,
цитата отсюда
Не путайте физически установленную оперативную память и вирутальную память. Это немного разные вещи. |
|||
|
||||
MAKCim |
|
||||||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
vinick,
вот мое маленькое исследование
далее смотрим /proc/3862/maps (PID = 3862)
получаем
7fff3e36c000 - 7fff3e355000 = 94208 байт далее посылаем процессу сигнал SIGUSR1
опять смотрим /proc/3862/maps
7fff3e36c000 - 7fff3e2e7000 = 544768 отсюда можно сделать однозначный вывод о расширении стека вниз и он будет расширяться, пока не будет достигнут лимит на его размер этот лимит равен ~ 8MB -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||||||
|
|||||||||||||||
Artemon |
|
|||
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: нет Всего: 20 |
Код моего приложения примерно следующий:
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |