Страниц: 1 2 [3]
  Печать  
Автор Тема: Шаблон администратора ресурсов  (Прочитано 16681 раз)
da-nie
Full Member
***
Offline Offline

Сообщений: 234



Просмотр профиля
« Ответ #30 : Ноября 12, 2019, 09:30:50 pm »

Цитировать
sched_yield() позволяет работать потокам попеременно. Без него нет смысла.

Так это верно только при FIFO диспетчеризации. А вы попробуйте запустить поток с карусельной диспетчеризацией (SCHED_RR). Впрочем, может быть, завтра сам запущу.

Цитировать
Время цикла потока будет зависеть от ожидания нескольких потоков.

Так вам время цикла не нужно. У вас же число тактов на захват-освобождение мьютекса есть. От него и надо отталкиваться.
Записан

И день и ночь в пути
PoP
Sr. Member
****
Offline Offline

Сообщений: 352


Просмотр профиля
« Ответ #31 : Ноября 13, 2019, 12:54:10 pm »

Выбор за разработчиком.
Повторю, что я считаю работу с процессами в QNX предпочтительной.
Присоединяюсь. 10 отдельных процессов отладить много проще, чем всё вместе, сваленное в кучу + при изменении одного из 10 отдельных процессов не нужно подробно тестировать остальные.
По поводу С vs C++ - очень С-шный С++, по умолчанию гораздо строже поверка кода, меньше допущений при преобразованиях типов, вызовов функций и т.д. Никаких шаблонов и new.

Не только. За эту 1 мс ядро производит обработку всех потоков в системе. Когда ваш поток пытается захватить мютекс и это, например, не удалось, следующий такой захват будет произведён уже в другом такте, который наступит стандартно через 1 мс. Таким образом, поток у вас потерял 1 мс, независимо от того, что другой поток может в этом же такте тут же освободить мьютекс.
---cut---
Работа с разделяемым ресурсом всё равно потребует примитивов синхронизации с вышеобозначенными задержками.
Ни в коем случае. Как бы тогда у меня в QNX 4 при тике 10мс могла нормально работать программа с 12 потоками (все 12 взаимодействовали с двумя линиями CAN  по протоколу CanOpen + сверху поток оболчки-сервера) ? На этой же машинке мирно уживались ещё 8 или 10 модулей, готовящих/обрабатывающих данные.
С тактовой частотой работают таймеры. С частотой 4 такта (помоему) безусловно происходит диспечеризация. Кроме того,  диспечеризацию инициализирует большинство вызовов системных функций.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 234



Просмотр профиля
« Ответ #32 : Ноября 13, 2019, 05:58:37 pm »

Цитировать
Впрочем, может быть, завтра сам запущу.

Запустил. 140 тактов на захват/освобождение. Значит, память меня подводит и захват/освобождение мютекса от системного такта не зависит.

Цитировать
С частотой 4 такта (помоему) безусловно происходит диспечеризация.

Да, я сегодня полистал книжки. Вроде как действительно каждые 4 такта происходит диспетчеризация.

Цитировать
Ни в коем случае.

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

И день и ночь в пути
ia
Участник
*
Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #33 : Ноября 15, 2019, 07:41:59 pm »

Системный такт (1 мс) используется для работы с временными интервалами (таймеры, задержки).
Его уменьшение приводит к повышению накладных расходов вплоть до неприемлемых значений.

Различные методы диспетчеризации (с тактом 4 мс) применяются по отношению
к активным (не блокированным) процессам с одинаковым приоритетом.

Блокировка/разблокировка по любой причине (сообщение, мьютексы и т.д.)
начинается моментально, и выполняется предельно быстро.
Это свойство QNX, как ОС реального времени.

В приведенном ранее примере цикл работы с мьютексом занимает единицы (доли) микросекунд.
Если в цикл добавить delay (1), то он будет выполняться от 1 до 2 мс.
Если заменить на delay (100), времени уйдет от 101 до 102 мс.

Если уменьшить системный такт до 10 мкс, то при delay (1) потребуется 1.01-1.02 мс,
но соответствующая служба может загрузить процессор, например, на 50%.
Записан
Страниц: 1 2 [3]
  Печать  
 
Перейти в: