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

 
 
> Хитровывернутый вопрос про 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
Ответов
psL
сообщение Aug 3 2014, 18:18
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Типа ОСь очень реального времениsm.gif Видимо 2, потому что первый поток из пула успевает инкрементировать счетчик, поскольку пока еще нет потоков, способных ему помешать, последний поток из пула инкрементирует счетчик, поскольку потоки, способные ему помешать уже завершились.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Aug 3 2014, 20:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(psL @ Aug 3 2014, 22:18) *
Типа ОСь очень реального времениsm.gif Видимо 2, потому что первый поток из пула успевает инкрементировать счетчик, поскольку пока еще нет потоков, способных ему помешать, последний поток из пула инкрементирует счетчик, поскольку потоки, способные ему помешать уже завершились.

Планировщик переключает задачи после каждой инструкции!?
Go to the top of the page
 
+Quote Post
psL
сообщение Aug 3 2014, 21:53
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Цитата(Lagman @ Aug 4 2014, 00:04) *
Планировщик переключает задачи после каждой инструкции!?

В реальности, естественно, переключать контекст после каждой инструкции накладно.
Но, видимо, в данном конкретном случае интервьюер предполагал, что контекст переключается после каждой инструкции) Не знаю уж какой эффект он там наблюдал в реальном железе, лажу после оптимизации или что. Но думаю, что свои 2 он интерпретировал как-то так.
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 5 2014, 10:04
Сообщение #5


Местный
***

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



QUOTE (psL @ Aug 4 2014, 00: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
||- - 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 (InsolentS @ Jul 31 2014, 04:00) Не...   Aug 5 2014, 09:57
|- - 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
|- - 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


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:17
Рейтинг@Mail.ru


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