<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; normalnotebook</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/normalnotebook/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>铁路与多核多线程</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/05/05/400001540/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/05/05/400001540/#comments</comments>
		<pubDate>Tue, 05 May 2009 08:30:35 +0000</pubDate>
		<dc:creator>normalnotebook</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/05/05/400001540/</guid>
		<description><![CDATA[多核多线程已经成为当前一个时髦的话题，早在2005年C++大师Herb Sutter就说过免费的午餐已经结束，并发编程的时代已经来临。从接触第一个多线程项目以来，已经是第三个年头了，一直想把这几年的点点滴滴写成文章，让刚接触的人少走弯路，这便是我写这篇系列文章的初衷。 如何理解多核多线程这些概念呢？ 在自然世界中，总有那么一些事物是类似的。如果我们加以抽象和归纳，就可以得出相同或者相类似的结论，比如铁路系统和多核多线程就有相似之处。 对于任何一名出门在外的人来说，春节能买张回家的火车票，不能不说是人生的一大幸事。相信大家在排队买票的时候，曾经都抱怨过，怎么不多增开几列火车，让大家早点回家呢？当这种想法开始在大脑中萌发时，证明您已经拥有了多线程的思想。对于相同的出发地和目的地，通过增开列车的方法来提高运输效率，就相当于在一个进程中采用多线程的方法来提高程序的吞吐率。 从成本和资源利用率的角度考虑，不可能为不同的目的地修建单独的铁路，而会共享相关路段。当不同列车需要同时使用同一路段时，就会造成道路的竞争，交通一旦拥塞，效率开始变的低下和事故频发。为了解决这个问题，信号灯开始出现在关键岔口上，只有当列车收到允许通过的信息后，才能继续前行。如果从多线程的角度来看待道路竞争引发的问题，可以认为是线程的同步问题。在多线程程序中，可以利用各种锁或者信号量等同步手段来解决资源冲突的矛盾，只有解决了资源冲突问题，才能保证程序的正确性。 是不是多增开几列火车，就可以缓解买票难的问题呢（这里不讨论各方利益的问题）？临客便开始出现在人们的视野中。 如果临客和其他列车拥有相同的待遇，在关键路径上，按照FIFO的策略，排队一一通过，就有可能造成大量的火车晚点，久而久之，最终造成整个铁路系统的瘫痪。于是引入了优先级的概念，一旦发生资源冲突时，临客就停下来到旁边歇歇，让道给高优先级的大佬们（D/Z/T/K/N等开头的火车）。 从操作系统的角度来观察临客的解决方案，这个过程相当于多线程中的线程调度，让不同的线程拥有不同的优先级和调度策略，来提高程序的整体效率。 解决了临客的调度问题，真的可以解决买票难的问题吗？不能，于是新的方案—— 大修铁路——又被提上了日程， 减少关键资源的冲突，让不同目的地的火车在不同铁路线路上驰骋。这种方法就相当于我们今天谈论的多核技术，让不同功能的进程在不同的核上运行，或者让同一进程的不同功能的线程运行在不同的核上。 将多核多线程与实际生活中的例子进行类比，多核多线程显得并不神秘。它只是用来提高程序运行效率的一种手段，暂时还不会打破现有的编程模式。]]></description>
			<content:encoded><![CDATA[<p>多核多线程已经成为当前一个时髦的话题，早在2005年C++大师Herb Sutter就说过免费的午餐已经结束，并发编程的时代已经来临。从接触第一个多线程项目以来，已经是第三个年头了，一直想把这几年的点点滴滴写成文章，让刚接触的人少走弯路，这便是我写这篇系列文章的初衷。</p>
<p>如何理解多核多线程这些概念呢？</p>
<p>在自然世界中，总有那么一些事物是类似的。如果我们加以抽象和归纳，就可以得出相同或者相类似的结论，比如铁路系统和多核多线程就有相似之处。</p>
<p>对于任何一名出门在外的人来说，春节能买张回家的火车票，不能不说是人生的一大幸事。相信大家在排队买票的时候，曾经都抱怨过，怎么不多增开几列火车，让大家早点回家呢？当这种想法开始在大脑中萌发时，证明您已经拥有了多线程的思想。对于相同的出发地和目的地，通过增开列车的方法来提高运输效率，就相当于在一个进程中采用多线程的方法来提高程序的吞吐率。</p>
<p>从成本和资源利用率的角度考虑，不可能为不同的目的地修建单独的铁路，而会共享相关路段。当不同列车需要同时使用同一路段时，就会造成道路的竞争，交通一旦拥塞，效率开始变的低下和事故频发。为了解决这个问题，信号灯开始出现在关键岔口上，只有当列车收到允许通过的信息后，才能继续前行。如果从多线程的角度来看待道路竞争引发的问题，可以认为是线程的同步问题。在多线程程序中，可以利用各种锁或者信号量等同步手段来解决资源冲突的矛盾，只有解决了资源冲突问题，才能保证程序的正确性。</p>
<p>是不是多增开几列火车，就可以缓解买票难的问题呢（这里不讨论各方利益的问题）？临客便开始出现在人们的视野中。 如果临客和其他列车拥有相同的待遇，在关键路径上，按照FIFO的策略，排队一一通过，就有可能造成大量的火车晚点，久而久之，最终造成整个铁路系统的瘫痪。于是引入了优先级的概念，一旦发生资源冲突时，临客就停下来到旁边歇歇，让道给高优先级的大佬们（D/Z/T/K/N等开头的火车）。 从操作系统的角度来观察临客的解决方案，这个过程相当于多线程中的线程调度，让不同的线程拥有不同的优先级和调度策略，来提高程序的整体效率。</p>
<p>解决了临客的调度问题，真的可以解决买票难的问题吗？不能，于是新的方案—— 大修铁路——又被提上了日程， 减少关键资源的冲突，让不同目的地的火车在不同铁路线路上驰骋。这种方法就相当于我们今天谈论的多核技术，让不同功能的进程在不同的核上运行，或者让同一进程的不同功能的线程运行在不同的核上。</p>
<p>将多核多线程与实际生活中的例子进行类比，多核多线程显得并不神秘。它只是用来提高程序运行效率的一种手段，暂时还不会打破现有的编程模式。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/05/05/400001540/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

