﻿<?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++博客-oldworm-随笔分类-网络</title><link>http://www.cppblog.com/oldworm/category/15949.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 01 Feb 2011 03:04:40 GMT</lastBuildDate><pubDate>Tue, 01 Feb 2011 03:04:40 GMT</pubDate><ttl>60</ttl><item><title>Windows下两种iocp实现的差距</title><link>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Tue, 01 Feb 2011 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139662.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139662.html</trackback:ping><description><![CDATA[
<p class="MsoNormal"><span lang="EN-US">Windows</span><span style="font-family:
宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">下两种</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">实现的差距</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">之前几天说过，因为经典</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">实现（以下简称经典实现）多个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程绑定在一个</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上，这样内部管理了</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">队列的处理，内部决定是不是需要线程切换，我上次修改的一个版本（以下简称实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">），用了多个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，每个</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">队列仅绑定一个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，一组用户共享一个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，这和经典的多线程</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">模型的做法是很相似的，这样每个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程是可以独立控制了，但理论上这种做法没有发挥</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">自动管理线程切换的优势，昨晚没事用这两种实现分别做了个</span><span lang="EN-US">echoserver</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">测试了一下，这两套实现代码仅</span><span lang="EN-US">40</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">行左右不同，其他完全一样，效果真的是差很多，测试仅用一个进程模拟了</span><span lang="EN-US">4000</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个客户端，每秒</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个包，先看实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的，</span><span lang="EN-US">cpu</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">占</span><span lang="EN-US">14%</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">accept</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个主线程，其他线程都没干活闲置。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles</span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">14</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">40088k</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">8</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">4236</span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">再看经典实现，</span><span lang="EN-US">cpu</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">几乎一直是</span><span lang="EN-US">0%</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">accept</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">也是在</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程里面处理，其他跟实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">一样，测试客户端也一样。</span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">0<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">39244k<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">7<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">4336<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">说实话，在测试之前我也没想到有这么大的差距，经典实现就是</span><span lang="EN-US">1.2w</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个连接连上来还是这样，就是内存占用多一点：</span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">0<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">112068k<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">7<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">12280<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">习惯上总有人喜欢拿</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">和</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">来对比，我到现在也没看到真正公平的对比，就算是相对公平的也没见到，因为在我看来，要对比硬件应该是一样的，</span><span lang="EN-US">os</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">都应该是最新的，最重要的是，</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">端程序应该都是发挥了各自优势的，如果拿我这里的实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">去代表</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的水平和</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">对比，势必造成比</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">差很多的结果，然而这显然是不正确的。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US">epoll</span><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">经典多线程模式实际实现和实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">很相似，理论上也有类似的线程切换问题，不知道效率怎样。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-02-01 10:48 <a href="http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一套网络框架的杯具</title><link>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Wed, 26 Jan 2011 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139352.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139352.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139352.html</trackback:ping><description><![CDATA[
<p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">一套网络框架的杯具</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">之前设计了一套网络框架，持续改进了很多年，使用在很多项目上，综合效率还行，也很稳定，一直以来对这套东西信心满满，总以为啥问题都好解决，但最近就有个需求让我选择还是改了下这个框架。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">之前的框架是这样的，可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程，可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个同步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个异步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个</span><span lang="EN-US" style="line-height: 21px; ">timer</span><span style="line-height: 21px; ">线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个异步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">cpu</span><span style="line-height: 21px; ">个），每组可独立受控，每组可支持自定义消息，可支持</span><span lang="EN-US" style="line-height: 21px; ">timer</span><span style="line-height: 21px; ">，一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个如果</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">大于</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">则无法直接给这组里面的特定线程发消息，只能给一组发消息，这个组里面会选择某个合适的线程处理这个消息，这也是</span><span lang="EN-US" style="line-height: 21px; ">iocp</span><span style="line-height: 21px; ">高效和典型的用法了，但这也正是问题的结症所在。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 21px; ">Linux</span><span style="line-height: 21px; ">下的多线程服务器更常见的做法跟这个不大相似，一般都是将某些</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">分配到某些线程</span><span lang="EN-US" style="line-height: 21px; ">epoll</span><span style="line-height: 21px; ">，分好之后就是固定的，不再变化，跟</span><span lang="EN-US" style="line-height: 21px; ">Iocp</span><span style="line-height: 21px; ">将</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">绑定到一组线程的做法不同，由于某个</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">直接绑定到了某个线程，所以有些问题就变得简单了，如同一个连接的在同一个线程内消息进行了同步，要跟</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程绑定私有化数据也简单了，而且每个线程可独立受控，所以很容易实现一组</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">各自挂</span><span lang="EN-US" style="line-height: 21px; ">tls</span><span style="line-height: 21px; ">（线程局部存储）数据，而我现在做的这套框架就是这方面不好控了，其实也很难说这两种意义上的框架到底谁更优，如用在</span><span lang="EN-US" style="line-height: 21px; ">web</span><span style="line-height: 21px; ">型应用上这种</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">被一组</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程管理的模式很方便效率也高，但我现在的需求需要某个</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">使用线程相关数据，以避免数据之间的锁，我用内存换时间，由于在原来的框架上增逻辑难以实现可直接控制</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程的框架的，所以花了一个晚上重新改写了一套框架，在原来</span><span lang="EN-US" style="line-height: 21px; ">iocpframe</span><span style="line-height: 21px; ">的基础上派生了一组带</span><span lang="EN-US" style="line-height: 21px; ">2</span><span style="line-height: 21px; ">名称的类，除替换类名之外只修改了几十行代码就做好了，总的来说花的时间还是比较少的。修改后</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程一组，但独立受控，外部可对这组线程中的某一个直接发消息，基本满足了需求，现在要给每个</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程绑定私有数据并触发特定消息比之前简单多了，而且绝对无锁。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 21px; ">&nbsp;</span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-26 16:14 <a href="http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>