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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Хитровывернутый вопрос про RTOS, с интервью..
adnega
сообщение Aug 1 2014, 05:59
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата
Подсказка от интервьювера: результат не зависит ни от количества потоков, ни от количества итераций в цикле for

А если потоков 0?
А если потоков 1, а итераций 0?

Резальтат, равный 2, печатается постоянно или нужно объяснить ситуацию с крайне низкой вероятностью, когда печатается 2 ?
Go to the top of the page
 
+Quote Post
ZASADA
сообщение Aug 1 2014, 06:28
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210



что возвращает вызываемая функция
void thread(void)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 1 2014, 06:31
Сообщение #18


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

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



Цитата(ZASADA @ Aug 1 2014, 09:28) *
что возвращает вызываемая функция
void thread(void)

разве не "ничего"? sm.gif
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 1 2014, 08:25
Сообщение #19


Гуру
******

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



А какой это язык программирования ?
Go to the top of the page
 
+Quote Post
ZASADA
сообщение Aug 1 2014, 08:39
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210



типа с
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Aug 2 2014, 04:19
Сообщение #21


Местный
***

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



На работу всё-таки взяли, попробую найти там этого интервьювера и докопаться до истины.. sm.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 3 2014, 13:29
Сообщение #22


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Всё гораздо проще - просто посмотрите дебаггером - всё зависит от оптимизации - и ваш интервьюер просто не сказал вам все данные. но если добавить volatile - проблем бы было меньше. Это называется - срубить не разбираясь. Если вы сразу не задали вопрос про оптимизацию и volatile - значит понимания нет - а код тут не при чем
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Aug 3 2014, 18:13
Сообщение #23


Местный
***

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



Цитата(x893 @ Aug 3 2014, 18:29) *
Всё гораздо проще - просто посмотрите дебаггером - всё зависит от оптимизации - и ваш интервьюер просто не сказал вам все данные. но если добавить volatile - проблем бы было меньше. Это называется - срубить не разбираясь. Если вы сразу не задали вопрос про оптимизацию и volatile - значит понимания нет - а код тут не при чем

Спасибо за участие в обсуждении)) Но, мне кажется, что дело не в этом совершенно. Задача имеет чисто алгоритмическое, логическое решение. Результат и решение не имеют привязки к аппаратной платформе, компилятору, оптимизатору и т.п. Этот код предоставлен as-is и вопрос не в том, как сделать из него нормальный код (кстати, если бы переменная была volatile, это разве что-нибудь бы поменяло?).


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


Знающий
****

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



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


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #26


Знающий
****

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



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

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


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(ViKo @ Aug 1 2014, 09:54) *
А разве можно решить нерешаемое? rolleyes.gif

Цитата(Понедельник начинается с субботу)
— Мы сами знаем, что она не имеет решения, — сказал Хунта, немедленно ощетиниваясь. — Мы хотим знать, как её решать.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2014, 06:48
Сообщение #28


Ally
******

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



Цитата(InsolentS @ Aug 3 2014, 21:13) *
Спасибо за участие в обсуждении)) Но, мне кажется, что дело не в этом совершенно. Задача имеет чисто алгоритмическое, логическое решение. Результат и решение не имеют привязки к аппаратной платформе, компилятору, оптимизатору и т.п. Этот код предоставлен as-is и вопрос не в том, как сделать из него нормальный код (кстати, если бы переменная была volatile, это разве что-нибудь бы поменяло?).


Похоже алгоритмического решения не будет.
Интернет не знает таких функций как thread_create(thread, 5) и thread_join() с такими типами аргументов, а потому потом можно будет грузить на их счет все что угодно.
Это подстава.

Можно предположить, что имелись в виду POSIX функции pthread_create и pthread_join, но они не умеют работать без аргументов и с массивами потоков.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 4 2014, 21:06
Сообщение #29


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



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


вести речь о переключении задач бесмысленно. т.к. фаза старта ниток не синхронизируется. в некоторых осях это вообще может не застартовать
секундами-минутами-часами-сутками... код в этом плане левый. нет синхронной фазы готовности всех ниток. типичная ошибка начинающих
программеров. Начинает сыпаться или странно себя вести, при ударных нагрузках на серваках. Особенно когда на время жизни ниток
начинает навешиваться некая логика. Например общая готовность, или там обслуживание клиентов и т.п. вещи...

теоретически-гепотетический код. хорошая тема для начала задушевной беседы, и больше ни для чего. результат не определён вообще...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 5 2014, 07:43
Сообщение #30


Ally
******

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



Цитата(kolobok0 @ Aug 5 2014, 00:06) *
вести речь о переключении задач бесмысленно. т.к. фаза старта ниток не синхронизируется. в некоторых осях это вообще может не застартовать
секундами-минутами-часами-сутками... код в этом плане левый. нет синхронной фазы готовности всех ниток. типичная ошибка начинающих
программеров. Начинает сыпаться или странно себя вести, при ударных нагрузках на серваках. Особенно когда на время жизни ниток
начинает навешиваться некая логика. Например общая готовность, или там обслуживание клиентов и т.п. вещи...

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


Что это за загадочная "синхронная фаза"?

Если код основан на POSIX, то можно кое что восстановить.

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

Рассматриваем что могло быть на реальном железе:

До вытеснения тут явно не дойдет. Тик осей редко бывает короче 10 мс.
Значит вся работа задач начнется после вызова thread_join
Без аргументов thread_join не бывает, возможно это переопределение оригинальной функции и в этой реализации ожидание всех задач производится по очереди с помощью семафоров.
Но возможно реализован механизм ожидания маски флагов от всех задач сразу.
В любом случае задачи выполнятся последовательно не вытесняя друг друга, поскольку имеют одинаковый приоритет.
Случится прерыванию во время выполнения тех задач крайне мала, поскольку все задачи выполнятся менее чем за микросекунду.

Но как в thread_join будет идентифицироваться каждая задача? Передачи дополнительных аргументов с уникальными значениями задачам не видно.
В процедуре thread_join наверняка произойдет ошибка после того как там попытаются ожидать окончания нескольких неразличимых задач.

И тогда произойдет неожиданный выход из thread_join.
Далее заход в функцию printf и там возможно где-то ось не на долго переключится на одну из оставшихся активных задач во время ожидания прерывания по готовности чего-то периферийного.
Вот тут и успеет какая-то из задач инкрементировать count до прерывания и переключения контекста на драйвер printf.

Во всяком случае у меня аналогичный код под MQX работает идеально при любом уровне оптимизации и всегда выдает 25
Код
const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
{
  /* Task Index,    Function,                 Stack,  Priority,          Name,         Attributes,                                                         Param, Time Slice */
  { MAIN_IDX,        Main_task,                1500,   MAIN_ID_PRIO,      "Main",      MQX_FLOATING_POINT_TASK + MQX_AUTO_START_TASK,                       0,     0 },
  { TST_TSK_IDX,     Test_Task,                1500,   MAIN_ID_PRIO,      "TestTask",  MQX_FLOATING_POINT_TASK,                                             0,     0 },
  { 0 }
};

unsigned int count = 0;

LWEVENT_STRUCT lwevg;

/*-------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------*/
void Test_Task(unsigned int initial_data)
{
  unsigned int i;
  for(i = 0; i < 5; i++)
  {
    count++;
  }
  _lwevent_set(&lwevg, initial_data);
}
/*-------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------*/
void Main_task(unsigned int initial_data)
{
  _lwevent_create(&lwevg, LWEVENT_AUTO_CLEAR);

  _task_create(0, TST_TSK_IDX, 1);
  _task_create(0, TST_TSK_IDX, 2);
  _task_create(0, TST_TSK_IDX, 4);
  _task_create(0, TST_TSK_IDX, 8);
  _task_create(0, TST_TSK_IDX, 16);

  _lwevent_wait_for(&lwevg, 1+2+4+8+16,TRUE,NULL);
  printf("Count =%u  \r\n", count);
}




Go to the top of the page
 
+Quote Post

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

 


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


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