日期:2014-05-16  浏览次数:20698 次

epoll的问题
下面是关于epoll使用的部分代码:

nfds = epoll_wait(kdpfd, events, maxevents, -1);
for (n = 0; n < nfds; ++n) {
    if (events[n].data.fd == listener) {    // 如果是主socket的事件的话,则表示
                                            // 有新连接进入了,进行新连接的处理。
        
    } else if (event[n].events & EPOLLIN) {  // 如果是已经连接的用户,并且收到数据,
                                             // 那么进行读入
        
    } else if (event[n].events & EPOLLOUT) { // 如果有数据发送
       
    }
    do_use_fd(events[n].data.fd);
}


问题1:如果nfds是1000,而且这1000个都是数据发送事件,每个数据发送事件要占用1秒,那是不是要顺序执行1000次发送操作,也就是1000秒?
问题2:如果在发送期间又有新的用户来请求会怎样?请求失败?

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

操作系统内核中会维护每个socket对应的收,发缓存。然后同上。

我想问下内核是不是顺序处理请求的呢?

你觉得呢?TCP协议是不是顺序的呢?

如果是顺序的话, 如果有一个连接要处理很长时间,那其他连接都要在那边等,那epoll的高效体现在哪里呢?


先搞明白,select/poll/epoll这些I/O多路复用API的作用:用来**同时监听**大量socket的可读/可写***事件***的。。至于发送/接收socket与此无关了。
效率为什么高,请移步到这篇文章中:http://hi.baidu.com/itaolei/item/ce26085dec47883f33e0a99c
------解决方案--------------------
如果处理需要很长时间才能完成的事件,应该配合多进程或多线程了吧
epoll等多路io复用的函数,我认为就是解决了轮询的问题