Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Назад Сервер TCP/IP ... много серверов хороших и разных Вперед

Библиотека средств хронометража и диагностики

Поскольку нам нужна разрешающая способность (наносекундного диапазона) хронометража, намного превышающая разрешающую способность системного таймера Linux (миллисекундного диапазона), то для изменения таких временных интервалов используются измерения на основе счётчика тактов частоты процессора, прошедших с момента загрузки системы (команда RDTSC процессоров x86). Для осуществления таких измерений привлечена библиотека (в виде исходных кодов) из другого проекта, а все вызовы оформлены, в данном случае, как статическая библиотека libdiag.a, компонуемая с программой клиента. Детально с ней можно познакомиться в архиве проекта, а здесь мы покажем, в качестве основы, только два основных вызова:

  • считывание текущего значения счётчика тактов процессора:
    unsigned long long rdtsc( void ) { 
       unsigned long long int x; 
       asm volatile ( "rdtsc" : "=A" (x) ); 
       return x; 
    } 
  • вычисление частоты процессора, на котором выполняется вызов (для перевода безразмерного числа прошедших тактов в единицы измерения реального времени):
    uint64_t proc_hz( void ) { 
       time_t t1, t2; 
       uint64_t cf, cs; 
       time( &t1 ); 
       while( t1 == time( &t2 ) ) cf  = rdtsc(); 
       while( t2 == time( &t1 ) ) cs  = rdtsc(); 
       return (unsigned long)( cs - cf - calibr( 1000 ) ); 
    } 

Тактовая частота процессора (не путать с рабочей частотой процессора), даваемая функцией proc_hz(), могла бы быть определена в Linux и статически:

$ cat /proc/cpuinfo | grep 'model name' 
model name	: Genuine Intel(R) CPU           T2300  @ 1.66GHz 
model name	: Genuine Intel(R) CPU           T2300  @ 1.66GHz 

- это то значение (1.66*10E9), которое мы видим последним полем этой строки. Но мы предпочли динамически определять это значение (число тактов, насчитанное на протяжении секундного интервала).


Назад Сервер TCP/IP ... много серверов хороших и разных Вперед