服务器编程必经之路之Netty入门

版权声明:话不在多,在于精 https://blog.csdn.net/qq_29857681/article/details/90475138

首先理解概念 (概念这种东西,个人愚见,第一遍肯定是看不懂的,想要看懂就多看不同的博客,看多了就懂了)

  1. 异步回调
    1. 其实就是观察者模式
    2. 调用方在发起请求的同时传递一个回调函数 处理方在处理完请求后调用该回调函数 形成异步回调
  2. 事件驱动
    1. 首先注册事件类型和回调函数 然后等待对应的事件类型发生时,会调用该回调函数
  3. NIO
    1. 非阻塞同步IO
    2. 就是Linux内核中有一个事件表,OS一直轮询该事件表,当有对应的事件发生时回调用户的程序
    3. 减少了一个数据从用户空间到内核空间的拷贝
  4. IO多路复用
    1. select
    2. poll
    3. epoll (Redis Ngnix底层都是这个 而且是Linux目前最流行的IO模型
      1. 水平触发(LT):默认工作模式,即当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件
      2. 边缘触发(ET): 当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次通知此事件。(直到你做了某些操作导致该描述符变成未就绪状态了,也就是说边缘触发只在状态由未就绪变为就绪时只通知一次)。
      3. LT和ET原本应该是用于脉冲信号的,可能用它来解释更加形象。Level和Edge指的就是触发点,Level为只要处于水平,那么就一直触发,而Edge则为上升沿和下降沿的时候触发。比如:0->1 就是Edge,1->1 就是Level。

        ET模式很大程度上减少了epoll事件的触发次数,因此效率比LT模式下高。

          select poll epoll
        操作方式 遍历 遍历 回调
        底层实现 数组 链表 哈希表
        IO效率 每次调用都进行线性遍历,时间复杂度为O(n) 每次调用都进行线性遍历,时间复杂度为O(n) 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到readyList里面,时间复杂度O(1)
        最大连接数 1024(x86)或2048(x64) 无上限 无上限
        fd拷贝 每次调用select,都需要把fd集合从用户态拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝
  5. React模型
    1. 线程池模式一般分为两种:L/F领导者与跟随者模式、HS/HA半同步/半异步模式。 
      HS/HA 半同步/ 半异步模式 :分为三层,同步层、队列层、异步层,又称为生产者消费者模式,主线程处理I/O事件并解析然后再往队列丢数据,然后消费者读出数据进行应用逻辑处理;
      优点:简化编程将低层的异步I/O和高层同步应用服务分离,且没有降低低层服务性能。集中层间通信。 
      缺点:需要线程间传输数据,因此而带来的动态内存分配,数据拷贝,语境切换带来开销。高层服务不可能从底层异步服务效率中获益。 
      L/F 领导者跟随者模式 :在LF线程池中,线程可处在3种线程状态之一: leader、follower或processor。处于leader状态的线程负责监听tb网络端口,当有消息到达时,该线程负责消息分离,并从处于 follower状态中的线程中按照某种机制如FIFO或基于优先级等选出一个来当新的leader,然后将自己设置为processor状态去分配和处 理该事件。处理完毕后线程将自身的状态设置为follower状态去等待重新成为leader。在整个线程池中同一时刻只有一个线程可以处于leader 状态,这保证了同一事件不会被多个线程重复处理。 
      缺点:实现复杂性和缺乏灵活性; 

代码入门:http://www.cnblogs.com/applerosa/p/7141684.html

猜你喜欢

转载自blog.csdn.net/qq_29857681/article/details/90475138