• godtrue
    2019-11-24
    1:阻塞IO+多进程——实现简单,性能一般

    2:阻塞IO+多线程——相比于阻塞IO+多进程,减少了上下文切换所带来的开销,性能有所提高。

    3:阻塞IO+线程池——相比于阻塞IO+多线程,减少了线程频繁创建和销毁的开销,性能有了进一步的提高。

    4:Reactor+线程池——相比于阻塞IO+线程池,采用了更加先进的事件驱动设计思想,资源占用少、效率高、扩展性强,是支持高性能高并发场景的利器。

    5:主从Reactor+线程池——相比于Reactor+线程池,将连接建立事件和已建立连接的各种IO事件分离,主Reactor只负责处理连接事件,从Reactor只负责处理各种IO事件,这样能增加客户端连接的成功率,并且可以充分利用现在多CPU的资源特性进一步的提高IO事件的处理效率。


    6:主 - 从Reactor模式的核心思想是,主Reactor线程只负责分发 Acceptor 连接建立,已连接套接字上的 I/O 事件交给 从Reactor 负责分发。其中 sub-reactor 的数量,可以根据 CPU 的核数来灵活设置。
    展开

    作者回复: 总结的很到位,有点惊艳 😁

    
     4
  • 李朝辉
    2020-01-12
    fd为7的套接字应该是socketpair()调用创建的主-从reactor套接字对中,从reactor线程写,主reactor线程读的套接字,作用的话,个人推测应该是从reactor线程中的连接套接字关闭了(即连接断开了),将这样的事件反馈给主reactor,以通知主reactor线程,我已经准备好接收下一个连接套接字?

    作者回复: 接近真相了,后续章节会揭开答案。

    
    
  • 李朝辉
    2020-01-12
    4核cpu,主reactor要占掉一个,只有3个可以分配给从核心。
    按照老师的说法,是因为主reactor的工作相对比较简单,所以占用内核的时间很少,所以将从reactor分配满,然后最大化对连接套接字的处理能力吗?

    作者回复: 我其实没想这么多,一般而言,worker线程的个数保持和cpu核一致,是一个比较常见的做法,例如nginx。

    
    
  • 林林
    2019-11-27
    请问老师,这里的主从reactor,是否可以是两个不同的进程(非子进程) 并通过消息队列把新连接socket的描述符发给从reactor进程? 用这种方法,close socket的时候是否需要主从reactor进程都close一次?

    作者回复: 我没有试过,不是很确定。按道理来说是可以的。

    把描述字传给另一个进程,当close的时候,应该和fork一个子进程处理的方式一样。

    
    
  • 马不停蹄
    2019-11-12
    学习 netty 的时候了解到 reactor 模式,netty 的 (单 、主从)reactor 可以灵活配置,老师讲的模式真的是和 netty 设计一样 ,这次学习算是真正搞明白了哈哈

    作者回复: Java的封装是非常漂亮,倘若能理解原理,就会更加容易理解它的封装了。

    
    
  • yusuf
    2019-10-31
    老师,请问是每个从反应堆都有自己的worker线程池么?

    作者回复: 每个反应堆都有一个自己的线程,也应该把自己的业务逻辑放到统一的线程池里面,至于这个线程池是不是在多个反应堆线程间共享,完全由应用程序自己设计和掌控,我个人觉得一个线程池是OK的,这个图里是一个示例。

    
    
  • 刘系
    2019-10-17
    老师,我试验了程序,发现有一个问题。
    服务器程序启动后输出结果与文章中的不一样。
     ./poll-server-multithreads
    [msg] set poll as dispatcher, main thread
    [msg] add channel fd == 4, main thread
    [msg] poll added channel fd==4, main thread
    [msg] set poll as dispatcher, Thread-1
    [msg] add channel fd == 8, Thread-1
    [msg] poll added channel fd==8, Thread-1
    [msg] event loop thread init and signal, Thread-1
    [msg] event loop run, Thread-1
    [msg] event loop thread started, Thread-1
    [msg] set poll as dispatcher, Thread-2
    [msg] add channel fd == 10, Thread-2
    [msg] poll added channel fd==10, Thread-2
    [msg] event loop thread init and signal, Thread-2
    [msg] event loop run, Thread-2
    [msg] event loop thread started, Thread-2
    [msg] set poll as dispatcher, Thread-3
    [msg] add channel fd == 19, Thread-3
    [msg] poll added channel fd==19, Thread-3
    [msg] event loop thread init and signal, Thread-3
    [msg] event loop run, Thread-3
    [msg] event loop thread started, Thread-3
    [msg] set poll as dispatcher, Thread-4
    [msg] add channel fd == 21, Thread-4
    [msg] poll added channel fd==21, Thread-4
    [msg] event loop thread init and signal, Thread-4
    [msg] event loop run, Thread-4
    [msg] event loop thread started, Thread-4
    [msg] add channel fd == 6, main thread
    [msg] poll added channel fd==6, main thread
    [msg] event loop run, main thread
    各个子线程启动后创建的套接字对是添加在子线程的eventloop上的,而不是像文章中的全是添加在主线程中。
    从我阅读代码来看,确实也是添加在子线程中。不知道哪里不对?
    主线程给子线程下发连接套接字是通过主线程调用event_loop_add_channel_event完成的,当主线程中发现eventloop和自己不是同一个线程,就通过给这个evenloop的套接字对发送一个“a”产生事件唤醒,然后子线程处理pending_channel,实现在子线程中添加连接套接字。
    展开

    作者回复: 我怎么觉的你的结果是对的呢?有可能我文章中贴的信息不够全,造成了一定的误导。

    
    
  • 传说中的成大大
    2019-10-17
    第一问我研究了代码 lib/event_loop.c 231和232行 创建了一个channel并且event_loop_add_channel_event事件
    然后又在lib/tcp_server.c 169和171给listenfd创建了一个channel并且执行了event_loop_add_channel_event
    所以是两次,上面那个是对socketpair创建描述符进行了添加作用还不太明白

    作者回复: 作用马上在第四篇展开讲。

    
    
  • Hale
    2019-10-14
    主 reactor 通过什么样的算法把连接套接字分发给从reactor?

    作者回复: 通过round-robin的算法。代码在
    lib/thread_pool.c thread_pool_get_loop

    
    
  • 川云
    2019-10-11
    可不可以把调用poll代码的位置展示一下

    作者回复: 调用poll的代码已经封装在框架中,具体可以看
    https://github.com/froghui/yolanda

    lib/event_dispatcher.h
    lib/poll_dispatcher.h
    lib/poll_dispatcher.c

    
    
  • _CountingStars
    2019-10-11
    7这个套接字应该是用来传递新建连接的套接字的

    作者回复: 谜底很快揭晓 :)

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