Программерам, Специалистам в области RT/Embedded, и т.д (часть2)

Jul 29, 2005 21:53


Ниже представлены типичные вопросы, задаваемые на интервью потенциальными работодателями - в области embedded и real-time и не только....

Израиль Июль 2005.

Пример 5:
Даны 2 структуры данных.

1. Связный список (Linked List).
2. Статически распределённый массив.

Вопрос1:
В каком случае эффективней использовать Linked List, а в каком статический массив ?
Ответ:
Список эффективно использовать когда количество данных заранее не известно - таким образом экономится память.
Массив эффективен при известном количестве данных, операции копирования и т.д более эффективны по времени выполнения.

Вопрос2:
Почему в RT системах лучше избегать использование связанных списков и подобных типов данных ?
Ответ:
Массивное использование списков вызывают дефрагментацию в memory heap - тем самым приводит не эффективному распределению динамической памяти.

Пример 6:



Реализован механизм (без применения механизмов операционной системы) доступа двух тасков к Shared Memory.
Доступ к Access регистру атамарен.
При чтении в регистр значение х, при записи у.
При чтении - пишущий поток ждет, и наоборот...

Вопрос:
В чем принципиальная проблема в такой реализации?

Ответ:
Основная проблема такого подхода: ждущий таск всегда ожидая своей очереди на операцию постоянно делает опрос (polling) access регистра - что приводит к повышенной загруженности процессора.
(Реализация с помощью семафора решает проблему).

Пример 7:
Даны 2 класса:

class A
{
  protected:
  char * temp;
  public:
  A()                                          // конструктор класса A
  {
    temp = (char *)malloc(50);
  }

~A()                                     // деструктор класса A
   {
      free(temp);
   }
};

class B : public A                     // B наследует A
{
  protected:
  char * temp2;
  public:
  B()                                          // конструктор класса A
  {
    temp2 = (char *)malloc(50);
  }

~B()                                     // деструктор класса A
   {
      free(temp2);
   }
};

Далее идет программа где используются данные классы:

void main()
{
 A *Ainst = new B;             // Аля полиформизм
  ......
  ......                                  // произвольное тело программы
  ......
 delete Ainst ;                    // Удаления Ainst
}

Вопрос:
Какая проблема возникает при запуске этого кода ?

Ответ:
При запуске данной программы возникает Memory Leak (Утечка памяти) так как не вызывается деструктор класса B (в строчке Удаления Ainst).
Решение проблемы: деструктор класса A должен быть виртуальным.

Пример 8:
Дана операционная система Windows CE (ранние версии). В данной операционной системе не реализована функция:

WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds);

Вопрос:
Как реализовать эту функцию с помощью WaitForSingleObject(...) ?

Ответ:
Для реализации надо открывать Thread на каждый отдельно ожидаемый Event. Пример реализации Thread'a:

void WaitTread(HANDLE *Handle)
{
   WaitForSingleObject(Handle,INFINITE);
   SetEvent(CommonEvent);
   // тут нужна критическая сессия для зашиты Source
    Source = Handle;
}

В основном потоке ожидается CommonEvent и по глобальной переменной Source индифицируется какой именно из ожидаемых Event'ов был выловлен.
Подобная реализация сделана в Windows NT.

Продолжение следует...

hi-tech, Работа

Previous post
Up