对最近看的io知识写一些自己的学习心得

io的分类主要是两大类:file io(文件io)与scoket io(网络io)

在java语言的发展过程中,由于考虑到并发的问题,效率问题的等多种原因,io从最开始的同步阻塞io(bio)逐渐演变出伪同步非阻塞io,同步非阻塞io(nio)异步非阻塞(aio)

BIO(blocking  io):同步阻塞io模型,一个线程在处理请求的时候,如果服务器需要长时间去处理该请求,这个线程会处于等待状态,直到请求处理完成后返回数据(当多个线程 都使用这种模式处理请求,就会造成大量的线程堆积,资源浪费)

例:当下有一排水壶在烧开水,bio的工作模式就是,叫一个线程停留在一个线程那里,直到这个水壶烧开,才去处理下一个水壶,但是实际上,线程在等待水烧开的过程中什么都没做。

NIO(new io):同步非阻塞IO模型,说道NIO必须提到的 三大要素:channel(通道),buffer(缓冲区),selector(多路复用器)

channel:相较于bio,Stream来类比,传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。channel读写是双向的既可以实现读的功能又能实现写的功能

buffer:不管是读数据还是写数据,都要首先把数据写如缓存区

(截图:http://www.cnblogs.com/dolphin0520/p/3919162.html

selector:多路复用器的作用是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

(截图:http://www.cnblogs.com/dolphin0520/p/3919162.html

例:还是说烧水的事,一排水壶在烧水,NIO的做法是叫一个线程不断的去轮训每一个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作

AIO:(Asynchronous io):异步非阻塞IO模型--这个地方主要是涉及到一个信号量的东西(后续补充这部分知识) 。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮训所有的IO的操作状态。在IO的相应状态发生改变之后,系统会通知对应的线程来处理。

例:对应到烧开水的例子中,为每个水壶上面装了一个开关,水开之后,水壶会自动通知我谁烧开了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值