陈奇网络工作室

高性能服务器开发基础系列(1)主线程和工作线程分工

建设工作站服务器

服务器为了能够顺利处理多个客户端链接,通常在某个线程a上对新的客户端连接进行accept,生成新连接的socket fd,将这些新连接的socket fd转换为其他多个工作线程B1 这些工作线程在处理这些新连接的网络I/o事件或数据的发送和接收的同时,也处理系统中的其它事务。 这里把线程a称为主线程,把B1、B2、B3、B4等称为工作者线程。 工作线程的代码框架通常如下所示。

while (! m_bQuit

epoll_or_select_func (;

handle_io_events (;

handle_other_things (;

}

epoll_or_select_func ( )中的select ( )或poll/epoll ( ) )检测socket fd上的io事件,并且如果存在这些事件,则为handle _ io _ ect

这有三个优点。

线程a只需要处理新连接的到来,而不需要处理网络I/o事件。 由于网络I/o事件处理通常相对较慢,如果在线程a中处理新连接和网络I/o,则线程可能忙于处理I/o事件,从而无法及时处理客户端的新连接,这很常见

线程a接收到的新连接可以基于一定的负载均衡原则将新的套接字FD指派给工作线程。 常用的算法,例如round robin,即不考虑轮询机制,即中途断开连接的情况,一个新连接到来时分配给B1,另一个分配给B2,另一个分配给B3,另一个分配给B4 这样重复,线程a记录每个工作线程上套接字FD的数量,以最大化资源平衡,从而避免一些工作线程“忙”,而其他工作线程“空闲”

即使工作线程未满,也可以让工作线程做其他事情。 例如,现在有四个工作线程,但只有三个连接。 线程B4可以是handle_other_thing ( )中的其他线程。

介绍重要的效率问题。

在上述while循环中,epoll_or_selec_func ( )中的epoll_wait/poll/select等函数通常设置超时时间。 如果将超时时间设置为0,则在没有网络I/o时间或其他任务处理的情况下,这些工作线程实际上会空转,浪费cpu时间。 如果设置的超时时间大于0,并且没有网络IO时间,则epoll_wait/poll/select仍然必须返回规定的时间( handle_other_thing ) ) 也就是说,如果发生其他任务,其处理会有一定的延迟性。 这样也不好。

如何解决这个问题呢?

实际上,希望达到的效果是,如果没有网络I/o时间或其他任务,这些工作线程将直接挂起,而不是空闲。如果有其他任务,这些工作线程将返回epoll _ wait/poll

为了解决此问题,以linux为例,无论epoll_fd中是否存在文件描述符fd,都要绑定缺省fd。 此软盘称为唤醒软盘。 需要处理其他任务时,请在此唤醒软盘中自由写入1个字节的。 这样,该fd立即变得可读,epoll_wait(/poll )/select )函数立即被唤醒,并返回,立即执行handle_other_thing )

在linux平台上,可以通过以下方式实现此唤醒软盘:

管道pipe,创建管道并将管道绑定到epoll_fd。 如有必要,向管道边缘写入字节,以立即唤醒工作线程。

linux 2.6中新增的eventfd :

inteventFD(unsignedintinitval,int flags );

步骤也是如此,将生成的eventfd绑定到epoll_fd。 如有必要,向此eventfd写入字节,以立即唤醒工作线程。

第三种方法最方便。 也就是说,它是linux特有的套接字对。 socketpair是一对相互连接的socket,同时相当于服务器端和客户端的端点,可以在每一端读写数据。

intsocketpair(intdomain,int type,int protocol,int sv[2] );

调用此函数返回的两个套接字句柄分别为sv[0]和sv[1],它们向其中一个写入字节,向另一个接收字节。

将收到的字节套接字绑定到epoll_fd。 如果需要,向另一个写入套接字写入字节将立即启动工作线程。

如果使用socketpair,则必须将domain参数设置为AFX_UNIX。

在windows上,select函数只支持检测名为套接字的软盘,因此windows上通常只能使用方法3的原理。 您还必须手动创建两个套接字,一个连接到另一个,然后将读取的段绑定到select软盘。 在编写跨越两个平台的代码时,应该注意这一点。

欢迎使用公众号《easyserverdev》。 如果您有技术或职业问题,请通过此公众号联系我们。 这个公众号不仅可以分享高性能服务器的开发经验和故事,还可以为广大技术朋友免费提供技术答疑和职业困惑。 不管有什么问题都可以直接向微信公众号发送消息。 我会尽快回复你。

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3