You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.4 KiB

服务器端保存一个Socket连接列表然后对这个列表进行轮询

  • 如果发现某个Socket端口上有数据可读时说明读就绪则调用该Socket连接的相应读操作
  • 如果发现某个Socket端口上有数据可写时说明写就绪则调用该Socket连接的相应写操作
  • 如果某个端口的Socket连接已经中断则调用相应的析构方法关闭该端口

这样能充分利用服务器资源效率得到了很大提高在进行I/O操作请求时候再用个线程去处理一个请求一个线程。Java中使用Selector、Channel、Buffer来实现上述效果。

  • SelectorSelector允许单线程处理多个Channel。如果应用打开了多个连接通道但每个连接的流量都很低使用Selector就会很方便。要使用Selector得向Selector注册Channel然后调用他的select方法这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回线程就可以处理这些事件事件的例子入有新连接接进来数据接收等。
  • Channel基本上所有的IO在NIO中都从一个Channel开始。Channel有点像流数据可以从channel到buffer也可以从buffer到channel。
  • Buffer:缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组)该对象提供了一组方法可以更轻松的使用内存块缓冲区对象内置了一些机制能够跟踪和记录缓冲区的状态变换情况Channel提供从文件网络读取数据的渠道但是读取或者写入的数据都必须经由Buffer。

用户需要不断地调用read尝试读取socket中的数据直到读取成功后才继续处理接收的数据。整个IO请求过程中虽然用户线程每次发起IO请求后可以立即返回但为了等到数据仍需要不断地轮询、重复请求消耗了大量的CPU的资源。

同步非阻塞IO

**特点:**non-blocking I/O模式需要不断的主动询问kernel数据是否已准备好。

优点

  • 进程在等待当前任务完成时可以同时执行其他任务进程不会被阻塞在内核等待数据过程每次发起的I/O请求会立即返回具有较好的实时性

缺点

  • 不断轮询将占用大量CPU时间系统资源利用率大打折扣影响性能整体数据吞吐量下降
  • 该模型不适用web服务器