在与多线程打交道的过程,不可避免的的要提到:“CPU时间片”这个东西。一开始时我认为这非常容易理解:
一个线程准备就绪,Window为它分配CPU时间,然后它运行到分配给的时间配额完成。系统调度下一个同优先级准备就绪的线程到CPU开始执行。这个时间配额就是CPU时间片。
这理解钢钢的,以至以我还在Google上搜索“Windows 时间片 大小”来帮助我了解一个线程在Windows上得到的时间配额。
事实真的如此吗?我在上篇Blog(http://blog.csdn.net/blue_morning/article/details/7841534)编写时,我发现这是一个伪概念。也就是说:
1、根本没有CPU调度线程时分给线程CPU时间片一说。
2、CPU时间片本质上是一个不存在的东西,无论是操作系统还是CPU,根本就不认识时间片这个东西。
为什么呢?如果我们是以CPU时间片来理解线程在CPU执行的话,那么一台5年前运行WinsowsXP的计算机和今年新买的运行XP的计算机其运行速度应该是相同的。或是换个说法:
一个5年前的软件在XP上运行需要100个时间片才能完成,那么在今天新电脑的XP上运行仍然需要100个时间片。我们不会感觉到软件的速度提高了对不对?
因为时间是固定的,我们不可能改变时间的长短,所以这个结论不可能有错。
但这个说法的错误太过明显了。所以Windows分给线程的不是CPU时间片,而是CPU频率或是CPU时钟频率。
这样才能解释为什么当CPU时钟频率提高一倍,软件的运行速度也提高了一倍。因为在同一时间段内,运行程序的线程得到了双倍的CPU频率。
这也是本文的来由:错误的CPU时间片。因为在操作系统看来时间和CPU频率根本就是两回事。而我们把这两个概念混为一谈。
甚至严格来说:Windows操作系统对CPU的调度是基于CPU时钟频率的,完全与时间无关。
再补充两个概念来理解:
一、现有的即时战略游戏中,建造一个单位的时间是使用Windows系统提供的计时器函数来确定的,这个计时器使用的时间就是我们现实中的时间,所以无论我们在10年的电脑运行星际争霸或帝国时代还是用现在电脑来运行,建造一个单位的时间仍是相同,不会因为电脑CPU的时钟频率提高而变化了单位的建造时间。
二、我在Google上搜索CPU时间片时,确实发现了有的操作系统有CPU时间片大小这个参数,但很容易理解这是偷换概念,本质改变这个参数仍是改变分配给线程的CPU时钟频率大小,而不是时间。