zoukankan      html  css  js  c++  java
  • 网络编程之NIO

    传统的BIO(Blocking IO)的缺点:

      1、基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存。

      2、弹性伸缩能力差,线程数和客户端数是1:1的关系,服务器压力大。

      3、多线程非常耗资源。

    NIO(Non-blocking IO)优点:

      1、基于非阻塞IO构建的,服务端建立一个单线程的Selector来管理与所有客户端接入的Socket连接,并负责监听每个连接所关心的事件。

      2、弹性伸缩能力加强了,服务端和客户端比例是1:M的关系。

      3、单线程节省资源,节省了之前的BIO的多线程的花费的资源。

    NOI核心:

      1、channel 双向性;2、非阻塞性;3、操作唯一性(给予数据块的操作只能使用buffer);

      2、Buffer的四核属性,capacity 容量,Position 位置,Limit上限,Mark 标记

      3、Selector 选择器(多路复用器)

    NIO编程实现步骤:

      1、创建Selector

      2、创建ServerSocketChannel,并绑定监听端口

      3、将channel设置为非阻塞模式

      4、将channel注册到selector上,监听连接事件

      5、循环调用selector的select方法,检测就绪情况

      6、调用的selectedKeys方法获取就绪channel集合

      7、判断事件就绪种类,调用相应的业务处理方法

      8、根据业务需要决定是否有需要再次注册监听事件,重复执行第三步操作

    缺陷分析:

      客户端的断连重连,网络闪断,段包读写,失败缓存,网络阻塞,异常码流,在可靠能力补全方面投入的时间和成本将是非常巨大的,原生NIO雨哦一个bug一直能没有改好,主要出现在类Linux操作系统上,根据API规定,调用selector的select方法时如果没有准备就绪的channel他应该阻塞在select的调用上,但linux下的selector使用的是depool IO事件通知工具,操作系统使用这一高性能的技术与网络协议栈异步工作,导致就算没有就绪的channel也不会阻塞,该问题发生概率较低。

     

  • 相关阅读:
    jQuery之事件even
    jQuery之动画效果show()......animate()
    jQuery之DOM
    css开发经验&错误习惯
    jQuery语法基础&选择器
    3D案例,导航,导航升级版
    css3实践—创建3D立方体
    CSS3弹性盒模型之Flexbox是布局模块box-sizing & box-orient & box-direction & box-ordinal-group
    Linux-ps命令
    Linux->卸载Mysql方法总结
  • 原文地址:https://www.cnblogs.com/niuyg928/p/11181581.html
Copyright © 2011-2022 走看看