Официальный форум СВД Встраиваемые Системы
19 Апрель, 2024, 22:02:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы многократного создания и снятия нитей.  (Прочитано 2501 раз)
Konstantin
Интересующийся

Сообщений: 7


« : 26 Март, 2013, 17:50:08 »

Проблемный проект создает нити _beginthread() где-то около 16 штук, которые при необходимости снимаются через посылку сигнала 9 (kill()). Эти нити работают с удаленными серверами через функции Send/Recieve(). Некоторое количество создания/удаления нитей где-то около 3-4 приводит к тому, что другая очень простая программа не может создать одну нить. Функция _beginthread() возвращает -1 и errno=11 - недостаточно ресурсов - попытайся позже. Причем зацикливание попыток создания нити во второй простой программе дает постоянный эффект - нити невозможно создать, пока я не убиваю родительский большой процесс, который создавал 16 нитей. Большой процесс представляет собой photon программу и создает нити с указанием только объема требуемого стека. После завершения работы этот же процесс убивает по очереди все нити через kill() и дожидается снятия потомка. ps показывает, что все нормально - зомби нет и процессов лишних тоже. Тем не менее, какой-то ресурс остается захваченным и не позволяет создать всего одну нить в другом процессе. Я предложил программисту, создавшем монстра снимать все нити через глобальный флаг terminate с возможностью штатного завершения нити с освобождением всех захваченных ими ресурсами самостоятельно в коде нити с последующим вызовом _endthread(). Но программист ссылается на то, что  всегда работало с kill(). Я хотел было показать ему, что какой-то ресурс захвачен и не освобожден, но все мои попытки получить от операционки причину отказа создания нити увенчались провалом. Памяти хватает - 300Мб свободно, файловых дескрипторов кажется тоже - я собирал ядро с увеличенными объемами файлов, процессов, семафоров и т.д. - но это не помогло. Запускал монитор ядра - действительно Proc менеджер выдает ошибку 11, но больше из этого monitor получить не удалось. Далее я пробовал получить информацию непосредственно от Proc32 через traceinfo. Я собирал ядро с различными ключами -v(1..3) для Proc32 и выставлял уровень 7 для журнала. На мое удивление Proc32 кроме момента запуска программы больше ничего не сохраняет в журнале - никаких ошибок и причин отказа в создании нити там и близко нет. Системные утилиты sin и vsin ничего подозрительного не дают - там вообще все спокойно - даже gdt не меняются. Файловых дескрипторов действительно много - каждая нить кроме стандартных дескрипторов 0..2 имеет еще унаследованные от родителя дескрипторы разделяемой графической памяти с драйвером, фонты и еще что-то, но количество, как мне кажется никак не должно влиять - собирал ядро с вдвое большим допустимым объемом файлов. Загрузка процессора минимальна - нити почти всегда блокированы семафорами, приоритеты у всех процессов стандартные 10о.
Подскажите, каким образом можно решить задачу с выяснением того, что мешает Proc32 создать нить? Возможно кто-то сталкивался с подобной проблемой или есть что-то еще, что мешает создать нить?
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #1 : 28 Март, 2013, 12:30:42 »

К сожалению, по данному описанию проблемы без выводов диагностических утилит, сложно что-то посоветовать. Каких-то специальных средств анализа для данной ситуации не предусмотрено. При создании потока (нити) создаются копии всех ресурсов: файловых дескрипторов, имён и т.д. Идентификаторы потока используют одно пространство с идентификаторами процессов. Ошибка EAGAIN говорит о том, что какой-то ресурс исчерпан. Какой именно, Вы должны определить исходя из конфигурации своей системы.

Отдельно хотел отметить, что подход, когда создаётся один процесс (который является в том числе и графическим приложением) с несколькими потоками, которые используют механизм SRR, нехарактерен для QNX4. Зачастую применяется схема с несколькими процессами, которые взаимодействуют друг с другом через разделяемую память. Такая схема проще в отладке и сопровождении.
Записан
deadarcher
Пользователь

Сообщений: 95


« Ответ #2 : 13 Декабрь, 2016, 14:49:16 »

Подниму тему. Такая же проблема.
QNX 4.25, Proc32 последний, с ключом -E0.
В моём случае не хватает семафоров - почему-то NFSfsys их активно забирает и не освобождает. Собираю ядро с увеличенным числом доступных семафоров - потоки создаются. Но всё равно потом они исчерпаются...
Вопрос: чем ( каким средством ) можно мониторить такой ресурс, как семафоры ?
Записан
Андрей Панченко
Сотрудник СВД ВС
Опытный пользователь

Сообщений: 106



WWW
« Ответ #3 : 16 Декабрь, 2016, 13:50:49 »

Мониторить количество выделенных семафоров нельзя.

NFSfsys выделяет для каждого нового inode по семафору, но не больше 250 (по умолчанию) и меньше количества семафоров доступных Proc.
Максимальное количество inode в NFSfsys можно задать через опцию -i.
Максимальное количество семафоров можно задать через опцию -e в Proc.
Записан

Сотрудник СВД Встраиваемые Системы
deadarcher
Пользователь

Сообщений: 95


« Ответ #4 : 17 Декабрь, 2016, 10:41:46 »

Андрей, Здравствуйте !
Спасибо за ответ, теперь маненько стало яснее Smiley
Будем пробовать.

С Уважением, deadarcher.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 08 Март, 2021, 06:19:47