同步IO与异步IO的区别

[b]同步IO与异步IO的区别[/b]

[color=red]首先要明确一点:不同IO模型之间的差别本质上是CPU的参与方式[/color]

这里重点说一下各自的应用场景

[b]如何选择同步还是异步呢?[/b]
主要有这么几个指标供参考
1. 并发数量
2. 接收字节数
3. 处理请求所需CPU时间
我们一个一个来考察

[b]并发数[/b]
并发低的时候同步IO与异步IO差别不大
并发高时差别会比较明显,这要表现在
1. 开启线程数:如并发1000时,同步IO要开启1000个线程,1000个线程要占用很多内存,这是其一,其二1000个线程间切换的时间也是很可观的;异步IO则可避免这个问题


[b]接收字节数[/b]
接收字节越少被阻塞的概率越低,同步IO与异步IO的差别就越小
接收字节越多被阻塞的概率就越大,异步IO的优势越明显,能够同时服务更多的客户端请求

[b]处理请求所需CPU时间[/b]
与同步异步没什么关系


同步阻塞IO
服务端在调用read()时,如果网卡缓冲区中没有数据则程序停止向下执行,直到网卡缓冲区中有数据。伪代码如下
Before Blocking
Read(buffer);//读不到数据则一直等待
After blocking


同步的非阻塞IO是这样的
服务端调用read()后,网卡缓冲区中如果没有数据可读就返回
服务器采用循环的方式再去读取 伪代码如下
Byte[] buffer = new Byte[1024];
While(read(buffer)==0){ //read()返回读到的字节数
//todo
}
processBuffer(); //处理读取的数据


可以看出CPU大部分被浪费了


异步非阻塞IO
服务端调用read()方法,若网卡缓冲区中无数据则返回,程序继续向下执行。当缓冲区中有数据时,系统会通知应用程序。
Java nio中的selector可设置为异步非阻塞IO

异步阻塞IO
谁来补充下 :wink:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值