高手请进,WinSock的IO模式问题。

Squall_zy 2010-06-03 04:32:42

《windows网络编程》英文版中说:



<table class="normal" align="center" cellspacing="0" cellpadding="0" tabstyle="DevStand table w/title">
<caption class="title"><b>Table 6-3</b> <i>I/O Method Performance Comparison </i></caption>

<thead>
<tr>
<td>
<p class="normal">

I/O
Model</p>
</td>

<td>
<p class="normal">

Attempted/Connected</p>
</td>

<td>
<p class="normal">
Memory Used (KB)</p>
</td>

<td>
<p class="normal">
Non-Paged Pool</p>
</td>

<td>
<p class="normal">

CPU Usage</p>
</td>

<td>
<p class="normal">


Threads</p>
</td>

<td>
<p class="normal">Throughput (Send/
Receive
Bytes Per
Second)</p>
</td>
</tr>
</thead>

<tbody>
<tr>
<td>
<p class="normal">Blocking</p>
</td>

<td>
<p class="normal">7000/
1008</p>
</td>

<td>
<p class="normal">25,632</p>
</td>

<td>
<p class="normal">36,121</p>
</td>

<td>
<p class="normal">10–60%</p>
</td>

<td>
<p class="normal">2016</p>
</td>

<td>
<p class="normal">2,198,148/
2,198,148</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/
1008</p>
</td>

<td>
<p class="normal">25,408</p>
</td>

<td>
<p class="normal">36,352</p>
</td>

<td>
<p class="normal">5–
40%</p>
</td>

<td>
<p class="normal">2016</p>
</td>

<td>
<p class="normal">404,227/
402,227</p>
</td>
</tr>

<tr>
<td>
<p class="normal">Non-
blocking</p>
</td>

<td>
<p class="normal">7000/
4011</p>
</td>

<td>
<p class="normal">4208</p>
</td>

<td>
<p class="normal">135,123</p>
</td>

<td>
<p class="normal">95–100%*</p>
</td>

<td>
<p class="normal">1</p>
</td>

<td>
<p class="normal">0/0</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/
5779</p>
</td>

<td>
<p class="normal">5224</p>
</td>

<td>
<p class="normal">156,260</p>
</td>

<td>
<p class="normal">95–100%*</p>
</td>

<td>
<p class="normal">1</p>
</td>

<td>
<p class="normal">0/0</p>
</td>
</tr>

<tr>
<td>
<p class="normal">WSA-
Async
Select</p>
</td>

<td>
<p class="normal">7000/
1956</p>
</td>

<td>
<p class="normal">3640</p>
</td>

<td>
<p class="normal">38,246</p>
</td>

<td>
<p class="normal">75–85%</p>
</td>

<td>
<p class="normal">3</p>
</td>

<td>
<p class="normal">1,610,204/
1,637,819</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/
4077</p>
</td>

<td>
<p class="normal">4884</p>
</td>

<td>
<p class="normal">42,992</p>
</td>

<td>
<p class="normal">90–100%</p>
</td>

<td>
<p class="normal">3</p>
</td>

<td>
<p class="normal">652,902/
652,902</p>
</td>
</tr>

<tr>
<td>
<p class="normal">WSA-
Event
Select</p>
</td>

<td>
<p class="normal">7000/
6999</p>
</td>

<td>
<p class="normal">10,502</p>
</td>

<td>
<p class="normal">36,402</p>
</td>

<td>
<p class="normal">65–85%</p>
</td>

<td>
<p class="normal">113</p>
</td>

<td>
<p class="normal">4,921,350/
5,186,297</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/
11,080</p>
</td>

<td>
<p class="normal">19,214</p>
</td>

<td>
<p class="normal">39,040</p>
</td>

<td>
<p class="normal">50–60%</p>
</td>

<td>
<p class="normal">192</p>
</td>

<td>
<p class="normal">3,217,493/
3,217,493</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">46,000/
45,933</p>
</td>

<td>
<p class="normal">37,392</p>
</td>

<td>
<p class="normal">121,624</p>
</td>

<td>
<p class="normal">80–90%</p>
</td>

<td>
<p class="normal">791</p>
</td>

<td>
<p class="normal">3,851,059/
3,851,059</p>
</td>
</tr>

<tr>
<td>
<p class="normal">Over-
lapped (events)</p>
</td>

<td>
<p class="normal">7000/
5558</p>
</td>

<td>
<p class="normal">21,844</p>
</td>

<td>
<p class="normal">34,944</p>
</td>

<td>
<p class="normal">65–85%</p>
</td>

<td>
<p class="normal">66</p>
</td>

<td>
<p class="normal">5,024,723/
4,095,644</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/12,000</p>
</td>

<td>
<p class="normal">60,576</p>
</td>

<td>
<p class="normal">48,060</p>
</td>

<td>
<p class="normal">35–45%</p>
</td>

<td>
<p class="normal">195</p>
</td>

<td>
<p class="normal">1,803,878/
1,803,878</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">49,000/48,997</p>
</td>

<td>
<p class="normal">241,208</p>
</td>

<td>
<p class="normal">155,480</p>
</td>

<td>
<p class="normal">85–95%</p>
</td>

<td>
<p class="normal">792</p>
</td>

<td>
<p class="normal">3,865,152/
3,834,511</p>
</td>
</tr>

<tr>
<td>
<p class="normal">Over-
lapped (comple-
tion port)</p>
</td>

<td>
<p class="normal">7000/
7000</p>
</td>

<td>
<p class="normal">36,160</p>
</td>

<td>
<p class="normal">31,128</p>
</td>

<td>
<p class="normal">40–50%</p>
</td>

<td>
<p class="normal">2</p>
</td>

<td>
<p class="normal">6,282,473/
3,893,507</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">12,000/12,000</p>
</td>

<td>
<p class="normal">59,256</p>
</td>

<td>
<p class="normal">38,862</p>
</td>

<td>
<p class="normal">40–50%</p>
</td>

<td>
<p class="normal">2</p>
</td>

<td>
<p class="normal">5,027,914/
5,027,095</p>
</td>
</tr>

<tr>
<td></td>

<td>
<p class="normal">50,000/49,997</p>
</td>

<td>
<p class="normal">242,272</p>
</td>

<td>
<p class="normal">148,192</p>
</td>

<td>
<p class="normal">55–65%</p>
</td>

<td>
<p class="normal">2</p>
</td>

<td>
<p class="normal">4,326,946/
4,326,496</p>
</td>
</tr>
</tbody>
</table>



这张表是WinSock各种IO模型下的服务端进程性能对比。
大家注意看“第2列”和“第6列”的值。
第2列,是客户端发起的连接数量、以及连接成功的数量。
第6列,是建立这么多连接所需要开辟的线程数。

从表中可以看出,EventSelect、Overlapped、CompletionPort这三种方式都比AsyncSelect(MFC使用的方式)强很多。
我个人喜欢使用EventSelect模型。因为WaitForMultiObject最多可监视64个核心对象的缘故,所以当TCP连接数增加时需要开辟更多的线程。

相比之后,我想问:
AsyncSelect、completionPort两种模式只用很少的线程数就能监视上千的连接的行为,WinSock是如何做到的?是来个大循环监视上千个Socket的事件么?还是在WinSock核心中开辟了很多线程做监视工作并将事件投递到服务进程中?
...全文
61 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Squall_zy 2010-06-03
  • 打赏
  • 举报
回复
谢谢3楼。

管理员能给我个权限把帖子整理下么?
Wenxy1 2010-06-03
  • 打赏
  • 举报
回复
需要我帮你编辑么?
Squall_zy 2010-06-03
  • 打赏
  • 举报
回复
操,刚才帖子发的真失败。看这图。
soswaidao 2010-06-03
  • 打赏
  • 举报
回复
线程池

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧