关于阻塞非阻塞 同步异步的解释

关于阻塞非阻塞 同步异步的解释

针对Linux的网络存在的五种io模型做出如下解释:

blocking IO 阻塞io
nonblocking IO 非阻塞io
IO multiplexing 多路复用
signal driven IO 信号驱动[忽略]
asynchronous IO 异步

其中java中的netty一般采用io-multiplexing
我们将io的传输分为两个空间 两个过程
1 用户内存
内核内存
2 数据准备过程: 内核数据准备过程[比如tcp一个数据包到达部分时刻]
数据复制过程: 数据到达完毕后从内核复制到用户态内存阶段

五种io模型都是针对这一个过程的分类
blocking
用户态进程发起系统调用函数【recvfrom】
阻塞等待内核数据准备完成 阻塞等待内核内存空间数据copy用户空间完成

non-blocking
用户态
用户态进程发起系统调用函数【recvfrom】
如果【数据准备过程】未完成则直接返回
用户进程不会阻塞
当用户进程轮询发起系统调用函数【recvfrom】直到数据准备完毕
发起数据复制时会阻塞复制数据 (注意为用户进程主动搬运数据)

注:非阻塞针对的是轮询io就绪事件时候直接返回
阻塞针对的是轮询io就绪事件时候会阻塞等待io就绪

io-multiplexing
netty的selector就是采用这种模型
selector.select函数执行时
内核非阻塞轮询所有注册socket检查【数据准备过程】
同时selector.select本身虽然阻塞,但内核实际上会轮询所有的socket并且每个socket的【数据准备过程】检查是不会阻塞的,
所以说netty是同步非阻塞的;
因为同步,异步,阻塞和非阻塞本身针对的是Linux的io模型,而非应用层面的selector.select函数

异步io
阻塞非阻塞 信号驱动和多路复用都属于同步io
比如netty,在数据复制阶段,是应用进程channel读写flush操作
而异步数据搬运是在应用调用后,交给内核系统进程完成实际数据copy,之后通知用户进程,用户进程在【数据准备过程】和【数据复制过程】都不是阻塞的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值