nio整理

来源:互联网 发布:剑灵可爱萝莉捏脸数据 编辑:程序博客网 时间:2024/05/22 14:44

BIO即阻塞I/0,不管是磁盘I/O,还是网络I/O,数据在写入OutputStream或者从InputStream读取时都有可能会阻塞,一旦有阻塞,线程将会丢失去CPU的使用权,这在当前的大规模访问量和有性能要求的情况下是不能被接受的。


NIO有两个关键类:Channel和Selector,我们用城市交通工具来比喻NIO的工作方式。

这里Channel要比Socket更加具体,它可以比作某种具体的交通工具,而Selector可以比作一个车站的车辆运行调度系统,它将负责监控每辆车的当前运行状态,是已经出站,还是在路上等,也就是它可以轮询每个Channel的状态。这里还有一个Buffer类,它也比Stream更加具体,我们可以将它比作车上的座位。Channel是汽车的话Buffer就是汽车上的座位,它始终是一个具体的概念,与Stream不同,Stream只能代表一个座位,至于是什么座位由你自己去想象,也就是你在上车之前并不知道这个车上是否还有没有座位,也不知道上的是什么车,因为你并不能选择,而这些信息都已经被封装在了运输工具(Socket)里面。例如,当我们调用write()往SendQ中写数据时,当一次写的数据超过SendQ长度时需要按照SendQ的长度进行芬分割,这个过程中需要将用户空间数据和内核地址空间进行切换,而这个切换不是你可以控制的,但在Buffer中我们可以控制Buffer的容量,是否扩容以及如何扩容。

0 0