博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于socket通讯,如何才能高效?
阅读量:5309 次
发布时间:2019-06-14

本文共 1387 字,大约阅读时间需要 4 分钟。

视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440

网络通讯,一个不朽的话题,今天和一个做游戏的朋友(以前的同事聊天),他向我诉说了他的痛苦

他之前是做客户端的,无奈人力资源紧张,也开始搞服务器,他说自己的服务器总是不稳定,于是就

聊到了这个话题,在他现有的项目中,大概有1000个链接,每个连接每秒发最大发送四个数据包。而且

数据包的大小很小。服务器在做压力测试的时候,几乎啥都没有做,就是接到包,然后回复,其他的

任务业务逻辑也没有,连续测试4天,服务器就挂了。

  经过了解,他在开发过程中,用来很线程,他觉得服务器一定要多线程来接受数据才快。服务器为

那么多人提供服务,一定要多线程才可以,否则cpu会忙不过来,他的想法也是大多数人的想法,其实

这就错了。

  我们可以想像一下,网卡能处理多少数据,很多程度上受限制与网络速度,一但网络的速度确定了,

基本上就没有什么悬念了,例如一个100M带宽的网络,换算成大B,也就12M的样子,如果一个包大小

为1K,那么一秒中,我们处理的包数量为 12 * 1024 一万多个包,如果是一个包围100个字节,我们

需要处理的包12W(1024 × 1024 × 12  /100)的样子,成熟一点的网络底层通讯库都可以做到这一点,大可不必担心处理不过来。

  可以试想一下,使用一个单独的线程来接收这些数据包,和使用两个,或者多个线程处理接收这些

数据包,哪一个时间会更加快呢 ?答案肯定是一个线程接收的快。下面我们来分析下原因,为什么一个

线程会更快,先看单线程的情况:

    每次接收不需要做任何的互斥处理,接收就是了,相当于该线程只接受数据,其他的事情都没有做

但是如果是多线程接收:那么就要考虑互斥等问题,如果一个线程正在就诶收一个数据包,那么另外一个线程就不能

工作,等待第一个完成以后,才可以继续工作,cpu会花费更多的时间在线程的互斥上,实际上相当于一个线程在工作

而不是同时有两个或者多个线程同时工作,而且除了接收数据,还要兼顾线程切换工作。

  那有些人可能会说了,这个很不对,windows中的IOCP(完成端口)就是多线程工作的,而且建议使用

多线程,IOCP确实是多线程工作的,但不是接收数据,当我们调用IOCP的”GetQueuedCompletionStatus"函数的时候,其实数据已经

完成接收了,而我们在线程做到是做已经接收到的数据做什么处理,已经是业务的事情。

  而实际上,接收网络数据包的时间远比处理业务的时间要短,所以在我们接收到网络数据包以后,做到事情可以并行化

如果可以并行化,那么就大大的提高了应用成的性能,举一个简单的例子,当客户端要求计算一个数据的时候,这个计算

需要花费1秒钟,那么如果我们在接收线程中处理这个事情,其他的请求将被阻塞,如下图所示:

但如果是把计算任务放到另外的线程中,效果完全不一样(这个另外的线程,我们给他起个名称)叫业务线程,

当然可以用线程池的方式,这个就和IOCP(完成端口),是一回事情了。今天就说到这里,限于本人能力有限,

表述不正确的请见谅指正。

转载于:https://www.cnblogs.com/zhanglitong/p/3266810.html

你可能感兴趣的文章
Swift4.0复习扩展
查看>>
Swift编码总结6
查看>>
pic
查看>>
vim
查看>>
Oracle Inventory Management Application Program Interface ( APIs) (Doc ID 729998.1)
查看>>
hdu_1060_Leftmost Digit_201311071827-2
查看>>
移动前端—图片压缩上传实践
查看>>
Android:如何显示网络图片(转)
查看>>
JAVA和.NET开发过程中的一些不同
查看>>
微分方程数值解Euler法
查看>>
[快速幂]a^b
查看>>
基于流的自动化构建工具------gulp (简单配置)
查看>>
【基本优化实践】【1.3】最大内存参数限制
查看>>
oracle 安装(一)
查看>>
MyEclipse8.5 打开菜单栏的help->Software Updates子菜单
查看>>
Apache 阿帕奇 配置运行环境
查看>>
[转]ofstream/ifstream 文本/二进制 方式 读入/写出 数据方法
查看>>
【VIM】vimrc文件的基本设置
查看>>
【实习项目记录】(三)调整网络图片固定宽高
查看>>
Apache 使用localhost(127.0.0.1)可以访问,使用本机IP(局域网)不能访问
查看>>