[春招][Java][并发编程][4] 从IO到NIO/BIO
程序员文章站
2022-06-03 23:45:26
...
前言
整整5个月过去了,结果每次自己都是逡巡不前,生怕在学习上多花一点时间,最后越怕花时间,越焦虑。越焦虑,越静不下心来学习。不说了,今天讲NIO与BIO.
首先回答几个问题
什么是IO?
粗略的理解,就是CPU与其他设备,例如磁盘,打印机等设备之间的交互。
理想上确实是这样,但是由于CPU调用一次IO操作都需要从用户态切换到内核态,需要保存切换前后的各种信息,所以就出了下面这个模型。
将CPU一分为二,同时加上缓存。这样攒上一次,在执行一次性拷贝到内核地址空间中。这样减少了IO的次数,效率提高。
接下来就到NIO的一部分了
什么是Channel?
其实就是一个处理器,专门用来处理操作系统底层的IO操作。他连接的右端如图,左端可以是磁盘或者是网卡都可以,这里以磁盘为例。
下面我举个例子来看Channel的应用:
public void test() throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
System.out.println(buffer.limit());
buffer.put("1".getBytes());
System.out.println(buffer.limit());
System.out.println(buffer.position());
while (inChannel.read(buffer) != -1){
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
}
那什么是BIO?
BIO也叫做Blocking IO,也就是阻塞IO.如图.其不使用Channel的方式
内核与磁盘建立连接之后,由于不知道到底还有没有数据,因此会阻塞该线程,等待数据传完,之后在将其一并发送到用户。
好处呢,就是简单,一个线程管理一次IO.坏处就是IO个数太多的情况下,处理不过来。
什么是NIO?
在中间加入channel和select,channel来负责传输的过程处理。selector来控制数据是否已经传输完成了。只有数据传输完成,才会由selector通知内核进行接收。
草草的写了一篇,感觉不太深刻。暂时这样吧。
参考连接
上一篇: Centos7.6安装Docker