欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[春招][Java][并发编程][4] 从IO到NIO/BIO

程序员文章站 2022-06-03 23:45:26
...

前言

整整5个月过去了,结果每次自己都是逡巡不前,生怕在学习上多花一点时间,最后越怕花时间,越焦虑。越焦虑,越静不下心来学习。不说了,今天讲NIO与BIO.

首先回答几个问题

什么是IO?

粗略的理解,就是CPU与其他设备,例如磁盘,打印机等设备之间的交互。[春招][Java][并发编程][4] 从IO到NIO/BIO
理想上确实是这样,但是由于CPU调用一次IO操作都需要从用户态切换到内核态,需要保存切换前后的各种信息,所以就出了下面这个模型。
将CPU一分为二,同时加上缓存。这样攒上一次,在执行一次性拷贝到内核地址空间中。这样减少了IO的次数,效率提高。
[春招][Java][并发编程][4] 从IO到NIO/BIO
接下来就到NIO的一部分了

什么是Channel?

其实就是一个处理器,专门用来处理操作系统底层的IO操作。他连接的右端如图,左端可以是磁盘或者是网卡都可以,这里以磁盘为例。

[春招][Java][并发编程][4] 从IO到NIO/BIO
下面我举个例子来看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();
        }
    }

[春招][Java][并发编程][4] 从IO到NIO/BIO

那什么是BIO?

BIO也叫做Blocking IO,也就是阻塞IO.如图.其不使用Channel的方式
内核与磁盘建立连接之后,由于不知道到底还有没有数据,因此会阻塞该线程,等待数据传完,之后在将其一并发送到用户。
好处呢,就是简单,一个线程管理一次IO.坏处就是IO个数太多的情况下,处理不过来。
[春招][Java][并发编程][4] 从IO到NIO/BIO

什么是NIO?

在中间加入channel和select,channel来负责传输的过程处理。selector来控制数据是否已经传输完成了。只有数据传输完成,才会由selector通知内核进行接收。
[春招][Java][并发编程][4] 从IO到NIO/BIO
草草的写了一篇,感觉不太深刻。暂时这样吧。

参考连接

NIO/BIO基础
网络IO
flip

相关标签: 面经 java