我正在使用 epoll/devpoll/kqueue/poll/select(包括 windows-select)为异步套接字 IO 设计事件循环。
我有两个执行选项,IO 操作:
非阻塞模式,在 EAGAIN 上轮询
- 将套接字设置为非阻塞模式。
- 读/写到套接字。
- 如果操作成功,则将完成通知发布到事件循环。
- 如果我得到 EAGAIN,请将套接字添加到“选择列表”并轮询套接字。
轮询方式:轮询后执行
- 将套接字添加到选择列表并轮询它。
- 等待通知它可读可写
- 读/写
- 将完成通知发布到成功的事件循环
在我看来,在正常模式下使用时首先需要更少的系统调用,尤其是写入套接字(缓冲区非常大)。此外,看起来有可能减少“选择”执行次数的开销,特别是当您没有像 epoll/devpoll/kqueue 那样可扩展的东西时,这很好。
问题:
- 第二种方法有什么优点吗?
- 在众多操作系统上对套接字/文件描述符进行非阻塞操作是否存在任何可移植性问题:Linux、FreeBSD、Solaris、MacOSX、Windows。
注意:请不要建议使用现有的 event-loop/socket-api 实现