您的位置:首页 > 其它

同步IO与异步IO的区别

2016-06-06 10:25 197 查看
同步IO与异步IO的区别 

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

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

如何选择同步还是异步呢? 

主要有这么几个指标供参考 

1. 并发数量 

2. 接收字节数 

3. 处理请求所需CPU时间 

我们一个一个来考察 

并发数 

并发低的时候同步IO与异步IO差别不大 

并发高时差别会比较明显,这要表现在 

1. 开启线程数:如并发1000时,同步IO要开启1000个线程,1000个线程要占用很多内存,这是其一,其二1000个线程间切换的时间也是很可观的;异步IO则可避免这个问题 

接收字节数 

接收字节越少被阻塞的概率越低,同步IO与异步IO的差别就越小 

接收字节越多被阻塞的概率就越大,异步IO的优势越明显,能够同时服务更多的客户端请求 

处理请求所需CPU时间 

与同步异步没什么关系 

同步阻塞IO 

服务端在调用read()时,如果网卡缓冲区中没有数据则程序停止向下执行,直到网卡缓冲区中有数据。伪代码如下 

 

1 Before Blocking
2 Read(buffer);//读不到数据则一直等待
3 After blocking


 

同步的非阻塞IO是这样的 

服务端调用read()后,不管网卡缓冲区中数据有多少,马上返回已有的数据

服务器采用循环的方式再去读取 伪代码如下 

 

1 Byte[] buffer = new Byte[1024];
2 While(read(buffer) > 0){ //read()返回读到的字节数
3     //todo
4 }
5 processBuffer(); //处理读取的数据


 

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

异步非阻塞IO 

服务端调用read()方法,若网卡缓冲区中无数据则返回,程序继续向下执行。当缓冲区中有数据时,系统会通知应用程序。伪代码如下:
 

___________________________________________________________________
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: