Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> threads, нехватает памяти 
V
    Опции темы
Artemon
Дата 2.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: нет
Всего: 20



1. Есть класс 
2. Есть внешняя ф-ия по отношению классу, но объявленная как friend


Внутри класса создаю поток и в качестве параметра передаю ему ту самую внешнюю фию и сам экземпляр класса.

Я в потоке улаляю переданный экземпляр класса и вродебы все нормально удаляется, ао крайнй мере управление передается в деструктор.

На первый взгляд кажется все чинно, но вот попробовла подряд создать около 300 таких класов с потоками и вдруг мне Linux начал говорить что ему нехватает памяти на создание потока ?

С чего бы это, ведь вроде потоки создаются и удаляются нормально, а памяти говорит не хватает.





--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
JackYF
Дата 2.12.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Artemon, ну ты понял, код давай сюда smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 2.12.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Artemon, у тебя потоки NPTL или старые линуксовые?
PM   Вверх
MAKCim
Дата 2.12.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Artemon
давай сюда код
Цитата(bsa @  2.12.2007,  21:09 Найти цитируемый пост)
Artemon, у тебя потоки NPTL или старые линуксовые? 

в плане использования памяти разницы нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 3.12.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



MAKCim, разве? я читал, что NPTL отличается тем, что не выполняется копирование страниц памяти процесса - значит память выделяется... Видимо, что-то не то читал...
PM   Вверх
MAKCim
Дата 3.12.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(bsa @  3.12.2007,  13:10 Найти цитируемый пост)
разве? я читал, что NPTL отличается тем, что не выполняется копирование страниц памяти процесса - значит память выделяется... Видимо, что-то не то читал...

любой процесс в Linux, созданный с помощью clone() с указанием флага CLONE_VM, получает в "наследство" адресное пространство родителя
и LT, и NPTL реализованы с помощью clone() + CLONE_VM
другое дело, что NPTL использует для создания потока еще и CLONE_THREAD, который специально ввели для эффективной имплементации POSIX-потоков
CLONE_THREAD включает в себя следующие нововведения:
1. Группы потоков (TGID, TID)
2. Изменение семантики exec*, exit, работы сигналов
(вообще там много всего, но это основное)



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 3.12.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



MAKCim, спасибо, буду знать.
PM   Вверх
xvr
Дата 3.12.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Artemon @ 2.12.2007,  14:46)
1. Есть класс 
2. Есть внешняя ф-ия по отношению классу, но объявленная как friend


Внутри класса создаю поток и в качестве параметра передаю ему ту самую внешнюю фию и сам экземпляр класса.

Я в потоке улаляю переданный экземпляр класса и вродебы все нормально удаляется, ао крайнй мере управление передается в деструктор.

А сам поток при этом завершается? pthread_join вызывали или detached статус потоку ставили?

Цитата

На первый взгляд кажется все чинно, но вот попробовла подряд создать около 300 таких класов с потоками и вдруг мне Linux начал говорить что ему нехватает памяти на создание потока ?

С чего бы это, ведь вроде потоки создаются и удаляются нормально, а памяти говорит не хватает.

Память - да, а вот собственно потоки - неизвестно smile


Это сообщение отредактировал(а) xvr - 3.12.2007, 15:32
PM MAIL   Вверх
vinick
Дата 5.12.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



Цитата(Artemon @  2.12.2007,  14:46 Найти цитируемый пост)
но вот попробовла подряд создать около 300 таких класов с потоками

Каждый поток имеет свой собственный стек, по умолчанию стек равен 8 метров. Получается если в какой-то момент у процесса оказалось 300 рабочих потоков, то только их стек занял 2.5 гига виртуальной памяти. Всего на 32-битной системе процесс  может забрать около 3 гиг,  кажется даже чуть меньше. Вот и получается нехватка памяти.
PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 5.12.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



vinick
в таком случае используется swap
+ стек расширяется динамически, по мере надобности


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinick
Дата 5.12.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



Цитата(MAKCim @  5.12.2007,  13:50 Найти цитируемый пост)
vinick, 
в таком случае используется swap
+ стек расширяется динамически, по мере надобности 

Своп используется когда заканчивается физическая оперативная память. Я же говорю о виртуальном адресном пространстве процесса, когда оно заканчивается то получается out of memory. В 32-битных системах процесс может адресовать всего 4 гига памяти, но в linux около гига забирает ядро и по-моему что-то отдается загруженным динамическим библиотекам, итого процессу на личные нужды остается меньше 3 гиг. На каждый созданный поток по умолчанию резервируется 8 метров стека из этого адресного пространства, если потоков много, то их стек съедает все.

Расширяемость стека к топику не относится. Но стало интересно 
Я не смог найти в сети ни подтверждений вашего тезиса ни опровержения. Но вот такой пример при ulimit -s == 8192 почучает ошибку сегментирования. Или стек надо какими-то системными вызовами принудительно расширять?
Код

int main()
{
  char buf[10*1024*1024];
  buf[0]=1;
  return 0;
}



PM MAIL ICQ Jabber   Вверх
bsa
Дата 5.12.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(vinick @ 5.12.2007,  15:50)
В 32-битных системах процесс может адресовать всего 4 гига памяти, но в linux около гига забирает ядро и по-моему что-то отдается загруженным динамическим библиотекам, итого процессу на личные нужды остается меньше 3 гиг.

Ядру гиг не нужен. Просто память некоторых устройств (видеокарт, например) отображается в адресное пространство процессора. Это приводит к тому, что когда установлено 4Гига памяти, часть из нее перекрывается отображаемой памятью. И это не только в Linux.
PM   Вверх
vinick
Дата 5.12.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 4
Всего: 22



bsa
цитата отсюда
Цитата

Резервные страничные фреймы

Linux резервирует несколько станичных фреймов для кода ядра и структур данных. Эти страницы никогда не сбрасываются в файл подкачки на диск. Линейные адреса с 0x0 до 0xc0000000 (PAGE_OFFSET) используются кодом пользователя и кодом ядра. Адреса с PAGE_OFFSET до 0xffffffff используются кодом ядра.

Это означает, что из 4 GB только 3 GB доступны для пользовательского приложения. 


Не путайте физически установленную оперативную память и вирутальную память. Это немного разные вещи.
PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 5.12.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



vinick
Цитата(vinick @  5.12.2007,  15:50 Найти цитируемый пост)
Расширяемость стека к топику не относится. Но стало интересно 

вот мое маленькое исследование
Код

#include <unistd.h>
#include <signal.h>
#include <string.h>

extern void __code(void);

static void __handler(int signal) {
}

int main() {
    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &__handler;
    sigaction(SIGUSR1, &action, NULL);
    __code();
    return 0;
}

Код

.data
.quad 0
.text
.globl __code
__code:
    movq    %rsp, (.data)
    callq   pause
    xchgq   (.data), %rsp
    subq    $524288, %rsp
    movl    $1, (%rsp)
    xchgq   (.data), %rsp
    callq   pause
    ret

Код

# gcc test.S main.c -o main
# ./main

далее смотрим /proc/3862/maps (PID = 3862)
Код

# cat /proc/3862/maps

получаем
Цитата

...
7fff3e355000-7fff3e36c000 rwxp 7fff3e355000 00:00 0                      [stack]
...

7fff3e36c000 - 7fff3e355000 = 94208 байт
далее посылаем процессу сигнал SIGUSR1
Код

# kill -s SIGUSR1 3862

опять смотрим /proc/3862/maps
Цитата

...
7fff3e2e7000-7fff3e36c000 rwxp 7fff3e2e7000 00:00 0                      [stack]
...

7fff3e36c000 - 7fff3e2e7000 = 544768
отсюда можно сделать однозначный вывод о расширении стека вниз
и он будет расширяться, пока не будет достигнут лимит на его размер
этот лимит равен ~ 8MB


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Artemon
Дата 7.12.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: нет
Всего: 20



Код моего приложения примерно следующий:

Код


void MyFunc(void* Data)
{

  C1* p = (C1*)Data;
  delte p;
}

calss C1
{
public:
         C1(){ create_thread(...MyFunc, this...) }
};


int main()
{
  C1* val = NULL;

  for( int k = 0; k < 300; k ++ )
      {
       val = new C1();
       Sleep(1000); 
      }

  return 0;
}



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1391 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.