Ниже представлены типичные вопросы, задаваемые на интервью потенциальными работодателями - в области 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.
Продолжение следует...