|
Хитровывернутый вопрос про RTOS, с интервью.. |
|
|
|
Jul 31 2014, 01:00
|

Местный
  
Группа: Свой
Сообщений: 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
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
 |
Ответов
|
Aug 5 2014, 09:57
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 5 2014, 10:01
|

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

|
Цитата(AndrewN @ Aug 5 2014, 12:31)  P.S. Очевидно, что это вполне практическая задача, такой результат может быть получен (и будет получен! при достаточно большом числе запусков) на практике. Да, но условием было получить всегда 2 А тут у вас что угодно может получится. Где детерминизм получения 2 на реальном железе? Да и планировщик у вас совершенно нереалистичный. Здесь главное назвать алгоритм планировщика. В RTOS совершенно нормальная практика зная алгоритм планировщика не защищать переменные критическими секциями. Поскольку постановка простейшего семафора может длиться в десять раз дольше чем сама предметная часть задачи, что есть очень дорого.
|
|
|
|
|
Aug 5 2014, 10:07
|
Местный
  
Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961

|
QUOTE (AlexandrY @ Aug 5 2014, 13:01)  Да, но условием было получить всегда 2 Да бросьте вы. И близко не было такого в условии. Для меня совершенно очевидно (как и для экзаменатора), что такой результат (2) может быть получен только благодаря фундаментальному индетерминизму задачи.
|
|
|
|
|
Aug 5 2014, 10:14
|

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

|
Цитата(AndrewN @ Aug 5 2014, 13:07)  Да бросьте вы. И близко не было такого в условии. Для меня совершенно очевидно (как и для экзаменатора), что такой результат (2) может быть получен только благодаря фундаментальному индетерминизму задачи. Если бы "экзаминатор" не заикнулся о том, что видел это на живом железе, то никаких претензий. Если он действительно видел, то сами понимаете, ваша версия не выдерживает никакой критики. Что есть доля микросекунды против тика вытеснения в 10 мс? Это вероятность меньше 0.0001 , а для последовательных таких событий еще меньше. Если считать существенными такие вероятности то должны рухнуть все быза данных и реестр вашего компьютера поскольку они тоже построенны на случайно генерируемых индексах.
|
|
|
|
|
Aug 5 2014, 10:21
|
Местный
  
Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961

|
QUOTE (AlexandrY @ Aug 5 2014, 13:14)  Если бы "экзаминатор" не заикнулся о том, что видел это на живом железе, то никаких претензий. Я нечто подобное (и множество других, не менее любопытных ситуаций) видел своими глазами. Это мир параллельных процессов, здесь всё не так, как кажется и как нам говорит последовательный, фон-неймановский, опыт. Ваши цифры комментировать не хочу, ведь на самом деле мы сейчас обсуждали задачку из учебника - по программированию параллельных систем. Ну чего меня разубеждать в школьном материале?
|
|
|
|
Сообщений в этой теме
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  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 Mahagam QUOTE (AndrewN @ Aug 5 2014, 12:31) Хорош... Aug 5 2014, 10:04  AndrewN QUOTE (Mahagam @ Aug 5 2014, 13:04) решен... Aug 5 2014, 10:15   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   Mahagam QUOTE (AndrewN @ Aug 5 2014, 13:15) Это п... Aug 5 2014, 10:55    AlexandrY Цитата(Mahagam @ Aug 5 2014, 13:55) какое... Aug 5 2014, 11:02    AndrewN QUOTE (Mahagam @ Aug 5 2014, 13:55) Ни од... Aug 5 2014, 11:27     Mahagam QUOTE (AndrewN @ Aug 5 2014, 14:27) Увы, ... Aug 5 2014, 11:37      AndrewN QUOTE (Mahagam @ Aug 5 2014, 14:37) вы то... Aug 5 2014, 12:39       AlexandrY Цитата(AndrewN @ Aug 5 2014, 15:30) Я поп... Aug 5 2014, 12:42        AndrewN QUOTE (AlexandrY @ Aug 5 2014, 16:42) Ну ... Aug 5 2014, 12:50         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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|