带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? 如果没有,我有什么选择?

    编辑:我不能使用libeventlibev或其他库,因为这是一个大学项目,我不允许使用外部库。


    我认为你正试图过度设计这个问题。 Linux中的epoll架构适用于您有数千个并发连接的情况。 在这种情况下,定义pollselect系统调用的开销将成为服务器中的主要瓶颈。 使用pollselectepoll的决定取决于连接数量,而不是数据量。

    对于你正在做的事情,看起来你的编辑系统中的人会在你碰到几十个并发编辑器之后疯狂。 使用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

    上一篇: Socket server with epoll and threads

    下一篇: Epoll on regular files