Страниц: [1]
  Печать  
Автор Тема: ADA & инверсия приоритетов  (Прочитано 8018 раз)
s_kSubj
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Мая 24, 2005, 09:11:55 pm »

Интересно, годится ли следующий код на Аде для анализа инверсии приоритетов или нечто подобное?
-- File: inv.adb
with Ada.Text_IO;
use Ada.Text_IO;
procedure Inv is
   c : Integer := 0;
   pragma Atomic(c);

   procedure Res(Sp : Integer);

   task type Pr10 is
      pragma Priority(10);
      entry Start;
      entry Rnd20;
   end Pr10;
   task type Pr15 is
      pragma Priority(15);
      entry Start;
   end Pr15;
   task type Pr20 is
      pragma Priority(20);
      entry Start;
   end Pr20;

   p10 : Pr10;
   p15 : Pr15;
   p20 : Pr20;

   task body Pr10 is
   begin
      accept Start;
      accept Rnd20 do
         Res(10);
      end Rnd20;
   end Pr10;
   task body Pr15 is
   begin
      accept Start;
      Res(15);
   end Pr15;
   task body Pr20 is
   begin
      accept Start;
      p10.Rnd20;
      Res(20);
   end Pr20;

   procedure Res(Sp : Integer) is
   begin
      for i in 1..400 loop
         Put(Integer'Image(Sp));
      end loop;
      c := c + 1;
   end Res;

begin
   p10.Start;
   p20.Start;
   delay 0.001;
   p15.Start;
   loop
      delay 1.0;
      exit when c = 3;
   end loop;
end Inv;
Немного пояснений:
Запускаются три потока: p10, p15, p20; имеющие соответствующие приоритеты.
Входы Start служат для синхронизации.
Первыми снимаем с синхронизирующего рандеву потоки p10 и p20, причем, p20 сразу же захвативается рандеву с p10 и блокируется на время, пока p10 не сделает все необходимое, то есть не разберется с общим ресурсом.
Пока p10 работает с ресурсом, p15 тоже его запрашивает.
При обычных условиях p15 у меня всегда отбирало ресурс у p10.
Ничего не придумал правда более умного в качестве ресурса, как последовательный вывод чисел в поток IO (на экран).
Результаты в Windows XP и QNX 6.2.1 NC одинаковы и последовательность следующая:
10 10 ... 10 20 20 .. 20 15 15 .. 15
Если сменить приоритет потока p20 на 14 or < , то картина будет примерно следующая:
10 10 10 ... 15 15 ... 15 10 10 ... 10 20 20 ... 20 - здесь 20 означает 14.
?
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #1 : Мая 24, 2005, 11:57:20 pm »

1. А какую сборку? какого происхождения GNAT вы используете? (это просто любопытство относительно GNAT).
2. Я не вникал в детали текста выше (sorry ), но мне кажется, что специфические вещи для ОС, как та же потенциально возможная инверсия приоритетов, но и многое другое - это всё проще проверить на ... native средствах программирования в этой ОС, том же С... От того, каким инструментом тестировать отдельные особенности ОС (С, С++, as, nasm, ADA ...) - результат вряд ли должен зависеть .
3. Могу от себя сказать, что такая проверка показывает, что в QNX инверсия приоритетов в специально спровоцированной ситуации не возникает, а вот в Windows XP (собственно, от "XP" здесь ничего не зависит ) - "на ура".
4. А назначение ADA, если вы считаете, что вам удалось GNAT достаточно стабильно раскрутить, другое: проектирование реальных и достуточно крупных именно целевых проектов...
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #2 : Мая 25, 2005, 03:53:17 am »

s_kSubj
Ничего не придумал правда более умного в качестве ресурса, как последовательный вывод чисел в поток IO (на экран).

Я думаю, что в этом вся проблема. Я АДУ совсем не знаю, но сложилось впечатление, что вы выводите последовательность цифр в цикле - по одной цифре за раз. Где тут может быть блокировка? Ну вывел поток десяток-другой цифер, тут случился системный тик и перепланировщик пустил более приоритетный поток. Блокировка может быть пока одна цифра не будет принята драйвером консоли, а не весь поток цифр, как вы вероятно предполагаете.
s_kSubj
10 10 10 ... 15 15 ... 15 10 10 ... 10 20 20 ... 20 - здесь 20 означает 14

20, который 14, специально ждет пока 10 закончит вывод последовательности. Пока 10 пыхтит выводит циферы на экран, через 0.001с появляется готовый выполняться 15, который имеет наивысший приоритет. 10 дорисовал свою очередную цифру и уступил место 15, 15 закончил вывод цифр и 10 продолжил свою работу, ведь 20, который 14, специально ждет, пока 10 закончит. Или нет?
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #3 : Мая 25, 2005, 04:15:34 am »

s_kSubj
10 10 ... 10 20 20 .. 20 15 15 .. 15

А эта ситуация вообще правильная. Интересно как механизм рандеву отображается системными средствами и можно ли эти потоки посмотреть pidin-ом, например.
Пока 20 ждет 10 (и 20 наивысший приоритет из трех), по идеологии наследования приоритетов 10 должен выполняться с приоритетом 20. Так или иначе, но 15-ому не дают вклиниться, бо не он тут главный (самый приоритетный).

Olej
А назначение ADA [...] другое: проектирование реальных и достуточно крупных именно целевых проектов...


Интересная мысль. Но именно целевые и весьма крупные проекты обычно начинаются с малого. Я все проекты начинаю с "Hello World!". Те, которые так не начал - провалились
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Мая 25, 2005, 08:30:08 am »

Olej
1. А какую сборку? какого происхождения  GNAT вы используете? (это просто любопытство относительно GNAT).

Просто в тему, на 3rdparty.anounce ппрошел анонс

Jacek Dzieniewicz:
GNU GNAT 3.4.0 Ada95 compiler is available in download section of OpenQNX website.(http://www.openqnx.com)
To activate gcc-3.4.0 it is necessary to move somewhere from the PATH @gcc - symbolic link to ntox86-gcc.
Записан

olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #5 : Мая 25, 2005, 01:38:15 pm »

Интересная мысль. Но именно целевые и весьма крупные проекты обычно начинаются с малого. Я все проекты начинаю с "Hello World!". Те, которые так не начал - провалились

Да на здоровье, Hello так Hello ... Я это написал только потому, что, как названа тема: "ADA & инверсия приоритетов" (? :-o) - бессмысленно проверять наличие такого свойства ... на ADA, на as / nasm, или С и C++ и т.д.- это вытекает из свойств ОС (и даже версии/релиаза ОС), и уж никак не проявляется от того, на чём вы пропишите тестовую задачу.
Записан
s_kSubj
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #6 : Мая 25, 2005, 02:49:46 pm »

ed1k---
Я изначально понимал, что блокировка может быть только на одной цифре. Но пришлось параллельные тесты проводить, так вот. Цифры выводятся в цикле. Если снизить приоритет p15 на, допустим, 11, то выводится все будет в перемешку(это для win), если оставить все как есть, то даже повысив число 400 на 10^6, то p15 действительно блокирует p10 на все свое время.
Насчет 20 и 14, p15 вклинивается в работу p10 и захватывает ресурс до своего конца. Кабы 20 действительно был бы 20 то, я так понимаю, это и было бы инверсией.
---
Изучая динамические приоритеты задач я увидел, что p10, когда производится рандеву с p20, выполняется под приоритетом 20(и если у p20 приоритет 14, то и у p10 будет 14). Возникает мысль, чтобы свести это не на уровень ОС, а на уровень стандарта языка(тогда этот код не будет годится для своей цели). Неясность, другой ОС с Gnat нету(где нет защиты от инверсии). Придется это оставить.
Можно попробовать другой способ. За место задачи р10 использовать защищенный объект, задав ему этот же приоритет.
Где-то в документации помню читал, что в подобном случае нужно "динамически повысить приоритет объекта до приоритета вызвавшей его задачи в избежании ситуации инверсии приоритетов".
Это скорее нужно не для тестирования ОС, а для изучения особенностей языка. Такие особенности думаю полезно будет знать.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #7 : Мая 25, 2005, 03:16:46 pm »

Я вообще не думаю, что в вашем примере блокировка по выводу играет какую-то роль. Что я вижу существенного - один поток (p20) блокируется ожидая выполнение другого потока (p10). В это время активизируется третий поток (p15) - если его приоритет максимальный, то ему дают выполниться, если нет, то он ожидает, пока выполнятся более приоритетные потоки. Обычный механизм преемптивного шедулирования. Далеко от инверсии, в общем
Записан
Страниц: [1]
  Печать  
 
Перейти в: