WINDOWS平台上的WIN32程序的线程,多核心处理的问题
关于多核心好不好,程序如何如何,速度谁快谁慢,我有话说.帖子的题目已经把议论的范围确定了,我们只讨论X86/X64 CPU在WINDOWS平台上的WIN32程序的线程,多核心处理的问题

我不想说谁好谁快,看完了请诸位自己分析
首先,说说,线程,进程的概念.一个EXE是一个程序,只有一个进程,进程中包括了由操作系统分配给这个程序的基本资源,但是我们伟大的CPU并不能直接运行进程(WINDOWS系统上是这样的)而是要运行该进程中的一个线程.线程能够通过操作系统获得CPU的使用权限来让自己运行(WIN XP上通常每次获得执行权利的时间是2ms)也就是说,一个进程对应一个EXE,这个进程至少包含一个线程来执行.那么,简单的说,只包含一个线程的进程可以叫做单线程程序,如故包含多个,可以叫做多线程程序了.(实际上,即便是编写程序的人,只编写了一个单线程的程序,那么在运行的时候也不可能仅仅只有一个线程,因为操作系统还要自动为他建立一些其他的线程来保证这个程序的运行.)

好,现在基本上闹明白了,进程和线程了.现在说单核心(个)和多核心(个)CPU.一个核心(一个物理CPU)在WINDOWS里面算做一个CPU,每个CPU可以得到操作系统分配的处理任务,也就是说某个核心可以执行操作系统中某个进程的线程.对于单线程程序,他的唯一一个线程要想获得CPU时间,必须进入操作系统队列排队,经由操作系统调度之后,获得对某个CPU时间的权利(如果是单核心的,那么肯定只有1个选择了,多核心的话,每个CPU核心的队列他都可以进入,这就好比一个超级市场,有1个收银窗口和2个的区别).对于多线程的程序,任何一个线程要执行的话,也要进行排队,在单核心CPU中,所有的线程都要排队在一个CPU上等待顺序执行,在多核心CPU上,同一个进程的多个线程有机会同时分布到多个CPU上并行计算。简单说起来是这样的,操作系统对CPU的分派是非常复杂的过程,谁也无法用简短的文章说清楚到底是怎么样的.和软件与硬件都有很大关系和差异.但是原理是没有错误的。

那么是不是核心多,速度就一定快?也不一定,因为一个进程中的线程可能需要等待其他线程或者进程完成某些操作后才能继续进行,当他们在等待状态时,即便轮到了他们的执行时间他们也只是立刻放弃运行权利继续等待而已.但是放弃之后,其他排队的线程可以立刻在CPU上继续执行,也不能说是一点帮助也没有.起码是让开了位置让其他人继续.多个核心还是可以同时计算的.

现在,让我们想想一个最经典的应用,你下着BT,开着QQ\MSN\SKYPE,打着魔兽,这些程序貌似在"同时"进行,但是别做梦了!!!!实际上在每个时间周期中,他们要顺序的排队执行,核心多的话,有可能能够同时有2个线程执行,但是如何这2个线程恰好又要互相同步等待,那么实际上优势不明显.但是也有可以从中获益的情况.例如SKYPE的线程0在核心1上,MSN的线程F在核心2上.QQ线程0在核心3上,魔兽线程0\5\7\E分别在核心1,2,3,4上.杀毒软件线程1\2\3\4\5在CPU核心5\7\9\11\15上(16核心的,嘿嘿,或者是2颗8核心的CPU又或者是4个Q6600(或者其他AMD CPU),如果真有那么多的话WINXP就不使用了要用到WIN SERVER产品啦)

还有一个重要的问题就是资源的争用,在计算机里面,有很多资源是不能够或者根本不可能同时共享使用的,也就是某个资源在同一时间不管你有多少个核心,你都需要排队使用(例如,马桶).这也是限制并行计算的一个因素.
多核心或者多处理器之间的同步和调度也需要损耗时间和计算能力作为代价来运行,所以,从客观的角度来说,说某些环境下多核心的处理器与单核心的处理性能是不可能仅仅从CPU核心数量上评判的。除了核心数量以外,还要有操作系统的差异,调度算法的不用,应用和驱动程序的特点等等等等等共同影响着处理的速度.

最后,可以简单得出一个简单的理论上的简单结论:
1.你的核心越多,你并行计算的机会就越多,但是你未必能够用得上.(对于同一个进程,所以速度并不明显加快,但是对于你,你同时做了2个或者多个进程的事)
2.你的核心速度越快,你的计算吞吐就越大,对你的处理速度有一定直接的影响.(例举一个不科学的小例子,一个16核心的586 133CPU,每个线程都只能在133上,一个P4 2.4,那么所有的线程都在2.4上(AMD的也一样,他们是一样一样一样的!再强调一次啊,可没偏向))
不要再发表什么关于 "多任务下多核心有用,单任务没有" 这样类似看法了,这句话放在WINDOWS系统上很傻很天真,什么叫任务?什么又多任务?什么又叫单任务?一个WINDOWS系统仅仅本身的支持进程就有很多.

最后建议对这些议题有兴趣的去看看 深入解析WINDOWS操作系统第4版 这本书,读完之后相信大家能有一个更加清楚和客观的认识,最后补充一句 INTEL和AMD都是X86/X64 CPU,他们是一样的。如果想了解CPU的硬件调度原理和实现,恐怕只能打进厂商内部了.还有,现在大家的计算机普遍都是 冯氏 计算机,我们对他的了解也是一个发表意见的重要理论依据.不要想当然说谁快谁慢,谢谢阅读.