操作系统与多核处理器

早在上世纪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操作系统采用的是基于全局队列的任务调度算法

 

时间: 2024-08-05 02:50:57

操作系统与多核处理器的相关文章

多核处理器基础SMP&AMP&BMP

多核处理器也称片上多核处理器(Chip Multi-Processor,CMP). 1.多核处理器的流行 多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产生过多热量且无法带来相应性能改善,但CPU性能需求大于CPU发展速度.尽管增加流水线提高频率,但缓存增加和漏电流控制不力造成功率大幅增加,性能反而不如之前低频率的CPU.功率增加,散热问题也严重了,风冷已经不能解决问题了. 那么新技术必须出现-多核处理器.早在1996年就有第一款多核CPU原型H

ARM多核处理器启动过程分析

说明: 该流程图按照代码执行时间顺序划分为4部分: 1.     Bootloader在图片上半部,最先启动: 2.     Kernel在图片下半部,由bootloader引导启动: 3.CPU0执行流程在图片左半部,bootloader代码会进行判断,先行启动CPU0: 4.  Secondary CPUs在图片右半部,由CPU唤醒 具体启动流程如下: 1.     在bootloader启动时,会判断执行代码的是否为CPU0,如果不是,则执行wfe等待CPU0发出sev指令唤醒.如果是CP

多核处理器的由来

多核处理器的由来-在21世纪初,能量强power wall无法再想以前一样增加CPU的时钟频率(因为功耗太大)-所以使用了多个小处理器核core取代单个大处理器来提高性能-每个完整的处理器都可以独立的执行程序 P = fCv^2f = 时钟频率C = 电容v = 电压 电容C类似于总面积,所以只要总面积不变,能耗就不会变,然后按照摩尔定律指数型的下降,性能就会提升

C#多线程 为多核处理器而生的多线程方法Parallel.For和Parallel.ForEach

1.在.net4.0中,有了一个新的类库:任务并行库.它极大地简化了并行编程且内容丰富.这里仅介绍其中最简单的 Parallel.For循环和Parallel.ForEach循环.它们位于System.Threading.Tasks命名空间.它们是两个方法,这两个方法将迭代分别放在不同的处理器上并行处理,如果机器是多处理器或多核处理器,这样就会使性能大大提升. 2.例子用Parallel.For做计算,为数组赋值并打印,用Parallel.ForEach计算字符串数组每个元素的长度,运行结果:

[py]你真的了解多核处理器吗? 了解多线程

你真的了解多核处理器吗? 1.双核≠双性能 多核不一定会使你的手机或电脑速度更快,但它将提高你的PC的整体性能,这是一个有所不同的细微的技术特色.多核处理器的性能提升并不是简单CPU核心的倍数,因为受到两(多)个核之间共享资源的拖累.比如双核性能只是单核的1.4-1.8倍,实际情况取决于具体的应用. 一个核拼命干活,拼命转啊转啊,其他核在看,最后温度不断上升然后蓝屏了.... 上图是个笑话,不过你可以用任务管理器可以看到并不是每个核的负载时均匀分配的. 这是为什么一个核转啊转啊,最后蓝屏的原因.

[转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此

AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018-11-21 15:25 收藏 分享 从2017年到现在,不到两年时间里X86处理器行业的变化要比过去五年都要大,标志性事件就是AMD重返高性能处理器市场,除了在桌面处理器力推8核16线程处理器之外,在服务器市场上还推出了32核64线程处理器,前不久更推出了7nm的64核128线程"罗马"处

Dekker算法在多核处理器下的失效

Dekker algorithm是一种著名的并发编程的算法,Dekker算法的核心部分是一组对称的代码来访问一组共享变量,使得两个线程不可能同时进入临界区(只要cpu内存模型是遵循顺序一致性的),从而达到线程同步的目的.以下是该算法的一种实现: static volatile int flag1 = 0; static volatile int flag2 = 0; static volatile int turn = 1; static volatile int gSharedCounter

使用多核处理器处理任务

1 //记录开始处理的时间 2 Stopwatch paddingTime = new Stopwatch(); 3 paddingTime.Start(); 4 JobHelper jobHelper = new JobHelper(); 5 int orderCount = jobHelper.GetJobCount(); 6 mutex=new Mutex(false,"CNBlogs.EmulationSystem"); 7 if (!mutex.WaitOne(0,false

intel DPDK在多核处理器平台上的安装与配置

一.DPDK系统需求: 1.需要的编译工具(ubuntu12.04 LTS均符合要求,可以不检查) GNU make; cmp, sed, grep, arch; gcc;libc库文件(glibc-devel fedora;libc ubuntu) kernel-devel(fedora);kernel-dev(ubuntu) python 2.6 or 2.7 2.运行条件(关键在于kernel的配置,其他均符合条件) kernel-version >=2.6.33 :查看命令 uname