реклама на сайте
подробности

 
 
> Хитровывернутый вопрос про RTOS, с интервью..
InsolentS
сообщение Jul 31 2014, 01:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Всем привет!
Недавно был на интервью в одной компании и "застрял" на вопросе про RTOS. После недели поисков ответ так и не был найден..
Условие задачи такое: есть 5 потоков, каждый из них увеличивает в цикле общую переменную count на 1. После завершения работы этих потоков, значение count выводится на экран.
Код
unsigned int count = 0;
void thread(void)
{
  unsigned int i;
  for(i = 0; i < 5; i++)
  {
    count++;
  }
}

void main(void)
{
  thread_create(thread, 5); // Создаём 5 экземпляров потока thread и запускаем их
  thread_join(); // Ждём пока все 5 потоков завершатся
  printf("%u", count); // Выводим значение count на экран
}

Внимание вопрос: почему программа печатает 2??
Договорились с интервьювером, что операция count++ состоит из 3х ассемблерных команд:
Код
  LDR reg, count
  ADD reg, #1
  STR reg, count

Т.к. переменная count не защищена ни мьютексом, ни критической секцией, самый пессимистичный вариант, который я "раскрутил" выглядит так:
Код
// начало работы thread1
  LDR reg, count // count = 0, thread1.reg = 0
  ADD reg, #1 // thread1.reg = 1
// thread1 вытеснен планировщиком, начало работы thread2
  LDR reg, count // count = 0, thread2.reg = 0
  ADD reg, #1 // thread2.reg = 1
  STR reg, count // count = 1
// thread2 завершил работу, управление возвращается к thread1
  STR reg, count // count = 1

т.е. в результате один поток делает override результата второго потока и count = 1 после выполнения всех потоков (а не 5, как было бы с мьютексом).
Но: хоть один из потоков все равно увеличит count на 1 в этой схеме, т.е. в результате работы программы count будет не меньше, чем 5.
Как же получается 2? (со слов интервьювера, он наблюдал такой эффект в реальном железе). Подсказка от интервьювера: результат не зависит ни от количества потоков, ни от количества итераций в цикле for


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndrewN
сообщение Aug 5 2014, 09:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (InsolentS @ Jul 31 2014, 04:00) *
Недавно был на интервью в одной компании и "застрял" на вопросе про RTOS. После недели поисков ответ так и не был найден..
Условие задачи такое: есть 5 потоков, каждый из них увеличивает в цикле общую переменную count на 1. После завершения работы этих потоков, значение count выводится на экран.

Как же получается 2? (со слов интервьювера, он наблюдал такой эффект в реальном железе). Подсказка от интервьювера: результат не зависит ни от количества потоков, ни от количества итераций в цикле for

Задача имеет чисто алгоритмическое, логическое решение.

Хорошая задачка на индетерминизм в системе конкурирующих процессов. Решается элементарно! Я удивлён, что ещё никто не догадался...

Сначала несколько замечаний:

a) результат не зависит ни от количества потоков (> 2), ни от количества итераций в цикле for (> 2)
b) задача на алгоритм планировщика очевидно (count ничем не защищён), поэтому планируем задачи как нам _надо_ (кстати, в реальном железе такой алгоритм (или стратегия) планировщика вполне возможна)
c) атрибут volatile конечно хорошо помянуть, но совершенно необязательно, поскольку из условия известно, что перед модификацией значение счётчика всегда читается (что эквивалентно volatile):
CODE
  LDR reg, count
  ADD reg, #1
  STR reg, count

отсюда же видно, что операция модификации счётчика неатомарна, а состоит из трёх фаз, каждая из которых может быть прервана. Вот на этом игра с планированием задач и может быть построена.
d) Решение для значения count = 2, легко обобщается для произвольного значения count, от 2 до суммы инкрементов (каждая задача может совершать произвольное число итераций в цикле)

Алгоритмов, естественно, несколько. Например так:

1) Выбираем произвольно две задачи, А и В.
Каждая читает начальное значение счётчика = 0 и
ставится в ожидание на инструкции ADD.

2) Ждём когда завершатся остальные N-2 задач.
Они больше не нужны, на решение не влияют.

3) Задача В инкрементирует регистр (reg = 1) и
ставится в ожидание на инструкции STR.

4) Задача А продолжает работу и ставится в
ожидание на _последней_ итерации _перед_
инструкцией LDR.

5) Задача В исполняет инструкцию STR
(записывает в ячейку count 1) и ставится в
ожидание.

6) Задача А исполняет инструкцию LDR. В
регистре значение = 1. Инкрементирует
значение регистра = 2 и ставится в ожидание
на инструкции STR.

7) Задача В продолжает работу до завершения!
(Блин, наконец-то, надоело!)

8) Задача А исполняет инструкцию STR, записывает
в ячейку count 2. И завершается! (Блин, наконец-то,
ну жуть как надоело!)

------

Уфф... Очевидно, что розыгрышей в планировании вспомогательной В и остальных N-2 задач может быть несколько, соответственно и алгоритмов решения тоже много. 3) можно "растянуть" объединив с STR, так, что бы в итоге получалось 3, 4, ...

P.S. Очевидно, что это вполне практическая задача, такой результат может быть получен (и будет получен! при достаточно большом числе запусков) на практике.


QUOTE (adnega @ Aug 1 2014, 08:59) *
Резальтат, равный 2, печатается постоянно или нужно объяснить ситуацию с крайне низкой вероятностью, когда печатается 2 ?
Абсолютное заблуждение. _Все_ возможные (см. выше) результаты равновероятны. Чем 2 хуже 7 или 16?


Сообщение отредактировал AndrewN - Aug 5 2014, 09:52
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 5 2014, 10:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



QUOTE (AndrewN @ Aug 5 2014, 12:31) *
Хорошая задачка на индетерминизм в системе конкурирующих процессов. Решается элементарно! Я удивлён, что ещё никто не догадался...

решение правдоподобное, вот только мне непонятен в этом случае механизм работы планировщика.
почему он вначале гоняет все задачи кроме двух?
почему задача А то исполняется почти вся, то времени ей выделяется только на две команды? аналогично выделяется времени только на одну команду в задаче Б. это вот как?
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 5 2014, 10:15
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Mahagam @ Aug 5 2014, 13:04) *
решение правдоподобное, вот только мне непонятен в этом случае механизм работы планировщика.
почему он вначале гоняет все задачи кроме двух?
почему задача А то исполняется почти вся, то времени ей выделяется только на две команды? аналогично выделяется времени только на одну команду в задаче Б. это вот как?

Это приемлемый вопрос. Так происходит (ну или может произойти) из-за неизвестного _внешнего_ окружения нашей задачи. Мы же не знаем, какие есть в выч. системе ещё задачи, на какие прерывания система должна реагировать. Всё это создаёт хаос. А мы в этой мутной воде выуживаем, что нам надо.

Задача ставилась на определение последовательности пропихивания наших ниточек так, что бы в итоге получился определённый результат = 2. Ну вот в такой последовательности, например, их можно пропихнуть. На практике она осуществима. Ну а уж сколько надо этого знаменательного события ждать - пока рак на горе не свистнет :-)
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 5 2014, 10:55
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



QUOTE (AndrewN @ Aug 5 2014, 13:15) *
Это приемлемый вопрос. Так происходит (ну или может произойти) из-за неизвестного _внешнего_ окружения нашей задачи. Мы же не знаем, какие есть в выч. системе ещё задачи, на какие прерывания система должна реагировать. Всё это создаёт хаос. А мы в этой мутной воде выуживаем, что нам надо.

какое, блеать, неизвестное внешнее окружение? в первом посте приведена функция main. из неё видно, что кроме энного количества потоков вычисления счётчика не запущено ровным счётом ничего. читайте по буквам: Николай, Иван, Харитон, Ульяна Яков. Ни один вменяемый планировщик не будет переключать задачи так хаотично как вам бы хотелось.

Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 5 2014, 11:27
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Mahagam @ Aug 5 2014, 13:55) *
Ни один вменяемый планировщик не будет переключать задачи так хаотично как вам бы хотелось.
Это была всего лишь экзаменационная задача...

А планировщик - это Я. :-)


QUOTE (Mahagam @ Aug 5 2014, 13:55) *
приведена функция main. из неё видно, что кроме энного количества потоков вычисления счётчика не запущено ровным счётом ничего.

Увы, задачи по параллельным процессам так не формулируются. Есть процессы, которы формируются явно, исходя из условий задачи. И, кроме этого, неявно предполагается, что в вычислительной системе есть внешние, неизвестные процессы, которые занимают время ЦПУ, но не взаимодействуют с процессами задачи.

Алгоритм планировщика предполагается неизвестным, и более того, предполагается недетерминистским. Т.е. никак нельзя сказать в каком порядке могут быть спланированы два равноприоритетных процесса.
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Aug 5 2014, 11:37
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240



QUOTE (AndrewN @ Aug 5 2014, 14:27) *
Увы, задачи по параллельным процессам так не формулируются. Есть процессы, которы формируются явно, исходя из условий задачи. И, кроме этого, неявно предполагается, что в вычислительной системе есть внешние, неизвестные процессы, которые занимают время ЦПУ, но не взаимодействуют с процессами задачи.

Алгоритм планировщика предполагается неизвестным, и более того, предполагается недетерминистским. Т.е. никак нельзя сказать в каком порядке могут быть спланированы два равноприоритетных процесса.


вы точно про RTOS?? точно про микроконтроллеры??
какой нафик, "недетерминистским" планировщик в RTOS?? да он в большинстве случаев вообще в исходниках идёт. и его поведение прозрачно аки слезинка ребёнка. какие нафик неизвестные процессы в МК ?

попривыкали к глючному линуксу, который может "недетерминированно" тупануть, и теперь переносите свои влажные фантазии в мир нормальных RTOS.
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 5 2014, 12:39
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Mahagam @ Aug 5 2014, 14:37) *
вы точно про RTOS?? точно про микроконтроллеры??
какой нафик, "недетерминистским" планировщик в RTOS?? да он в большинстве случаев вообще в исходниках идёт. и его поведение прозрачно аки слезинка ребёнка. какие нафик неизвестные процессы в МК ?

Неизвестные процессы не в МК, а в условии исходной задачи. Они, естественно, не заданы, но их присутствие в выч. системе, естественно, неявно подразумевается. Кроме всего прочего, термин МК в условиях не фигурирует.

Я попытался пересчитать решение для детерминистского алгоритма планировщика, такого, который бы без оговорок мог использоваться в RTOS. Для preemptive round robin для равноприоритетных процессов планировки решение абсолютно возможное (feasible). Ход своих рассуждений опускаю, они очевидные.

QUOTE (Mahagam @ Aug 5 2014, 14:37) *
попривыкали к глючному линуксу, который может "недетерминированно" тупануть, и теперь переносите свои влажные фантазии в мир нормальных RTOS.

Об ослинуксе не было ни слова. Насчет "[...] фантазий" - полегче на поворотах, почтеннейший, не в рыбной лавке.

QUOTE (AlexandrY @ Aug 5 2014, 15:26) *
Кстати, а как же эта подсказка "результат не зависит ни от количества потоков, ни от количества итераций в цикле for"
Даже при "хаотичном" планировщике мы бы увидели корреляцию. А тут нет, не зависит.

Рискну предположить что с увеличением конкурентов и с увеличением количества циклов средняя величина получаемого результата при "хаотичном" планировщике будет стремиться к увеличению, а не концентрироваться вокруг двойки.

Я эту подсказку воспринял в смысле, что двойку можно получить (не обязательно получить, а возможно) независимо от числа процессов и независимо от числа итераций. В моём решении это явно видно: три процесса стартуют и завершаются ни на что не влияя, остальные два явно используют отсылку только к первой итерации, предпоследней итерации и последней итерации.

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

Гипотетически - распределение скорее всего равномерное. Ребята, а дайте мне грант на месяц (пару миллионов сов. рупий) и я это поисследую :-)

Сообщение отредактировал AndrewN - Aug 5 2014, 12:42
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 5 2014, 12:42
Сообщение #9


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(AndrewN @ Aug 5 2014, 15:30) *
Я попытался пересчитать решение для детерминистского алгоритма планировщика, такого, который бы без оговорок мог использоваться в RTOS. Для preemptive round robin для равноприоритетных процессов планировки решение абсолютно возможное (feasible).


Ну очень интересно, как это из изначально последовательно поставленных в круг N задач остаются только две одна из которых не получила времени когда все остальные выполнились.
Это уже никак не round-robin планирование.
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 5 2014, 12:50
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (AlexandrY @ Aug 5 2014, 16:42) *
Ну очень интересно, как это из изначально последовательно поставленных в круг N задач остаются только две одна из которых не получила времени когда все остальные выполнились.
Это уже никак не round-robin планирование.
RR это, RR. Посмотрите на 1) в решении - А и В прочитали нулевой счётчик. И встали в хвост. А потом три пробежали до упора.

P.S. Для ясности облегчу себе участь - скажем, что тайм-слайс очень большой. И только внешние события, над которыми у нас власти нет, заставляют планировщик менять задачи. И, если задача прерывается, то планировщик ставит её в хвост.

Сообщение отредактировал AndrewN - Aug 5 2014, 12:53
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- InsolentS   Хитровывернутый вопрос про RTOS   Jul 31 2014, 01:00
- - RobFPGA   Приветствую! Скорее всего он "разводил...   Jul 31 2014, 09:54
- - Fat Robot   Переменная count не является volatile, поэтому пре...   Jul 31 2014, 10:35
- - wangan   Может у него был 8 битный микроконтроллер, а у нег...   Jul 31 2014, 12:08
- - gerber   Неправильно реализована функция printf на железке,...   Jul 31 2014, 13:42
|- - Mahagam   QUOTE (gerber @ Jul 31 2014, 16:42) Непра...   Jul 31 2014, 15:03
- - Lagman   25. Почему? Патамушта! (кооперативная, вытесн...   Jul 31 2014, 15:55
- - InsolentS   Прошу прощения, по условиям задачи RTOS вытесняюща...   Jul 31 2014, 18:09
- - ViKo   Для начала неплохо бы понять, в какой ОС есть функ...   Jul 31 2014, 18:17
|- - InsolentS   Цитата(ViKo @ Jul 31 2014, 23:17) Для нач...   Jul 31 2014, 18:27
- - Fedor   Нагло врет ваш интервьюер, если поток будет 1 все ...   Jul 31 2014, 19:15
- - DASM   99.9 % дело не вытеснении, на 32 разрядном проце к...   Jul 31 2014, 19:57
- - ViKo   Условная ОС не может быть проверена в железе, как ...   Jul 31 2014, 20:00
- - InsolentS   Тут дело не в особенностях какого-то конкретного ж...   Aug 1 2014, 05:39
|- - ViKo   Цитата(InsolentS @ Aug 1 2014, 08:39) Тут...   Aug 1 2014, 05:54
|- - andrew_b   Цитата(ViKo @ Aug 1 2014, 09:54) А разве ...   Aug 4 2014, 06:17
- - adnega   ЦитатаПодсказка от интервьювера: результат не зави...   Aug 1 2014, 05:59
- - ZASADA   что возвращает вызываемая функция void thread(void...   Aug 1 2014, 06:28
|- - ViKo   Цитата(ZASADA @ Aug 1 2014, 09:28) что во...   Aug 1 2014, 06:31
- - DASM   А какой это язык программирования ?   Aug 1 2014, 08:25
- - ZASADA   типа с   Aug 1 2014, 08:39
- - InsolentS   На работу всё-таки взяли, попробую найти там этого...   Aug 2 2014, 04:19
- - x893   Всё гораздо проще - просто посмотрите дебаггером -...   Aug 3 2014, 13:29
|- - InsolentS   Цитата(x893 @ Aug 3 2014, 18:29) Всё гора...   Aug 3 2014, 18:13
|- - AlexandrY   Цитата(InsolentS @ Aug 3 2014, 21:13) Спа...   Aug 4 2014, 06:48
- - psL   Типа ОСь очень реального времени Видимо 2, потому ...   Aug 3 2014, 18:18
|- - Lagman   Цитата(psL @ Aug 3 2014, 22:18) Типа ОСь ...   Aug 3 2014, 20:04
|- - psL   Цитата(Lagman @ Aug 4 2014, 00:04) Планир...   Aug 3 2014, 21:53
||- - AndrewN   QUOTE (psL @ Aug 4 2014, 00:53) В реально...   Aug 5 2014, 10:04
||- - Mahagam   QUOTE (AndrewN @ Aug 5 2014, 13:04) Ключе...   Aug 5 2014, 10:09
|- - kolobok0   Цитата(Lagman @ Aug 4 2014, 00:04) Планир...   Aug 4 2014, 21:06
|- - AlexandrY   Цитата(kolobok0 @ Aug 5 2014, 00:06) вест...   Aug 5 2014, 07:43
|- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 12:31) P.S. ...   Aug 5 2014, 10:01
||- - AndrewN   QUOTE (AlexandrY @ Aug 5 2014, 13:01) Да,...   Aug 5 2014, 10:07
|||- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 13:07) Да бр...   Aug 5 2014, 10:14
|||- - AndrewN   QUOTE (AlexandrY @ Aug 5 2014, 13:14) Есл...   Aug 5 2014, 10:21
||- - AndrewN   QUOTE (AlexandrY @ Aug 5 2014, 13:01) Да ...   Aug 5 2014, 10:09
||- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 13:09) Вы ме...   Aug 5 2014, 10:19
||- - AndrewN   QUOTE (AlexandrY @ Aug 5 2014, 13:19) Мне...   Aug 5 2014, 10:27
||- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 13:24) Совер...   Aug 5 2014, 10:31
||- - AndrewN   QUOTE (AlexandrY @ Aug 5 2014, 13:31) гов...   Aug 5 2014, 10:55
|- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 13:15) Мы же...   Aug 5 2014, 10:24
||- - den_po   Цитата(AlexandrY @ Aug 5 2014, 14:24) Тик...   Aug 5 2014, 12:29
|- - AlexandrY   Цитата(Mahagam @ Aug 5 2014, 13:55) какое...   Aug 5 2014, 11:02
|||- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 15:50) P.S. ...   Aug 6 2014, 10:48
||- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 15:39) Ребят...   Aug 5 2014, 12:54
||- - Mahagam   QUOTE (AndrewN @ Aug 5 2014, 15:39) Неизв...   Aug 5 2014, 15:09
||- - AndrewN   QUOTE (Mahagam @ Aug 5 2014, 19:09) отсле...   Aug 5 2014, 16:06
|- - AlexandrY   Цитата(AndrewN @ Aug 5 2014, 14:27) Алгор...   Aug 5 2014, 12:26
- - ViKo   Ну, теоретически (практически тоже) можно допустит...   Aug 5 2014, 10:28
- - adnega   CODE задача А задача В задача Х ...   Aug 5 2014, 12:55
- - juvf   аш 4 страници настучали.... 1) а кто пробовал это...   Aug 5 2014, 18:05
- - AndrewN   Жаль, что не удалось узнать, что думает экзаминато...   Aug 7 2014, 12:35
- - InsolentS   Цитата(AndrewN @ Aug 7 2014, 18:35) Жаль,...   Jan 24 2015, 02:52


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016