从IO到NIO再到AIO的演化

1.同步阻塞IO,如果没有连接,一直阻塞,每来一个连接请求,分一个线程去处理。

伪代码

while(true){
 socket=server.accept()
 new Thread(socket).start()
}

示意图

缺点

当处理高并发量的时候,系统的性能会大量下降,会耗尽系统资源,导致进程僵死

2.使用线程池来处理,线程池里有维护一个任务队列,这样无论有多少个请求,都不会使服务端崩溃

伪代码

while(true){
 socket=server.accept()
 singleExecutor.execute(new Thread(socket))
}

示意图

 缺点

其实这里是一种伪异步的实现,底层仍然是采用同步阻塞机制,无法从根本上解决问题,

这里有一个来得的问题,就是这里的cpu是倾向等待IO的,就比如一个服务端发送数据特别慢,1s发一个字节,这样会造成cpu在长时间的等待。

3 NIO

这里有几个概念有了解一下,buffer代表缓冲区,所有的数据都是用缓冲区处理的,读取数据到缓冲区读,写数据写入到缓冲区。

channel代表管道,全双工,数据可双向流动,支持同时读写操作,buffer主要和channel打交道,selector称为多路复用器,每个channel都会到selector上注册,这样一个selector就能处理很多个channel,每个channel代表一个请求,selector会不断轮询channel,如果channel有事件发生,selector会监听到事件,这样会对事件进行处理。

示意图

优点

从根本上解决了底层是同步的IO的机制,变成了异常IO,只有当数据全部准备好的,才会触发操作,减少了CPU的等待。

猜你喜欢

转载自blog.csdn.net/qq_22222499/article/details/81294853