cem*_*ycc 6 c sockets multithreading epoll pthreads
我正在尝试在C语言中为Collaborative实时编辑器创建一个套接字服务器http://en.wikipedia.org/wiki/Collaborative_real-time_editor但我不知道它的最佳服务器架构是什么.
在第一次,我试图使用选择套接字服务器,但在那之后,我正在阅读有关epoll的内容,现在我认为epoll是最好的选择,因为客户端会发送用户将在textarea上写的每个字母,服务器,因此服务器将有一大堆数据要处理.
另外,我想使用epoll的线程,但我不知道如何使用它们.我想使用线程,因为我认为最好在目标机器上使用2个或所有CPU.
我的计划是
在服务器启动时创建2个线程
第一个线程将分析新客户端并准备它们进行读取或发送
第二个线程将具有从/向客户端读取和发送数据的作业
问题是这2个线程将使用while(1)和epoll_wait.
我的问题是,这是一个使用epoll与线程的良好服务器架构吗?如果没有,我有什么选择?
编辑:我不能使用libevent或libev或其他库,因为这是一个大学项目,我不允许使用外部库.
小智 5
我想你正试图过度设计这个问题.epollLinux中的体系结构适用于有数千个并发连接的情况.在这种情况下,定义poll和select系统调用的开销将成为服务器的主要瓶颈.使用poll或selectvs. 的决定epoll取决于连接数,而不是数据量.
对于你正在做的事情,看起来好像你的编辑系统中的人类在你打几十个并发编辑后会疯狂.使用epoll可能会让你发疯; 他们通过API发挥一些技巧来挤出额外的性能,你必须非常小心地处理从调用中获得的信息.
这种应用程序听起来像是网络I/O绑定而不是CPU绑定.我会首先尝试将其编写为单线程服务器poll.当您收到新文本时,如有必要,请为您的客户端缓冲它,然后在套接字接受write呼叫时将其发送出去.使用非阻塞I/O; 您要阻止的唯一呼叫是poll呼叫.
如果您在收到数据后对数据进行大量处理,但在将数据发送回客户端之前,则可以从多线程中受益.首先编写单线程版本,然后如果你受CPU限制(检查使用top)并且大部分CPU时间花在你正在进行数据处理的函数上(检查使用gprof),添加多线程来进行数据处理.
如果需要,可以在程序中使用管道或Unix域套接字来进行不同线程之间的通信 - 这样主线程中的所有内容都可以通过事件驱动和处理poll.或者,使用此模型,您甚至可以使用多个进程fork而不是多个线程.