小程序測試Window的時間片大小

直接看代碼和運行結果(分別在I5 CPU下和單核虛擬機上運行)

#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"winmm.lib")	//for using timeGetTime()
void testCpuTimeSlice(unsigned long printTimes)
{
	unsigned long oldTick, newTick, times = 0, i = 0;
	oldTick = timeGetTime();
	while (true)
	{
		i++;
		newTick = timeGetTime();
		if (newTick - oldTick >= 2)
		{
			printf("[%d] %10d - %10d = %3d(ms), %10d\n", ++times, newTick, oldTick, newTick - oldTick, i);
			if (times >= printTimes)
				break;
		}
		oldTick = newTick;
	}
}

int main()
{
	testCpuTimeSlice(10);
	return 0;
}


【Intel I5 CPU + WindowsXP下的運行輸出】
//同時運行一
[ 1]  146560428 -  146560426 =   2(ms),  190844219
[ 2]  146560444 -  146560442 =   2(ms),  190974340
[ 3]  146560449 -  146560444 =   5(ms),  190974341
[ 4]  146560463 -  146560460 =   3(ms),  191097888
[ 5]  146560483 -  146560479 =   4(ms),  191277811
[ 6]  146560499 -  146560496 =   3(ms),  191445350
[ 7]  146560685 -  146560682 =   3(ms),  193682703
[ 8]  146560842 -  146560807 =  35(ms),  195140159
[ 9]  146561134 -  146561132 =   2(ms),  198891335
[10]  146561157 -  146561151 =   6(ms),  199101315
Press any key to continue . . .

//同時運行二
[ 1]  146560390 -  146560388 =   2(ms),   96889434
[ 2]  146560767 -  146560763 =   4(ms),  102199905
[ 3]  146561147 -  146561145 =   2(ms),  107882153
[ 4]  146561160 -  146561155 =   5(ms),  107972278
[ 5]  146561163 -  146561160 =   3(ms),  107972279
[ 6]  146561186 -  146561177 =   9(ms),  108129560
[ 7]  146572862 -  146572860 =   2(ms),  551028220
[ 8]  146577130 -  146577128 =   2(ms),  655035805
[ 9]  146582589 -  146582587 =   2(ms),  876039745
[10]  146643019 -  146643017 =   2(ms), -1290940213
Press any key to continue . . .

//同時運行三
[ 1]  146560860 -  146560855 =   5(ms),  395965552
[ 2]  146561167 -  146561164 =   3(ms),  400290862
[ 3]  146576247 -  146576244 =   3(ms),  932541716
[ 4]  146577205 -  146577201 =   4(ms),  947577989
[ 5]  146583534 -  146583532 =   2(ms), 1183212378
[ 6]  146625590 -  146625587 =   3(ms), -1576122299

【單核Windows XP虛擬機下的運行輸出】
[ 1]    1324562 -    1324546 =  16(ms),    1170619
[ 2]    1324577 -    1324562 =  15(ms),    2357354
[ 3]    1324593 -    1324577 =  16(ms),    3542238
[ 4]    1324609 -    1324593 =  16(ms),    4741160
[ 5]    1324624 -    1324609 =  15(ms),    5934732
[ 6]    1324640 -    1324624 =  16(ms),    7134473
[ 7]    1324656 -    1324640 =  16(ms),    8279654
[ 8]    1324671 -    1324656 =  15(ms),    9502513
[ 9]    1324687 -    1324671 =  16(ms),   10655172
[10]    1324702 -    1324687 =  15(ms),   11826419

猜測:

    windows xp分配的時間片最小爲15毫秒,但是小任務不需要運行那麼長時間,就提前把控制權交給調度器。 

    對於多核,即使一個內核一直在運行while循環,也可能不會被打斷,因爲還有其他核去執行其他任務。 

    如果CPU不忙,運行一個實例的話,會一直都沒有輸出,因爲它可以獨佔一個內核,不需要給別人讓出時間片。 I5 CPU有2個Processor,共4個Core,翻譯過來就是兩個處理器4個內核吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章