使用while()和sleep()将程序置于睡眠模式之间的区别

时间:2014-02-10 11:59:00

标签: c linux performance-testing cpu-cache

我创建了一个共享对象,并从两个不同的程序访问它并测量时间。

DATA数组是两个进程之间的共享对象。

案例1:在program1中使用while

program1:

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);    

输出:首先我运行program1,然后运行Program2

Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680

Inside Program2, Time1 = 7620
Inside Program2, Time1 = 7600

案例2:在program1

中使用sleep()

program1:

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);    

输出:首先我运行program1,然后运行Program2

Inside Program1, Time1 = 17620
Inside Program1, Time1 = 17680

Inside Program2, Time1 = 17620
Inside Program2, Time1 = 17600

从情况-1的输出,我可以说共享数据 DATA数组由第一个程序加载到内存/缓存中,第二个程序从缓存中访问它。虽然CASE-2也是如此,但结果看起来像是在 Program1 进入睡眠状态时从缓存刷新。

我在linux下使用GCC。

有任何线索吗?提前致谢 。

2 个答案:

答案 0 :(得分:0)

我认为我们无法根据您的情况预测缓存行为。

它还取决于你的H / W,你没有提到(比如有多少CPU核心(物理或逻辑))。

我们不能说program_2将被安排在同一个核心上,并且就在program_1之后,因为它完全依赖于OS调度程序。因此program_2可以使用program_1填充的缓存。

由于在program_1之后安排的其他程序,缓存可能会被刷新。

答案 1 :(得分:0)

你没有准确描述你如何运行不同的版本(不同的进程?),但假设它们是顺序的 - 你可能会看到睡眠的影响()

当然,这取决于确切的实现和硬件,但它很可能会让你的CPU进入一些省电/睡眠状态(这就是它的设计目的)。如果是这种情况,则核心缓存必须作为流程的一部分进行刷新,并且您将使用冷缓存唤醒。另一方面,whie循环用于在磨削CPU并使其保持活动状态(以及缓存)时执行繁忙的等待循环,除非您碰巧在此过程中进行了上下文切换。

确切的细节将再次依赖于实现,在x86上,您可以使用内联汇编来调用monitor + mwait指令,以允许您指定要实现的确切C状态深度。它越深,缓存越多(主要与L3相关)。