也看到有资料说,同样在Linux上,使用reactor机制的网络库性能比使用Proactor机制的Asio性能好接近1/5,这个例子可能与题目无关,不过我在文中可能会做一些相关的分析。
系统I/O模型 可分为三类:
IOCP基于非阻塞异步模型,而epoll基于非阻塞同步模型。
参考 Hyunjik Bae, A game programmer since 1995 说的:
参考[4]比较了Windows IOCP和Linux epoll的性能,结论是如果使用Linux,应该使用支持RSS(multi-queue)的NIC,这样可以达到与IOCP类似的性能。
Boost.Asio为了兼容Windows和Linux,在Linux上用epoll和select去模拟proactor模式,影响了它的效率和实现复杂度。其效率不及使用原生I/O机制的其它实现为Reactor模式的网络库。
引用来自参考[3]的话:
[1] Why doesn't Linux have a system like IOCP or Rio does? , 2014.
[2] 两种高性能I/O设计模式(Reactor/Proactor)的比较 - 文章 - 伯乐在线
[3] Practical difference between epoll and Windows IO Completion Ports (IOCP)
[4] Windows IOCP vs Linux EPOLL Performance Comparison
就给你分析两种组件的用法吧,推荐使用远程服务支持库,否则,你需要自己把数据分成小块,即分包发送。1.服务器组件是基于连接的网络数据交换的服务方组件,用作在指定端口监视来自客户方的数据。需要采用一台电脑作为服务器使用,其他电脑作为客户机,使用上较为方便,一次最大可发送4380个字节,超过这个字节数,必须使用分包的办法,在接收的用户处再还原包。
由于可扩展性非常差,即不支持多用户,多线程,大文件传输入,在用户数量多,数据量大的情况下会产生紊乱,不建议大家用于商业程序中。
2.远程服务支持库
该支持库提供对服务器端程序和客户端程序的支持。客户端发出请求,服务器端接受到客户端的请求后,就会执行事先设置好的触发函数,在触发函数的方法中就可以分析用户端的请求,然后计算出结果发回给相应的客户端。该支持库的服务器模型支持多用户多任务,内部采用多个线程池协调同步共同完成任务数据的发送接收。本支持库一般可以使用在网络服务中间件,远程调用服务器,分布式计算等等程序的开发过程中。
这个支持库是本书重点推荐的一个支持库。支持多用户,多任务,多线程,大文件传送。支持库内部已将多用户计划任务作为线程池保护起来,直接传输完成为止。
应用上极为广泛,如:远程监视控制,远程数据服务等。
这是个多线程的,使用了4个线程池。
建议你使用同步连接模式,这样,客户的每一次请求处理完成后才顺序执行下一个请求,会有一个顺序性。如果你使用异步传输模式 快速的发向服务器 实际上每个发送来的信息都作为一个请求放到了请求列队中。
QQ群:132157144 回答来自:百度易难为易团队
核心作者: D10Svn检出目录是
diocp-read-only
总目录说明
Source
/Utils//FastMM等一下文件<工具类>
/WinSock2 //WinSock2的申明文件
/IOCP //IOCP核心文件
/ClientSocket //自己写的一个客户端Socket类
Demos//演示实例文件夹
/Common //实例中(编码和解码器)用的一些公共类,和工具类
/IOCPCoder//我编写的JSonStream对象的编码和解码器。
/Echo //循环测试
Demo所在目录
diocp-read-only/Demos
子目录里面demo有
------------------------------------------------------
基础服务类
CommonJSONStream,SuperObject等单元
IOCPCoder基于indy,ics,http的解码,编码,并有网络字节顺序的helper类
UniDACPool UniDac相关工具类
真正的演示
-----------------------------------------------------
ADOPool Ado连接池
ADOQuery Ado MDB数据库查询例子
CoderDemo 编码器,解码器说明,自己编写了一个类的,以及其解码器 ,编码器
DBPoolDemo unidac + Indy10新版的demo
Echo 简单回显的demo ,Indy10.x做客户端,ICS版本也有,TD10ClientSocket也有
EchoTesterindy10.x的客户端测试
FileServer 客户端也是indy10.x
idTester 用indy10.x做压力测试
三层数据提取和保存 基于TD10ClientSocket的测试
本文编写: steven
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)