图解阻塞io和非阻塞io及多路复用机制

IO

即Input Stream与Output Stream

TCP通信

在介绍IO之前我们首先我们先了解一下TCP协议,对于TCP通信来说,每个TCP的scoket内核里面都有一个接受与发送缓冲区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDxZfdJt-1590916413934)(https://cdn.nlark.com/yuque/0/2018/png/155206/1543112551168-fdf77a27-396f-491e-9c16-044cae527513.png "")]

数据在应用层的send()通过数据复制进入到scoket内核的TCP发送缓冲区,发送端与接收端的scoket之间进行通讯(传输层),接收端接收到TCP报文之后存入scoket接收缓冲区,用户进程(应用层)通过receive读取缓冲区的数据。

如果接收缓冲区满了会通知TCP发送端关闭窗口,保证接收端的缓冲区不会被溢出(利用滑动窗口来做)

在有了以上的基础之后,我们再来理解阻塞与非阻塞IO

阻塞IO

如果接收缓冲区的数据为空的时候,那么receive调用scoket的read方法就会处于阻塞状态,直到有数据过来。
同样,对于写来说,如果发送缓冲区满了,那么调用scoket的write方法就会处于阻塞状态,直到报文送到网络上。
这就是阻塞IO!!

非阻塞IO

阻塞IO会一直等待,所以非阻塞IO是用来解决IO线程与scoket之间的解耦问题(引入事件机制),如果scoket发送缓存区可写的话会通知IO线程进行write,同样如果scoket的接受缓冲区可读的话会通知IO线程进行read。
这就是非阻塞IO!!

IO多路复用

而这个事件机制就是IO多路复用的模型,在linux可以使用select与epoll,可以产生多个线程去处理,如果线程去读的时候发现tcp缓冲区还没准备好的话,线程不会等待,会丢到select调度系统里面(调度吸引里面有n个这样的线程),如果tcp缓冲区准备好的就会发送事件通知select,从select选一个线程去执行。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值