Перейти к содержанию
    

Не вытесняется поток

На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три:

- поток 1: забор данных с устройства (максимальный приоритет);

- поток 2: подготовки данных (нормальный приоритет);

- поток 3: обработки данных (низкий приоритет);

 

в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично.

 

Помогите с методами решения данной проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Помогите с методами решения данной проблемы.

 

не буду оригинален...

- спросить сэмпл с интересующими Вас параметрами, у разработчиков сторонней либы.

Думаю лучше него вряд-ли Вам кто сможет подсказать.

 

Либо если есть исходники - то залазить и смотреть глазками.

 

со стороны забора данных - стараться всё переместить на железо, чтоб разгрузить алу.

 

как то так

(круглый)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно я всегда ставлю части кода, чувствительные к времени вызова, в обработчик интервального таймера. Суть подхода в том, что во время срабатывания обработчика таймера на заданное время выполняется только код, вложенный в этот обработчик, а все остальные потоки стоят и ждут. Подробнее почитать об интервальном таймере (8.13 setitimer: Setting Interval Timers) можно тут: "Advanced Linux programming".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три:

- поток 1: забор данных с устройства (максимальный приоритет);

- поток 2: подготовки данных (нормальный приоритет);

- поток 3: обработки данных (низкий приоритет);

 

в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично.

 

Помогите с методами решения данной проблемы.

В Linux обычно (для обычных потоков) вообще особая политика шедулирования, O(0) как они её называют и которой сильно гордятся :biggrin:

Даже с RR шедулирование "по кругу" происходит по системному тику ядра, переменная HZ ядра, обычно равная 1000, а это значит 1 ms, ... тогда совершенно не понятно ваши "~550мс".

У вас точно расставлены потокам приоритеты реального времени, а не nice?

Проверяли ли вы отладкой, что они действительно приняты потоками? (нет ошибки при установке).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...