首页 > 编程语言 > 详细

Linux五种IO模型与Java三种IO-API

时间:2021-05-27 16:58:45      阅读:16      评论:0      收藏:0      [点我收藏+]

一:Linux五种IO模型

I/O 即是输入/输出,在Linux(UNIX)操作系统中,共有五种IO模型,分别是:阻塞IO模型非阻塞IO模型IO复用模型信号驱动IO模型以及异步IO模型

技术分享图片

(1)Blocking IO:

技术分享图片

(2)Non-blocking IO:

 技术分享图片

(3)signal-driven IO:

 技术分享图片

(4)IO Multiplexing:

 技术分享图片

 

可以用Reactor机制解决用户线程阻塞!

!!! 注意从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

然而,使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册自己感兴趣的socket或者IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率。

 

IO多路复用模型使用了Reactor设计模式实现了这一机制。通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。用户线程注册事件处理器之后可以继续执行做其他的工作(异步),而Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理的工作。由于select函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞是指select函数执行时线程被阻塞,而不是指socket。一般在使用IO多路复用模型时,socket都是设置为NONBLOCK的,不过这并不会产生影响,因为用户发起IO请求时,数据已经到达了,用户线程一定不会被阻塞。技术分享图片

注:以上四种IO模型都是同步的!

技术分享图片

 (5)Asynchronous IO:

技术分享图片

技术分享图片

 

 二:JAVA中的IO

在Java中,主要有三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和 异步IO(AIO)。

注意:这三种是Java中提供的IO有关的API。并不是操作系统层面的IO模型呢。

技术分享图片

 技术分享图片

 技术分享图片

 

 

参考:

https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41&scene=21#wechat_redirect

https://blog.csdn.net/sehanlingfeng/article/details/78920423

https://www.imooc.com/article/265871

Linux五种IO模型与Java三种IO-API

原文:https://www.cnblogs.com/Melo-ccyfy/p/14817407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!