java io 模型重点讲述

java io 模型重点讲述

bio(阻塞)

同步IO 接受请求与处理请求用同一条线程,当需要维持多条连接时就要用多线程,一条线程一个连接。这样太耗性能了。

nio (异步非阻塞)

为了解决BIO的使用线程一个连接的问题,不能想出一个办法就是:用一个线程负责接收并放到一个list里,然后不断地遍历这个连接池去读取数据。这样的代码如果在jvm里运行的话性能也不是很高,所以把这个工作交了给系统内核去做。
linux-epoll 或 windows-select 函数去负责。
与aio类似,不同之此在于,aio回调完成事件时,数据已经复制到应该用程序中了(jvm),而noi还需要通过API去系统的接收区中读。接收缓冲区的选用很重要。
缓冲区类型主要有三种:jvm,jvm外,文件映射(mappedbytebuffer)。noi主要选择还是jvm外的缓冲区。
一个好缓冲区的影响性能的因素有:同时读写,动态扩容大小。
它决定了异步通讯的稳定性和高效率性。nio的一个实现框架是netty,他设计了一套接口bytesbuf,compositebytebuf实现类,可以按需求去实现自己的bytesbuf实现类。

aio

应用程序线程会向系统注册一个socket请求,以及一个回调方法,继续执行下去。socket接受区的数据监控交给系统,当数据到达接收区,系统就将接收区的数据读到应用程序的缓冲区中,再回调用注册的方法去读取数据。
aio 在linux上没有真正的实现,而在windows上才是真正的实现了异步IO模型。当系统有数据会触发应用的回调事件读取数据没有任何阻塞。

posted on 2018-05-04 00:24  wolf12  阅读(217)  评论(0编辑  收藏  举报