运维开发网

具有kqueue的TCP Server工作者

运维开发网 https://www.qedev.com 2020-06-15 09:18 出处:网络 作者:运维开发网整理
我最近对内核事件做了一些测试,我想出了以下内容: >使用内核事件接受套接字是否有意义?我的测试显示我一次只能处理一个接受(即使事件列表数组更大)(对我来说有道理.因为.= = sockfd仅适用于一个套接字). >我认为使用kevent主要是一次从多个套接字读取.真的吗? 这是使用kqueue实现完成TCP服务器的方式吗? : >听力线程(没有kqueue) >接受新连接并将FD添加到工人kque
我最近对内核事件做了一些测试,我想出了以下内容:

>使用内核事件接受套接字是否有意义?我的测试显示我一次只能处理一个接受(即使事件列表数组更大)(对我来说有道理.因为.= = sockfd仅适用于一个套接字).

>我认为使用kevent主要是一次从多个套接字读取.真的吗?

这是使用kqueue实现完成TCP服务器的方式吗? :

>听力线程(没有kqueue)

>接受新连接并将FD添加到工人kqueue.

问题:这甚至可能吗?我的测试显示是,但是它是否保证工作线程会知道这些更改并确保线程安全?

>工人线程(带kqueue)

>等待从侦听线程添加的文件描述符的读取.

问题:检查更新时,一次有多少个套接字是有意义的?

谢谢

通常,您使用kqueue作为线程的替代.如果你要使用线程,你可以设置一个监听线程和一个工作线程池,每个接受的连接有一个线程.这是一个更简单的编程模型.

在事件驱动的框架中,您可以将侦听套接字和所有接受的套接字放入kqueue中,然后在事件发生时处理它们.当你接受一个套接字时,你将它添加到kqueue,当一个套接字处理程序完成它工作时,它可以从kqueue中删除套接字. (后者通常不是必需的,因为关闭fd会自动从任何kqueue中删除任何相关事件.)

请注意,使用kqueue注册的每个事件都有一个void * userdata,可用于在事件触发时识别所需的操作.因此,每个事件队列都没有必要具有唯一的事件处理程序;事实上,拥有各种处理程序是很常见的. (例如,您可能还希望处理通过命名管道设置的控制通道.)

混合事件/线程模型当然是可能的;否则,你无法利用多核CPU.一种可能的策略是将事件队列用作生产者 – 消费者模型中的调度程序.队列处理程序将直接处理侦听套接字上的事件,接受连接并将接受的fd添加到事件队列中.当发生客户端连接事件时,该事件将被发布到工作队列中以供稍后处理.它也可能有多个工作队列,每个线程一个,并且让接受者猜测应该放置一个新连接的工作队列,可能是基于该线程的当前负载.

0

精彩评论

暂无评论...
验证码 换一张
取 消