Java NIO和系统调用的epoll是怎么映射的?

 

 

Selectorselect对应epollepoll_wait方法,等待事件触发。阻塞方法。

java.nio.channels.Selector#select()

 

 

SelectorselectedKeys方法返回值对应epollepoll_event数组

java.nio.channels.Selector#selectedKeys

 

 

 

 

epoll的核心代码

参考文章:

https://www.bilibili.com/video/BV1qJ411w7du?from=search&seid=9452156983060139619

 

typedef union epoll_data {
    void *ptr;
    int fd;
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;

struct epoll_event {
    __uint32_t events; /* Epoll events */
    epoll_data_t data; //epoll_event里面包含了文件描述符
};


struct epoll_event events[5];   //假设需要监听5个文件描述符(或者5个socket)

while(true)
{
    nfds = epoll_wait(epfd,events,20,500);  //nfds是触发的事件数,events是监听的5个文件描述符,被触发的前nfds个文件描述符会排在前面。epoll_wait是会阻塞的
    for(i=0;i<nfds;++i)
    {
        else if( events[i].events&EPOLLIN ) //接收到数据,读socket
        {
            n = read(sockfd, line, MAXLINE)) < 0    //
            ev.data.ptr = md;     //md为自定义类型,添加数据
            ev.events=EPOLLOUT|EPOLLET;
            epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);//修改标识符,等待下一个循环时发送数据,异步处理的精髓
        }
    }
}

 

posted on 2021-04-20 22:36  坚守梦想  阅读(344)  评论(0编辑  收藏  举报