OSDev http://osdev.su/ |
|
Измерение времени в ОС http://osdev.su/viewtopic.php?f=6&t=797 |
Страница 1 из 4 |
Автор: | achesnokov [ 10 сен 2013, 21:19 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
maisvendoo писал(а): Для измерения временных промежутков, хотя бы даже для реализации имеющихся в популярных ОС вызовов sleep/usleep, использование IRQ0, IRQ8 не подходит в виду небольшого разрешения таймера и часов РВ. Поэтому решил сделать реализацию на основе инструкции RDTSC. Сама реализация sleep(...) Код: /*------------------------------------------------------------------------------ // //----------------------------------------------------------------------------*/ int sleep_msec(u32int msec) { u32int ticks = 0; /* Time interval in CPU ticks */ u64int cpu_ticks0 = 0; /* Initial CPU tick count */ u64int cpu_ticks1 = 0; /* Actual CPU tick count */ /* Get CPU ticks count */ get_cpu_ticks(&cpu_ticks0); /* Calculate tick's count in 1 ms */ u32int scaled_cpu_freq = get_cpu_freq()/MSEC; /* Tick's count in required time interval */ u32int eq_ticks = msec*scaled_cpu_freq; do { /* Get CPU ticks count */ get_cpu_ticks(&cpu_ticks1); /* Time interval in CPU ticks */ ticks = (u32int) (cpu_ticks1 - cpu_ticks0); } while ( ticks < eq_ticks); return 1; } Чем же такая реализация решает проблемы неточности IRQ0, IRQ8? Такая реализация sleep_msec на 100% загружает одно из ядер процессора на время своего выполнения, что не приемлемо для нормальной работы. Может, я конечно, что-то недопонял в коде. |
Автор: | maisvendoo [ 10 сен 2013, 21:49 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
По идее в качестве "эталона" времени здесь используется продолжительность такта процессора, то намного меньше самого малого периода срабатывания IRQ0. Виндозный QueryPerformanceCounter() тоже построен на использовании RDTSC. achesnokov писал(а): Такая реализация sleep_msec на 100% загружает одно из ядер процессора на время своего выполнения Кроме как зациклить выполнение потока на время задержки пока ничего не придумал |
Автор: | achesnokov [ 10 сен 2013, 22:11 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
maisvendoo писал(а): По идее в качестве "эталона" времени здесь используется продолжительность такта процессора, то намного меньше самого малого периода срабатывания IRQ0. Виндозный QueryPerformanceCounter() тоже построен на использовании RDTSC. achesnokov писал(а): Такая реализация sleep_msec на 100% загружает одно из ядер процессора на время своего выполнения Кроме как зациклить выполнение потока на время задержки пока ничего не придумал QueryPerformanceCounter() по названию своему определяет и назначение свое - измерение "времени" выполнения фрагмента кода. Правильная реализация sleep/sleep_msec должна приводить к приостановке текущего треда (и если это необходимо к переключению процессов). Будиться тред должен по прерыванию. Никто ничего лучше не придумал. Если не хватает точности, просто увеличивается частота прерывания IRQ0. Тред точно разбудить нельзя. +- 1 срабатывание IRQ0 - предельная точность. |
Автор: | maisvendoo [ 10 сен 2013, 22:17 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
suspend для потоков пока не реализовал её . Как реализую - переделаю. |
Автор: | Himik [ 10 сен 2013, 22:20 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
Непонятно, как sleep() применяется для измерения временных промежутков. |
Автор: | maisvendoo [ 10 сен 2013, 22:27 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
sleep - здесь, пример на котором проверял корректность работы. Главное тут пока get_cpu_ticks() и get_cpu_freq(). Последняя пытается учитывать что частота меняется - в консоль она выдает именно текущую частоту, которая пересчитывается раз в 1/256 секунды achesnokov писал(а): на 100% загружает одно из ядер процессора М-да, а однопроцессорный/одноядерный повесит вообще. Ну этот код не претендует на академичность, это первая проба в этом направлении |
Автор: | pavia [ 10 сен 2013, 23:01 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
По поводу замера скорости процессора. Цитата: sleep - здесь, пример на котором проверял корректность работы. Главное тут пока get_cpu_ticks() и get_cpu_freq(). Последняя пытается учитывать что частота меняется - в консоль она выдает именно текущую частоту, которая пересчитывается раз в 1/256 секунды Реализация бредовая, TSC имеет фиксированную частоту и именно её вы меряете. Исключение PentiumM в котором она плавала. |
Автор: | maisvendoo [ 10 сен 2013, 23:35 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
pavia писал(а): Реализация бредовая Понял уже |
Автор: | Nable [ 10 сен 2013, 23:41 ] |
Заголовок сообщения: | Re: Измерение времени в ОС |
Только ли Pentium M? По-моему, на многих ~старых процессорах TSC совпадала с частотой процессора, так что весьма так имела право меняться (особенно при использовании функций энергопотребления). 2 ТС: откуда такое увлечение асмом там где можно обойтись без него, да ещё и в вырвиглазном синтаксисе? Есть же inline asm (правда, тут тоже может понадобиться AT&T, но писанины хотя бы меньше), есть intrinsic'и. На тему Bochs - он же симулятор, у него такты честные и весьма детерминированные. Максимум что получалось выжать (на 3ГГц core i3) не начиная замедляться - около 300M, и то в особо удачных моментах, так-то до сих пор 50M - довольно оптимальное значение, ну может 100. На тему sleep и прочего - тут нужны довольно интересные структуры данных чтобы была очередь (с возможностью быстро добавлять элементы в нужное место, т.е., например, ещё дерево к ней) кого и когда пробуждать, а так же какое-то общесистемное время, которое монотонно и может корректироваться по разным источникам времени. TSC весьма удобен, конечно, но в многопроцессорных системах с ним проблема + не везде его частота стабильна. В общем, например, для переключения задач и тому подобного очень удобен local APIC timer. |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |