2014-11-05 2 views
1

Я должен реализовать в операционной системе функцию sleep(). Это на данный момент, а не в предыдущей системе. Проблема в том, что я должен посчитать прошедшее время, чтобы разбудить спальную нить.Как реализовать подсчет времени в новой операционной системе?

Как мне это сделать? Должен ли я считать CPU Ticks или есть другой способ? Являются ли CPU Ticks не зависимыми от частоты процессора, которая отличается для каждого процессора?

Я должен реализовать эту функцию в языке C.

функция времени не существует ни

Спасибо заранее!

+0

Взгляните на http://stackoverflow.com/questions/3930363/implement-time-delay-in-c Я думаю, что ответы на ваши вопрос – l0gg3r

+0

@ l0gg3r Я серьезно сомневаюсь, что 'time()' был реализован ed, если OP записывает операционную систему с нуля. – user694733

ответ

3

Как правило, такая функциональность обеспечивается прерыванием аппаратного таймера (и связанным с ним драйвером), которое управляет указателем «отметки» и дельта-очереди указателей «Блок управления потоком» (pTCB). PTCP для спальных потоков хранятся в очереди, упорядоченной по счету количества истечения интервалов. Прерывание таймера увеличивает количество тиков и проверяет его снова на счет истечения срока действия элемента в начале очереди.

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

0

вы можете использовать time():

time_t t = time(); 

while(time() < t + sleepDuration); 
+0

У меня нет функции времени ... – Momo

+0

@Momo: time() находится в стандартной библиотеке c в time.h. Вам не разрешено использовать его? –

1

Это полностью зависит от вашей платформы/OS. Он должен предоставить вам некоторую временную информацию, например. клещи. Иначе это просто невозможно.

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

1

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

Хорошая статья, в которой обсуждаются различные структуры данных, как это сделать эффективно: here. Я рекомендую по моей собственной схеме опыта 7. Это довольно просто реализовать и прекрасно работает.

Быстрая реализация с хорошим API here. Но я предвзятый, потому что я это написал.

Если вы не хотите прерывания таймера со статической частотой, становится намного сложнее реализовать хороший механизм таймера с хорошей производительностью. Я провел несколько экспериментов, но я бы посоветовал вам начать с простого прерывания таймера со статической частотой. Когда вы начинаете делать динамические таймеры, вам нужно точно понять компромиссы, которые вы готовы сделать.

+0

большое спасибо – Momo

0

Вы можете использовать счетчик времени штампа CPU (TSC), чтобы получить значения счетчика для сохранения времени. См. Главу 16.12.1 из "Intel® 64 and IA-32 Architectures Software Developer’s Manual".

ТСК представляет собой счетчик низкого уровня, который может обеспечить счетчик значений независимо от скорости процессора:

«Счетчик штампа времени в более новых процессорах может поддерживать усиление, называют поддержку инвариантного TSC процессора для. инвариантно ТСК обозначается CPUID.80000007H:.. EDX [8]

Инвариантный ТСК будет работать с постоянной скоростью во всех ACPI p-, C--, и Т-состояниях Это архитектурное поведение перемещения вперед. На процессорах с инвариантной поддержкой TSC ОС может использовать TSC для таймера настенных часов услуг (вместо таймеров ACPI или HPET). TSC читает гораздо более эффективны и не берут на себя накладные расходы, связанные с кольцевым переходом или доступ к платформе ресурса.»

Однако для осуществления сна(), так функциональность вы должны смотреть на таймер аппаратных средств как HPET, ACPI, и так. См "Intel 64® and IA-32 Architectures Software Developer's Manual, Volume 3B: System Programming Guide, Part 2" и "IA-PC HPET (High Precision Event Timers) Specification" для деталей.

Смежные вопросы