• d
    2019-09-25
    老师可否简单讲下底层实现,比如底层是数组,队列,红黑树等。

    作者回复: 好问题,我收集一下素材。

     2
     5
  • 徐凯
    2019-09-25
    1.采用动态分配数组的方式
    2.如果内存不够 进行realloc 或者申请一块更大的内存 然后把源数组拷贝过来

    作者回复: 鼓励动手来一个。

    
     5
  • Hale
    2019-09-26
    能讲讲为什么不用POLLIN来判断套接字可读?

    作者回复: POLLIN包括了OOB等带外数据的检测,POLLRDNORM则不包括这部分。

    #define    POLLIN        0x0001        /* any readable data available */
    #define    POLLRDNORM    0x0040        /* non-OOB/URG data available */

    
     4
  • 夏目
    2019-11-15
    老师,我还是没明白poll和select的本质区别是什么,能否指点一下

    作者回复: 两者只是编程接口的区别,从内核实现角度来讲,其实本质实现是差不多的,poll客服了select有限文件描述字的缺陷,适用的范围更广一些。

    
     3
  • 阿卡牛
    2019-10-24
    还有种信号驱动型I/O,老师可以讲解吗

    作者回复: 让内核在描述符就绪时发送SIGIO信号通知我们,这种模型为信号驱动式I/O(signal-driven I/O),说实话,这个模型在实战中用的是比较少的,作为一个知识点知道就可以了。

    
     1
  • 传说中的成大大
    2019-09-30
    第一问: 我觉得需要改进的原因在于他是一个固定死了的值,而很多时候我们都要考虑到扩容的问题,所以可以把所有的描述符push_back到一个vector等类似的容器当中,直接对容器取size就可以获得数量
    第二问:把新连接上来的connfd添加进去,对上面问题的容器进行一次取size操作就行了
    通过前面两个问题 我产生了第三个问题
    我们都知道select 每次循环都需要向内核重新注册一次需要关心的描述符, 在Poll当中他是怎么处理的呢?也是每次都要注册一次吗?新增了描述放到集合当中肯定也需要通知内核啊 !

    作者回复: poll也是每次向内核注册了一个描述符集合,做法没有区别。你看到的这段代码,就是新增的描述符

        //找到一个可以记录该连接套接字的位置
                for (i = 1; i < INIT_SIZE; i++) {
                    if (event_set[i].fd < 0) {
                        event_set[i].fd = connected_fd;
                        event_set[i].events = POLLRDNORM;
                        break;
                    }
                }

    
     1
  • LDxy
    2019-09-25
    为什么程序里使用POLLRDNORM而不是POLLIN呢?这两者又何不同?

    作者回复: #define    POLLRDNORM    0x0040        /* non-OOB/URG data available */
    #define    POLLIN        0x0001        /* any readable data available */

    
     1
  • panda
    2020-02-04
    老师,什么情况下会使套接字数目多余select数目呢,我所理解的是一般服务端对一个套接字就会开一个线程,客户端一个进程也不会创建出很多套接字,感觉都不会导致数量过多的情况,求指点
    
    
  • JJj
    2020-01-16
    请问下,如果select同时关注可读、可写、异常。那是不是最多支持关注3*1024个IO事件

    作者回复: 你这样理解倒也是可以的。一个描述字可以对应三种不同的事件。

    
    
  • Geek_68d3d2
    2019-12-11
    老师我看网络编程里面使用了各种函数,函数里面各种参数,您那里有没有什么文档参考手册啥的可供我们需要时翻阅,光靠脑子记,记不来啊。您平常都是怎么写代码啊,这些函数都是背下来了吗。

    作者回复: Linux下"man xxx",windows下看MSDN,当然,有一些常见的是要记下来的。

    
    
  • godtrue
    2019-11-24
    poll 是另一种在各种 UNIX 系统上被广泛支持的 I/O 多路复用技术,虽然名声没有 select 那么响,能力一点不比 select 差,而且因为可以突破 select 文件描述符的个数限制,在高并发的场景下尤其占优势。

    老师好,之前听过IO多路复用存在一个使CPU飙升的问题,不知具体是哪个IO多路复用函数引起的,具体原因是什么,怎么解决的,老师能否介绍一下?

    作者回复: 你是在什么上下文理听过这个问题的呢?

     2
    
  • 贺荣伟
    2019-11-21
    认真多看几遍,老师讲解的很到位
    
    
  • 鞋子特大号
    2019-10-31
    老师讲的真好,非常感谢。

    作者回复: 谢谢支持~。

    
    
  • 传说中的成大大
    2019-09-30
    我不太理解的是 之前好像理解到一个概念就是select每次轮训都会重新向内核注册需要关心的描述符这个缺点,那Poll呢?

    作者回复: poll也一样的,

    poll(event_set, INIT_SIZE, -1)),这个event_set就是每次轮询的事件全集。

    
    
  • 传说中的成大大
    2019-09-30
    我还是不太明白select和poll进行事件注册的区别,希望老师再给我指点指点

    作者回复: 区别是编程的接口不一样,原理基本一致,但是select一般来说有文件句柄的现在,poll则没有。我觉得你可以看代码体会一下。

    
    
  • Jimmy Xiong
    2019-09-28
    请问老师,例子的全代码(可以直接运行起来)哪里可以找得到?

    作者回复: https://github.com/froghui/yolanda

    
    
  • CCC
    2019-09-26
    > lsof -i:43211
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    pollserve 56364 jinhaoplus 3u IPv4 0xd6b66f6bf4c36f21 0t0 TCP *:43211 (LISTEN)
    pollserve 56364 jinhaoplus 4u IPv4 0xd6b66f6bf3b80f21 0t0 TCP localhost:43211->localhost:63829 (ESTABLISHED)
    pollserve 56364 jinhaoplus 5u IPv4 0xd6b66f6bf49d05a1 0t0 TCP localhost:43211->localhost:63851 (ESTABLISHED)
    pollserve 56364 jinhaoplus 6u IPv4 0xd6b66f6bf427d921 0t0 TCP localhost:43211->localhost:63876 (ESTABLISHED)
    telnet 56379 jinhaoplus 5u IPv4 0xd6b66f6be79fc921 0t0 TCP localhost:63829->localhost:43211 (ESTABLISHED)
    telnet 56381 jinhaoplus 5u IPv4 0xd6b66f6be1866f21 0t0 TCP localhost:63851->localhost:43211 (ESTABLISHED)
    telnet 56529 jinhaoplus 5u IPv4 0xd6b66f6bf4944921 0t0 TCP localhost:63876->localhost:43211 (ESTABLISHED)

    我开启了三个telnet客户端连接这个pollserver,老师能否解释下上面的lsof命令中为什么客户端持有的FD是这样的情况呢?客户端持有的FD不应该是各自的connectfd嘛?
    展开

    作者回复: 63829,63851,63851就是三个不同的telnet客户端连接端口,由此断定肯定是三个不同的连接套接字。

    
    
  • 初见
    2019-09-25
    老师您好~

    我们既然有了poll,是不是代表着select 可以废弃了呢?

    还是说他们各自仍然有不同的使用场景?

    作者回复: 场景不同,select仍然活跃在各种场合。

    
    
  • 安排
    2019-09-25
    fd可读事件是不是有可能会误触发?也就是fd发生了可读事件,但是实际上并没有数据可读? 所以我们要用非阻塞的读。 这是内核的一个bug吗?还是。。。

    作者回复: 你是说使用阻塞I/O配合poll来使用?

     1
    
我们在线,来聊聊吧