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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Хитровывернутый вопрос про 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
RobFPGA
сообщение Jul 31 2014, 09:54
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Скорее всего он "разводил" Вас с результатами работы программы пытаясь понять насколько Вы разбираетесь в принципах функционирования RTOS.
Суда по результатам анализа - "развод" ему удался sad.gif
Поскольку трудно себе представить RTOS планировщик которой работает после каждой инструкции CPU.

Успехов! Rob.

Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Jul 31 2014, 10:35
Сообщение #3


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Переменная count не является volatile, поэтому предположение о том, во что компилируется count++ неверно.
Далее в связи с этим совершенно непонятно, во что вся эта милая конструкция превратилась после оптимизатора.

Проверял ли задающий вопрос правильность работы железа? Таблицы размещения? Может у него сегмент data размещен в непотребном месте. И далее в таком вот духе..

В общем "почему неправльно написанная программа работает неправильно?" В интервью это называется open-ended question. Ответ на такой вопрос не обязательно должен быть правильным. Он должен показать ход ваших мыслей и/или дать потенциальному работодателю формальный повод для отказа ("он ответил так, а надо было сяк").

Не переживайте. Кстати, какой результат в итоге? Сделали вам предложение?
Go to the top of the page
 
+Quote Post
wangan
сообщение Jul 31 2014, 12:08
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 30-11-05
Из: Омск
Пользователь №: 11 590



Может у него был 8 битный микроконтроллер, а у него count типа int. Пока один меняет один полубайт, то другой поток меняет другой полубайт.

Принимайте меня на работу, а то я немогу найти работу в своем городе.
Go to the top of the page
 
+Quote Post
gerber
сообщение Jul 31 2014, 13:42
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Неправильно реализована функция printf на железке, а точнее stdout.
В терминал отправляется правильное число 25 и приложение тут же завершается.
В сдвиговый регистр (если терминал на COM-порте) только и успели положить один символ "2", и пока этот символ выдвигался в линию - приложение закрылось, закрыв за собой все открытые устройства, и терминал в том числе, очистив при этом передающий буфер.

Сообщение отредактировал gerber - Jul 31 2014, 13:44


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Mahagam
сообщение Jul 31 2014, 15:03
Сообщение #6


Местный
***

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



QUOTE (gerber @ Jul 31 2014, 16:42) *
Неправильно реализована функция printf на железке, а точнее stdout.
В терминал отправляется правильное число 25 и приложение тут же завершается.
В сдвиговый регистр (если терминал на COM-порте) только и успели положить один символ "2", и пока этот символ выдвигался в линию - приложение закрылось, закрыв за собой все открытые устройства, и терминал в том числе, очистив при этом передающий буфер.

похоже. только а) принтф может стоять и тупить пока всё не отправится. б) не согласовывается с уточнением, что результат не зависит от числа потоков и величины фора. а там не 25 может получится, а и 80, к примеру.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jul 31 2014, 15:55
Сообщение #7


Знающий
****

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



25. Почему? Патамушта! sm.gif (кооперативная, вытесняющая, гибридная) Патамушта! (возьмете, расскажу sm.gif )
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Jul 31 2014, 18:09
Сообщение #8


Местный
***

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



Прошу прощения, по условиям задачи RTOS вытесняющая, процессор 32бит, count++ компилируется именно в те 3 ассемблерные команды, которые приведены и дело точно не в printf. Даже ежу понятно, что этот код никуда не годится, так не делают и т.п. Но вопрос был именно почему работа определённой программы приводит к определённому результату, шаг за шагом..
Цитата(Fat Robot @ Jul 31 2014, 15:35) *
Кстати, какой результат в итоге? Сделали вам предложение?

Жду.. sm.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 31 2014, 18:17
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Для начала неплохо бы понять, в какой ОС есть функция thread_join() и как она работает.
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Jul 31 2014, 18:27
Сообщение #10


Местный
***

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



Цитата(ViKo @ Jul 31 2014, 23:17) *
Для начала неплохо бы понять, в какой ОС есть функция thread_join() и как она работает.

Это условная RTOS. thread_join() просто ждёт пока все потоки завершатся


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
Fedor
сообщение Jul 31 2014, 19:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 26-10-05
Пользователь №: 10 125



Нагло врет ваш интервьюер, если поток будет 1 все будет нормально ))))
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 31 2014, 19:57
Сообщение #12


Гуру
******

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



99.9 % дело не вытеснении, на 32 разрядном проце каждая такая задача, уверен, успеет завершится, прежде чем будет вытеснена. Что и подтвердил мой комп - 25 ответ . Хотя код еще некорректен еще и потому, что счетчик не объявлен как volatile (а это, на самом деле, обязательно, только сегодня обсуждали на работе). Но причина вывода "2", вряд ли в этом. Хотя несколько забавно просить найти ошибку в псевдокода с псевдооперационкой. А может оператор ++ где-то переопределен как "присвоить 2" ? sm.gif

Цитата(Fat Robot @ Jul 31 2014, 14:35) *
Переменная count не является volatile, поэтому предположение о том, во что компилируется count++ неверно.
Далее в связи с этим совершенно непонятно, во что вся эта милая конструкция превратилась после оптимизатора.

Совершенно верно
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 31 2014, 20:00
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Условная ОС не может быть проверена в железе, как сказано в первом сообщении. rolleyes.gif
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Aug 1 2014, 05:39
Сообщение #14


Местный
***

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



Тут дело не в особенностях какого-то конкретного железа или RTOS (как кстати частота тиков планировщика связана с разрядностью процессора?). Есть определённая последовательность действий, которая в итоге приводит к результату 2. Какие это могут быть действия описаны в листинге в условии задачи. Тут вопрос исключительно на логику.
Цитата(ViKo @ Aug 1 2014, 01:00) *
Условная ОС не может быть проверена в железе, как сказано в первом сообщении. rolleyes.gif

Не уклоняйтесь от решения задачи, вдруг тоже такое когда-нибудь попадётся rolleyes.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 1 2014, 05:54
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(InsolentS @ Aug 1 2014, 08:39) *
Тут вопрос исключительно на логику.
Не уклоняйтесь от решения задачи, вдруг тоже такое когда-нибудь попадётся rolleyes.gif

А разве можно решить нерешаемое? rolleyes.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th July 2025 - 03:12
Рейтинг@Mail.ru


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