zoukankan      html  css  js  c++  java
  • 8、NIO--阻塞与非阻塞

    传统的io(阻塞式)

    客户端发送请求给服务端以后

    服务端不能确定客户端发送来的请求

    此时线程就会处于一个阻塞状态

    客户端发送读写请求,服务端不能确定数据是否有效

    此时的线程一直处于阻塞状态

    等待有正确的数据之后才会立即执行

    此时任何操作都做不了

    如果有大量请求

    前方的阻塞

    后方的请求也会阻塞

    都会进入一个队列

    解决方法:多线程

    此时的问题:服务器的线程也是有限的

    此时的cpu利用率没有完全的合理利用

    传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write()
    时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不
    能执行其他任务。因此,在完成网络通信进行 IO 操作时,由于线程会
    阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,
    当服务器端需要处理大量客户端时,性能急剧下降。

    NIO(非阻塞式)

    提出一个核心的组件:选择器

    选择器:会把每一个通道都注册到选择器上

        监控这些通道的IO状况(读写、连接、接收数据....)

    在任务完全准备好了以后

    在把任务分配给服务端的一个或多个线程上

    如果没准备就绪,就不会将任务分配给服务器上

    此时可以进一步利用cpu的资源

     

    Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数
    据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时
    间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入
    和输出通道。因此,NIO 可以让服务器端使用一个或有限几个线程来同
    时处理连接到服务器端的所有客户端。

  • 相关阅读:
    Spark源码走读4——Scheduler
    Spark源码走读3——Job Runtime
    Spark源码走读2——Spark Submit
    Spark源码走读1——RDD
    Tachyon源码解读一:master部分
    VS2008中MFC界面编程Caption中文全是乱码的解决办法
    程序猿也爱学英语(上),有图有真相
    C++程序员必看书单
    如何将CString转换成WCHAR
    Windows 语音识别编程
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10835863.html
Copyright © 2011-2022 走看看