Я пытаюсь «грубо» рассчитать время переключения контекста потока в системе Linux.Я написал программу, которая использует каналы и многопоточность для достижения этой цели.При запуске программы рассчитанное время явно неверно (см. Вывод ниже).Я не уверен, что это из-за того, что я использовал неправильный clock_id для этой процедуры или, возможно, мою реализацию
Я реализовал sched_setaffinity (), чтобы программа работала только на ядре 0. Я пытался выйтитак много пуха из кода, чтобы измерить только время переключения контекста, поэтому процесс протектора записывает в канал только один символ, а родитель читает 0 байт.
У меня есть родительский шаг, которыйсоздает один дочерний поток с односторонним каналом между ними для передачи данных, дочерний поток выполняет простую функцию для записи в канал.
void* thread_1_function()
{
write(fd2[1],"",sizeof("");
}
, в то время как родительский поток создает дочерний поток, запускает времяcounter, а затем вызывает чтение по каналу, в который записывается дочерний поток.
int main(int argc, char argv[])
{
//time struct declaration
struct timespec start,end;
//sets program to only use core 0
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
CPU_SET(0,&cpu_set);
if((sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set) < 1))
{
int nproc = sysconf(_SC_NPROCESSORS_ONLN);
int k;
printf("Processor used: ");
for(k = 0; k < nproc; ++k)
{
printf("%d ", CPU_ISSET(k, &cpu_set));
}
printf("\n");
if(pipe(fd1) == -1)
{
printf("fd1 pipe error");
return 1;
}
//fail on file descriptor 2 fail
if(pipe(fd2) == -1)
{
printf("fd2 pipe error");
return 1;
}
pthread_t thread_1;
pthread_create(&thread_1, NULL, &thread_1_function, NULL);
pthread_join(thread_1,NULL);
int i;
uint64_t sum = 0;
for(i = 0; i < iterations; ++i)
{
//initalize clock start
clock_gettime(CLOCK_MONOTONIC, &start);
//wait for child thread to write to pipe
read(fd2[0],input,0);
//record clock end
clock_gettime(CLOCK_MONOTONIC, &end);
write(fd1[1],"",sizeof(""));
uint64_t diff;
diff = billion * (end.tv_sec - start.tv_sec) + end.tv_nsec - start.tv_nsec;
diff = diff;
sum += diff;
}
Результаты, которые я получаю при выполнении этого, обычно таковы:
3000
3000
4000
2000
12000
3000
5000
и т. д., когда я проверяю время, возвращаемое в начальную и конечную структуры timepec, я вижу, что tv_nsec также представляется «округленным» числом:
start.tv_nsec: 714885000, end.tv_nsec: 714888000
WoulМожет ли это быть вызвано тем, что clock_monotonic недостаточно точен для того, что я пытаюсь измерить, или какой-то другой проблемой, которую я пропускаю?