Java-IO/NIO阻塞与非阻塞模型

80 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

Java-IO/NIO阻塞与非阻塞模型

阻塞IO模型

数据在读写过程中会发生阻塞现象。线程请求到来时,内核检查数据就绪状态,若没有数据就绪状态,就会等待数据就绪,此时当前线程就会处于阻塞状态中,当数据处于就绪状态,内核会将数据拷贝到线程并返回结果给线程。

非阻塞IO模型

当线程调用read操作后,并不需要等待,直接获得调用结果。非阻塞IO模型会一直占用资源。

多路复用IO模型

NIO就是多路复用模型,专门有一个线程负责轮询socket状态,当socket有读写事件时,触发IO读写IO操作。具体的轮询是通过调用selector.select()方法判断每个通道是否有事件到达,若没有事件到达,则会阻塞当前线程。多路复用比较适合连接数比较多且数据传输内容少的场景。

信号驱动IO模型

当线程发起IO请求,会给对应socket注册一个信号函数,当内核数据处于就绪状态会发一个信号给线程,线程在接收到信号后,在信号函数中调用IO读写操作。

异步IO模型

当线程调用read()操作之后,线程继续执行其他事情,即就算没有数据处于就绪状态,线程也不会处于阻塞状态;当数据处于就绪状态后,内核会发一个信号给线程告知数据已经读写完成,直接使用数据,即线程不用再进行读写IO操作了。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情