这篇文章解答了我心中的疑问,那就是操作系统会自动调度cpu资源来处理多进程,多线程的并发。
早在上世纪90年代末,就有众多业界人士呼吁用CMP(
单芯片多处理器)技术来替代复杂性较高的
单线程CPU。IBM、惠普、Sun等高端服务器厂商,更是相继推出了多核
服务器CPU。不过,由于服务器价格高、应用面窄,并未引起大众广泛的注意。直到AMD抢先手推出
64位处理器后,英特尔才想起利用“多核”这一武器进行“帝国反击战”。
2005年4月,英特尔仓促推出简单封装双核的奔腾D和奔腾四至尊版840。AMD在之后也发布了双核皓龙(Opteron)和
速龙(Athlon) 64 X2和处理器。但真正的
“双核元年”,则被认为是2006年。这一年的7月23日,英特尔基于
酷睿(Core)
架构的处理器正式发布。
双核的优势不是频率,而是对付同时处理多件事情。一个核心理论上同时只能干一件事,比如你同时在后台BT下载,前台一边看电影一边拷贝文件一边联QQ……,这么多程序同时需要CPU来响应,怎么办?靠操作系统! window本身就是多线程操作系统(DOS就是单线程系统,dos下2核4核和单核没区别,处理一个任务时必须停下来等待处理结束才能干下一件事),它可以把每个处理任务划分为多“份”(一个任务可以由多个进程来实现,把每个进程又分为多个线程,然后由操作系统协调分配多核来处理排队的线程,最后把处理结果合并),多个处理任务按顺序排成队列,这样单核心的CPU可以一次处理一“份”,轮流处理每个程序的“份”,这样你感觉就是CPU同时在干几件事了。但如果CPU不够强劲,同时排队等待处理的东西太多了,你就会感觉系统在等待,有延时,反应慢等等症状。再或者某个程序出现错误,死机了,很可能造成后面排队的其他任务都在那里干等,造成系统无反应的情况,按热启键都没反应。理论上如果现在有颗6G频率的单核CPU,单论处理性能应该与1个3G双核近似,甚至更高一些,因为目前双核比单核也就快不到2倍。 原本计算机一直以单核心的工作频率作为性能的衡量,之所以放弃单核是因为目前的技术水平令单核性能继续提升遇到了瓶颈,4G P4的夭折让依靠频率提升性能的路子走进死胡同,不得已改走多核心路线,以核心数量来弥补处理能力的不足。不过慢慢的这些多核心的频率又开始奔3G去了,随着45nm的出现,双核上4G应该可以想象,所以一方面每个核心的性能还在发展,另一方面多核心集成的手段双管齐下,这样CPU的性能可以迅速提升,继续保持摩尔定律。
多核CPU就是基板上集成有多个单核CPU,早期PD双核需要北桥来控制分配任务,核心之间存在抢二级缓存的情况,后期酷睿自己集成了任务分配系统(硬件上),再搭配操作系统(软件上)就能真正同时开工,2个核心同时处理2“份”任务,速度快了,万一1个核心死机,起码另一个U还可以继续处理关机、关闭软件等任务。较早的操作系统如XP等需要装双核或多核补丁,能更好发挥性能或更稳定,Vistia下就不需要。 目前几乎所有的程序在编写时是按单核心CPU写的(多核心程序优化对程序员来说是个噩梦,目前好像还没有合适的编程软件能让程序员轻松编写针对多核心的程序),因此对多核的利用率不是很高,分配任务时,往往1个核心满负荷,另一个还有空闲(留些空闲也对,要应付随时发生的其它命令)。一般2核心性能也就比单核心高60~70%甚至更低。 4核或者将来的8核说白了还是多个核心独自处理各自的“份”,不过人多力量大,速度快,响应时间短,不易死机。当然耗电、协调性都会是个考验。 补充: 原本有个说法(有阵子我自己就持这观点):“目前的软件都是为单核心编写的,多核CPU处理起来也没什么优势。” 经过分析我们可以得知,参与任务分配的主角一是程序自己,二是操作系统,即使如单任务的SuperPI,在双核下成绩也要比同频率的单核快不少,这就是事实证明。理论分析:单线程程序很傻,不知道有2个CPU在前面等着,所以发出的请求应该也是针对单核心的,但操作系统自动将调用请求分配给了2个CPU,并在处理结束后将结果合并,所以单核心程序也能享受到多核的“照顾”。尽管操作系统分配的可能不完美,但毕竟比单CPU要快。 如果程序自己又对多线程处理进行了优化(重新编写),那么就更完美了,可以达到2倍水平,对于这点5楼的朋友已经能举出具体的例子了。非常感谢。 再推测一下,根据上面的分析,2G双核应该比2G单核快近2倍,那么2G的4核应该比2G的双核快近2倍!如果有4G的双核,那么应该和2G的4核性能近似。
对于多核CPU,优化操作系统任务调度算法是保证效率的关键。一般任务调度算法有全局队列调度和局部队列调度。前者是指操作系统维护一个全局的任务等待队列,当系统中有一个CPU核心空闲时,操作系统就从全局任务等待队列中选取就绪任务开始在此核心上执行。这种方法的优点是CPU核心利用率较高。后者是指操作系统为每个CPU内核维护一个局部的任务等待队列,当系统中有一个CPU内核空闲时,便从该核心的任务等待队列中选取恰当的任务执行,这种方法的优点是任务基本上无需在多个CPU核心间切换,有利于提高CPU核心局部Cache命中率。目前多数多核CPU操作系统采用的是基于全局队列的任务调度算法