zoukankan      html  css  js  c++  java
  • 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);//修改标识符,等待下一个循环时发送数据,异步处理的精髓
            }
        }
    }
  • 相关阅读:
    排序算法分析
    图论算法小结
    A*算法
    分支界限法的应用
    图的搜索策略
    最大二分匹配
    C++学习笔记(1)
    vscode简单c语言多文件编译
    c语言变量大小
    十大排序算法总结
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/14683213.html
Copyright © 2011-2022 走看看