Вот какая хорошая повторяемость при 100 переключающихся процессах/потоках и 10000 передиспетчеризаций в каждом из них:Olej писал(а):P.S. Тесты очень несовершенные (для простоты): параллельные процессы, потоки - начинают непрерывно переключать контекст сразу после создания, т.е. пока создаются следующие параллельные ветки - без синхронизации начала своей работы.
Но при больших числе переключений (-s) и числе ветвей (-n) этот начальный этап нивелируется, что хорошо видно по сходимости и устойчивости результата.
Код: Выделить всё
bash-4.2$ sudo nice -n100 ./shedt -n100 -s10000
число потоков = 100, общее число переключений = 1000000,
число процессорных тактов = 1570269300, тактов на переключение = 1570
bash-4.2$ sudo nice -n100 ./shedt -n100 -s10000
число потоков = 100, общее число переключений = 1000000,
число процессорных тактов = 1571919040, тактов на переключение = 1571
bash-4.2$ sudo nice -n100 ./shedt -n100 -s10000
число потоков = 100, общее число переключений = 1000000,
число процессорных тактов = 1569241870, тактов на переключение = 1569
Код: Выделить всё
bash-4.2$ sudo nice -n100 ./shedp -n100 -s10000
число процессов = 100, общее число переключений = 1000000,
число процессорных тактов = 1701520280, тактов на переключение = 1701
bash-4.2$ sudo nice -n100 ./shedp -n100 -s10000
число процессов = 100, общее число переключений = 1000000,
число процессорных тактов = 1800534390, тактов на переключение = 1800
bash-4.2$ sudo nice -n100 ./shedp -n100 -s10000
число процессов = 100, общее число переключений = 1000000,
число процессорных тактов = 1675575550, тактов на переключение = 1675
И вот, собственно, всё содержательное тело теста для потоков:
Код: Выделить всё
void* threadfunc ( void* data ) {
unsigned long i;
for( i = 0; i < S; i++ ) pthread_yield();
pthread_exit( NULL );
return NULL;
};
...
pthread_t *tid = (pthread_t*)calloc( sizeof( pthread_t ), N );
for( i = 0; i < N; i++ ) {
int status = pthread_create( tid + i, NULL, threadfunc, NULL );
if( status != 0 ) {
perror( "pthread_create" );
continue;
}
nf++;
}
unsigned long long rdt = rdtsc();
for( i = 0; i < nf; i++ )
pthread_join( tid[ i ], NULL );
rdt = rdtsc() - rdt;
Код: Выделить всё
pid_t pid;
for( i = 0; i < N; i++ ) {
pid = fork();
if( pid < 0 ) {
perror( "fork error" );
continue;
}
else if ( pid > 0 ) nf++;
else {
unsigned long i;
for( i = 0; i < S; i++ ) sched_yield();
exit( EXIT_SUCCESS );
}
}
unsigned long long rdt = rdtsc();
int status;
for( i = 0; i < nf; i++ ) wait( &status );
rdt = rdtsc() - rdt;