﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-clj</title><link>http://www.cppblog.com/clj/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:07:17 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:07:17 GMT</pubDate><ttl>60</ttl><item><title>memcached内存池测试</title><link>http://www.cppblog.com/clj/archive/2009/09/17/96478.html</link><dc:creator>clj</dc:creator><author>clj</author><pubDate>Wed, 16 Sep 2009 16:06:00 GMT</pubDate><guid>http://www.cppblog.com/clj/archive/2009/09/17/96478.html</guid><wfw:comment>http://www.cppblog.com/clj/comments/96478.html</wfw:comment><comments>http://www.cppblog.com/clj/archive/2009/09/17/96478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/clj/comments/commentRss/96478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clj/services/trackbacks/96478.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">&nbsp;</p>
<a href="" href_cetemp><span style="FONT-SIZE: 10pt">memcached修改后的内存池<br><br></span></a><span style="FONT-SIZE: 10pt">修改了memcached内存池的源代码。支持单个size的slab的分配，以及多级slab分配。&nbsp;<br><br>以下是测试代码：<br></span>&nbsp;
<div style="FONT-SIZE: 10pt"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;"slabs.h"<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&lt;stdio.h&gt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&lt;sys/time.h&gt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&lt;stdlib.h&gt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;item<br><img id=Codehighlighter1_100_151_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_151_Open_Text.style.display='none'; Codehighlighter1_100_151_Closed_Image.style.display='inline'; Codehighlighter1_100_151_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_100_151_Closed_Image onclick="this.style.display='none'; Codehighlighter1_100_151_Closed_Text.style.display='none'; Codehighlighter1_100_151_Open_Image.style.display='inline'; Codehighlighter1_100_151_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;z[248];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;zz[1324];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}item;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>static&nbsp;int&nbsp;xx&nbsp;=&nbsp;0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>static&nbsp;double&nbsp;yy&nbsp;=&nbsp;1.0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>static&nbsp;item&nbsp;*item_list[1000];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>long&nbsp;time_interval(&nbsp;struct&nbsp;timeval&nbsp;tv&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>int&nbsp;main()<br><img id=Codehighlighter1_286_1002_Open_Image onclick="this.style.display='none'; Codehighlighter1_286_1002_Open_Text.style.display='none'; Codehighlighter1_286_1002_Closed_Image.style.display='inline'; Codehighlighter1_286_1002_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_286_1002_Closed_Image onclick="this.style.display='none'; Codehighlighter1_286_1002_Closed_Text.style.display='none'; Codehighlighter1_286_1002_Open_Image.style.display='inline'; Codehighlighter1_286_1002_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;&nbsp;&nbsp;&nbsp;timeval&nbsp;t_start;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&amp;t_start,&nbsp;NULL);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;slabs_init(&nbsp;1024*1024*100,&nbsp;1.0,&nbsp;sizeof(item),&nbsp;1&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;100000;&nbsp;++i)<br><img id=Codehighlighter1_432_909_Open_Image onclick="this.style.display='none'; Codehighlighter1_432_909_Open_Text.style.display='none'; Codehighlighter1_432_909_Closed_Image.style.display='inline'; Codehighlighter1_432_909_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_432_909_Closed_Image onclick="this.style.display='none'; Codehighlighter1_432_909_Closed_Text.style.display='none'; Codehighlighter1_432_909_Open_Image.style.display='inline'; Codehighlighter1_432_909_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;1000;&nbsp;++j)<br><img id=Codehighlighter1_468_767_Open_Image onclick="this.style.display='none'; Codehighlighter1_468_767_Open_Text.style.display='none'; Codehighlighter1_468_767_Closed_Image.style.display='inline'; Codehighlighter1_468_767_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_468_767_Closed_Image onclick="this.style.display='none'; Codehighlighter1_468_767_Closed_Text.style.display='none'; Codehighlighter1_468_767_Open_Image.style.display='inline'; Codehighlighter1_468_767_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//item&nbsp;*&nbsp;pItem&nbsp;=&nbsp;(item&nbsp;*)do_slabs_alloc(&nbsp;sizeof(item),&nbsp;slabs_clsid(sizeof(item)&nbsp;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;*&nbsp;pItem&nbsp;=&nbsp;(item&nbsp;*)malloc(sizeof(item));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pItem&nbsp;==&nbsp;NULL)<br><img id=Codehighlighter1_632_691_Open_Image onclick="this.style.display='none'; Codehighlighter1_632_691_Open_Text.style.display='none'; Codehighlighter1_632_691_Closed_Image.style.display='inline'; Codehighlighter1_632_691_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_632_691_Closed_Image onclick="this.style.display='none'; Codehighlighter1_632_691_Closed_Text.style.display='none'; Codehighlighter1_632_691_Open_Image.style.display='inline'; Codehighlighter1_632_691_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("do_slabs_alloc&nbsp;error\n");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pItem-&gt;x&nbsp;=&nbsp;++xx;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pItem-&gt;y&nbsp;=&nbsp;yy&nbsp;+&nbsp;1.0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item_list[j]&nbsp;=&nbsp;pItem;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;1000;&nbsp;++k)<br><img id=Codehighlighter1_803_906_Open_Image onclick="this.style.display='none'; Codehighlighter1_803_906_Open_Text.style.display='none'; Codehighlighter1_803_906_Closed_Image.style.display='inline'; Codehighlighter1_803_906_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_803_906_Closed_Image onclick="this.style.display='none'; Codehighlighter1_803_906_Closed_Text.style.display='none'; Codehighlighter1_803_906_Open_Image.style.display='inline'; Codehighlighter1_803_906_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do_slabs_free(item_list[k],&nbsp;sizeof(item),&nbsp;slabs_clsid(sizeof(item)&nbsp;));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(item_list[k]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;int&nbsp;tm&nbsp;=&nbsp;time_interval(&nbsp;t_start);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf("\ntime&nbsp;used&nbsp;:%d\n",&nbsp;tm);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>long&nbsp;time_interval(&nbsp;struct&nbsp;timeval&nbsp;tv&nbsp;)<br><img id=Codehighlighter1_1045_1205_Open_Image onclick="this.style.display='none'; Codehighlighter1_1045_1205_Open_Text.style.display='none'; Codehighlighter1_1045_1205_Closed_Image.style.display='inline'; Codehighlighter1_1045_1205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1045_1205_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1045_1205_Closed_Text.style.display='none'; Codehighlighter1_1045_1205_Open_Image.style.display='inline'; Codehighlighter1_1045_1205_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;timeval&nbsp;now;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&amp;now,&nbsp;NULL);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;sec&nbsp;=&nbsp;now.tv_sec&nbsp;-&nbsp;tv.tv_sec;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;usec&nbsp;=&nbsp;now.tv_usec&nbsp;-&nbsp;tv.tv_usec;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sec&nbsp;*&nbsp;1000&nbsp;+&nbsp;usec&nbsp;/&nbsp;1000;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<br><span style="FONT-SIZE: 10pt"><strong style="COLOR: #ff0000">测试结果：</strong><br><br>对于使用malloc, free和do_slabs_alloc，do_slabs_free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>1）当外层循环10000次时，分别耗时6992ms,547ms<br>2）当外层循环100000次时，分别耗时69665ms,5442ms<br><br>改变item的结构：</span><br>
<div style="FONT-SIZE: 10pt"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;item<br><img id=Codehighlighter1_20_64_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_64_Open_Text.style.display='none'; Codehighlighter1_20_64_Closed_Image.style.display='inline'; Codehighlighter1_20_64_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_20_64_Closed_Image onclick="this.style.display='none'; Codehighlighter1_20_64_Closed_Text.style.display='none'; Codehighlighter1_20_64_Open_Image.style.display='inline'; Codehighlighter1_20_64_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;z[248];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}item;</div>
<br><span style="FONT-SIZE: 10pt">1）当外层循环10000次时，分别耗时1536ms,535ms<br>2）当外层循环100000次时，分别耗时15414ms,5352ms<br><br>综上：系统的malloc函数对于size很敏感，如果size较小，那么内存分配的时间需要很长，因为它需要计算，并且可能操作多个链表(malloc函数自己也对内存分级)。而内存池则对大小不敏感，对于大内存块和小内存块来说速度基本上同样快。</span> 
<img src ="http://www.cppblog.com/clj/aggbug/96478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clj/" target="_blank">clj</a> 2009-09-17 00:06 <a href="http://www.cppblog.com/clj/archive/2009/09/17/96478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同步、异步、阻塞、非阻塞解释</title><link>http://www.cppblog.com/clj/archive/2009/09/11/95871.html</link><dc:creator>clj</dc:creator><author>clj</author><pubDate>Thu, 10 Sep 2009 16:32:00 GMT</pubDate><guid>http://www.cppblog.com/clj/archive/2009/09/11/95871.html</guid><wfw:comment>http://www.cppblog.com/clj/comments/95871.html</wfw:comment><comments>http://www.cppblog.com/clj/archive/2009/09/11/95871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/clj/comments/commentRss/95871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clj/services/trackbacks/95871.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">举一个例子来说明。<br><br>父亲叫儿子去请叔叔来下棋，儿子需要开车去叔叔家。<br><br><strong>同步</strong>：父亲在家什么事也不能做，在家等着。叔叔回来了儿子敲门<span>通知</span>父亲。<br><strong>异步</strong>：父亲有一大堆其它事情要忙，打发儿子完儿子后接着忙一大堆其它的事情，等儿子回来了敲门<span>通知</span>父亲。<br><br>上面的同步和异步都使用到了非阻塞操作。<br>同步和异步的区别就在于：同步必须等到操作的结果，否则其它事都做不了；异步体现在操作发起后不用等待的结果，接着做其它事情，等操作结果出来了会受到通知并作相应处理。<br><br><br>Douglas博士的解释如下：</p>
<p style="FONT-SIZE: 10pt">　AIO is "asynchronous I/O", i.e., the operation is invoked asynchronously and control returns to the client while the OS kernel processes the I/O request.?When the operation completes there is some mechanism for the client to retrieve the results.</p>
<p style="FONT-SIZE: 10pt">　Non-blocking I/O tries an operation (such as a read() or write()) and if it the operation would block (e.g., due to flow control on a TCP connection or due to lack of data in a socket), the call returns -1 and sets errno to EWOULDBLOCK.</p>
<img src ="http://www.cppblog.com/clj/aggbug/95871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clj/" target="_blank">clj</a> 2009-09-11 00:32 <a href="http://www.cppblog.com/clj/archive/2009/09/11/95871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>