измеритель скорости переключение контекста
Сравнение ACPI-ядра с I486C ядром на машине автора (Intel Pentium-III 733 MHz, 256 Mb SDR-RAM-133), обнаруживает значительное расхождение в их производительности. I486C ядро переключает контекст намного быстрее, особенно при работе с большим количеством потоков. В общем случае – количество переключений контекста обратно пропорционально количеству потоков, т. к. контексты надо где-то хранить, а кэш-память не резиновая. Если ядро делает много лишних сохранений (о которых мы уже говорили), оно существенно проигрывает в скорости. Тем не менее, все ядра спроектированы достаточно грамотно и сохраняют отличную подвижность даже при работе с тысячами потоков.
Переключение процессов требует дополнительных накладных расходов и потребляет намного больше памяти, попутно вызывая сброс буфера ассоциативной трансляции, поскольку каждый из процессов обладает своим адресным пространством. Выделить код, ответственный за переключение контекстов, несложно, – он выдает себя обращением к регистру CR3, загружая в него указатель на каталог страниц (Page Directory Physical Address).
Давайте немного модернизируем нашу тестовую программу, заменив потоки процессами. Один из вариантов реализации может выглядеть так:
thread()
{
while(1) Sleep(0);
}
#define defNthr 3
#define argNthr ((argc >
1)?atol(argv[1]):defNthr)
#define argProc "-666"
main(int argc, char **argv)
{
int a, zzz;
char buf[1000];
STARTUPINFO st;
PROCESS_INFORMATION pi;
memset(&st, 0, sizeof(st));
st.cb = sizeof(st);
if ((argc >
1) && !strcmp(argv[1], argProc)) thread();
sprintf(buf,"%s %s",argv[0], argProc);
printf("creating %d proc...", argNthr);
for (a = 0; a < argNthr; a++)
CreateProcess(0, buf, 0,0,0, NORMAL_PRIORITY_CLASS,0, 0, &st, &pi);
printf("OK\n");
thread();
return 0;
}