直接看代碼和運行結果(分別在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個內核吧。