我使用epoll/devpoll/kqueue/poll/select(包括windows-select)为异步套接字IO设计事件循环。异步事件循环设计和问题
我有表演的两个选项,IO操作:在EAGAIN
非阻塞模式,调查
- 设置套接字非阻塞模式。
- 读/写入套接字。
- 如果操作成功,则向事件循环发布完成通知。
- 如果我得到EAGAIN,将套接字添加到“选择列表”并轮询套接字。
轮询方式:轮询,然后执行
- 添加插座选择列表和轮询它。在正常模式下使用时
- 等待通知,这是可读可写的
- 读/写
- 后完成通知sucseeds的事件循环
对我来说,它看起来像第一次将需要更少的系统调用, 尤其适用于写入套接字(缓冲区相当大)。 此外,它看起来可以减少“select” 执行次数的开销,特别是当你没有可以很好地扩展为epoll/devpoll/kqueue的东西 时更是如此。
问题:
- 有没有第二个方法的任何好处?
- 在Linux,FreeBSD,Solaris,MacOSX,Windows等众多操作系统上,套接字/文件描述符上的非阻塞操作是否存在可移植性问题。
注:请不要建议使用现有的事件环/插座-API实现
我看不出有什么理由不能等待分配内存直到需要使用第一种方法。我错过了什么吗? – Ioan 2010-05-10 18:47:59
我想是这样,但实际上并没有这样实现。在第一种情况下,您需要步骤2-4中提供的缓冲区,在第二种情况下,您只需要在步骤3中使用缓冲区。 – karunski 2010-05-16 19:14:43