Разгон и торможение Windows NT

измеритель скорости переключение контекста


Сравнение 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;

}



Содержание раздела