带epoll和线程的套接字服务器
我正尝试在C中创建一个套接字服务器,用于协作实时编辑器http://en.wikipedia.org/wiki/Collaborative_real-time_editor,但我不知道什么是最好的服务器体系结构。
首先,我试图使用套接字服务器的select,但在此之后,我正在阅读epoll,现在我认为epoll是最好的选择,因为客户端会发送每个字母,用户将在textarea上写入服务器,所以服务器将有数据处理的分配。
另外,我想使用epoll的线程,但我不知道如何使用它们。 我想使用线程,因为我认为在目标机器上使用2个或全部CPU更好。
我的计划是
服务器启动时创建2个线程
第一个线程将分析新客户端并为阅读或发送做好准备
第二个线程将具有从/向客户端读取和发送数据的工作
问题是这2个线程将使用一个while(1)和epoll_wait。
我的问题是,这是一个很好的服务器架构与线程使用epoll? 如果没有,我有什么选择?
编辑:我不能使用libevent或libev或其他库,因为这是一个大学项目,我不允许使用外部库。
我认为你正试图过度设计这个问题。 Linux中的epoll
架构适用于您有数千个并发连接的情况。 在这种情况下,定义poll
和select
系统调用的开销将成为服务器中的主要瓶颈。 使用poll
或select
与epoll
的决定取决于连接数量,而不是数据量。
对于你正在做的事情,看起来你的编辑系统中的人会在你碰到几十个并发编辑器之后疯狂。 使用epoll
可能会让你发疯; 他们会利用API发挥一些技巧来挤出额外的性能,并且必须非常小心地处理您从调用中获得的信息。
这种应用听起来像是网络I / O绑定而不是CPU绑定。 我会试着将它作为一个带有poll
的单线程服务器来写。 当您收到新文本时,如果需要将其缓存给客户端,然后在套接字接受write
调用时将其发送出去。 使用非阻塞I / O; 您要阻止的唯一电话是poll
电话。
如果您在收到数据后对数据进行了大量处理,但在将数据发送回客户端之前,则可以从多线程中受益。 首先编写单线程版本,然后如果你是CPU限制的(使用top
检查),并且大部分CPU时间花费在正在进行数据处理的函数中(使用gprof
检查),则添加多线程来执行数据处理。
如果你愿意,你可以在程序中使用管道或Unix域套接字来进行不同线程之间的通信---这样,主线程中的所有内容都可以由事件驱动并通过poll
来处理。 另外,用这种模式,你甚至可以使用多个进程与fork
,而不是多线程。
只要开始使用libevent或libev并按照他们的例子。 有很多例子 - 不要试图在这里发明新的东西
链接地址: http://www.djcxy.com/p/61341.html