IO模型:阻塞io、非阻塞io、多路复用、信号驱动、异步io

io模型

网络编程中有五种io模型

  • 阻塞io
  • 非阻塞io
  • 多路复用
  • 信号驱动
  • 异步io

网络编程中java读取数据的过程如下图
在这里插入图片描述
服务器这边调用的read()方法,但是java其实是完成不了读取数据这个功能的,其实是调用linux内核空间中的read()方法完成读取。这里就有一个用户程序空间到linux内核空间的转换,读取数据也分为两个阶段:等待数据和复制数据。服务器这边并不是调用了read()方法就立刻能读取到数据,也许客户端还没有发送过来,当读取到数据后还有一个复制数据的过程,将数据从网卡读取数据,读取到内存中。


阻塞io
在等待数据时—>接收到数据---->复制数据返回 在这个期间 用户线程是阻塞的不能做其他的事情
在这里插入图片描述


非阻塞io

非阻塞io和阻塞io的区别就是,当用户程序空间调用了read()方法后然后转到了linux内核空间,如果这个时候还没有数据的话就会返回,然后用户程序空间又继续调用linux内核空间,一直到客户端的数据发送过来了,然后再进行复制数据。其实就是在等待数据这个过程中,对于用户程序来说是非阻塞的,一直在运行,到了复制数据时还是阻塞的。
在这里插入图片描述


多路复用

它一上来不是调用read()方法,而是调用selector()方法。用户线程一上来也是先阻塞住,然后等待事件,当有事件发生了linux内核会告诉用户线程有事件要处理了,假如是read事件,然后用户线程又会去linux内核进行读取的操作
在这里插入图片描述
多路复用和阻塞io看起来有点像,接下来的图更能说明两个的区别

下面是阻塞io模式下,首先处理read事件,然后阻塞,然后数据返回,在处理accept等待连接,建立连接 然后返回,如果在这返回建立连接之前又来了一个客户端发送了数据,不能去处理接收数据,但是在等待的期间,客户端的数据已经发送过来了,需要在建立连接并返回后就去处理复制数据。
在这里插入图片描述
然后是多路复用,selector可以监听多个channel,当有多个事件发生时,selector可以在结束等待时一次返回多个事件。然后就拿到SelectorKey去处理相应的事件。
在这里插入图片描述


异步io
还有一种信号驱动的不常用,就不写了

  • 同步:线程自己去获取结果(一个线程)
  • 异步:线程自己不去获取结果,而是由其它线程送结果(至少两个线程)

所以从上面的图可以看出来,阻塞io、非阻塞io、多路复用都是io。都是自己发送请求,自己获取结果。

所以我们现在就知道了同步阻塞、同步非阻塞、多路复用这三个概念了。

而异步如下图
在这里插入图片描述
线程1向linux内核发送一个读取数据的请求,然后就等线程2将读取的数据返回,那么如何保证这一个返回的数据是上一次发送读取请求时需要的数据嘞,这是通过一个回调方法来保证的,线程2返回的数据返回到回调方法里面。

从上图可以看出来,其实不存在异步阻塞这一种说法,异步如果还是阻塞的话就没有意义了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值