Разница между использованием while() и sleep() для перевода программы в спящий режим
Я создал общий объект и получаю к нему доступ из двух разных программ и измеряю время.
Массив DATA - это общий объект между двумя процессами.
Случай 1: использование while внутри программы1
программа1:
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time2=%d\n",Time_needed);
while(1){}; // I replace this by sleep(1000) in CASE-2
Программа2:
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
ВЫХОД: Сначала я запускаю программу 1, затем Программу 2
Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680
Inside Program2, Time1 = 7620
Inside Program2, Time1 = 7600
Случай 2: использование sleep() внутри программы1
программа1:
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program1, Time2=%d\n",Time_needed);
sleep(1000);
Программа2:
access shared DATA array ;// to load into memory and avoid page fault during access time calculation
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
start=timer;
access shared DATA array
end=timer;
Time_needed= end-start
printf("Inside Program2, Time1=%d\n",Time_needed);
ВЫХОД: Сначала я запускаю программу 1, затем Программу 2
Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680
Inside Program2, Time1 = 17620
Inside Program2, Time1 = 17600
Исходя из вывода в случае -1, я могу сказать, что массив данных общих данных загружается в память / кэш первой программой, а вторая программа обращается к нему из кэша. Хотя это также верно для CASE-2, но результат выглядит так, как будто он выгружается из кэша, когда Program1 переходит в режим сна.
Я использую GCC под Linux.
Любая подсказка? Заранее спасибо.
2 ответа
Вы не описали точно, как вы запускаете разные версии (разные процессы?), Но предполагаете, что они последовательны - возможно, вы видите влияние сна ()
Конечно, это зависит от точной реализации и HW, но очень вероятно, что ваш процессор будет переведен в состояние энергосбережения / сна (для этого он и предназначен). Если это так, то основные кеши должны быть очищены как часть процесса, и вы проснетесь с холодными кешами. Цикл whie, с другой стороны, предназначен для выполнения занятого цикла ожидания во время измельчения вашего ЦП и поддержания его работоспособности (вместе с кешами), если только вы случайно не получите переключение контекста.
Точные детали снова будут зависеть от реализации, на x86 вы можете использовать встроенную сборку для вызова инструкций monitor+mwait, которые позволяют вам указать точную глубину C-состояний, которую вы хотите достичь. Чем оно глубже, тем больше кешей будет закрыто (в основном это касается L3).
По моему мнению, мы не можем предсказать поведение кэша согласно вашему случаю.
Это также зависит от вашего H/W, который вы не упомянули (например, сколько процессорных ядер (физических или логических) присутствует).
Мы не можем сказать, что program_2 будет запланирован на том же ядре и сразу после program_1, потому что это полностью зависит от планировщика ОС. Таким образом, программа_2 может использовать кэш, заполненный программой_1 или нет.
Возможно, что кэш очищен из-за какой-то другой программы, которая была запланирована сразу после program_1.