[杂烩]Windows IOCP与Linux的epoll机制对比

[杂烩]Windows IOCP与Linux的epoll机制对比,第1张

看到一些资料,说Windows的IOCP后发制人,比Linux的epoll优越很多。那么优势到底在哪里?如何选择Linux或Windows作为服务器呢?

也看到有资料说,同样在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 回答来自:百度易难为易团队

核心作者: D10

Svn检出目录是

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/286552.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存