同步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()时,如果网卡缓冲区中没有数据则程序停止向下执行,直到网卡缓冲区中有数据。伪代码如下
同步的非阻塞IO是这样的
服务端调用read()后,不管网卡缓冲区中数据有多少,马上返回已有的数据
服务器采用循环的方式再去读取 伪代码如下
可以看出CPU大部分被浪费了
异步非阻塞IO
服务端调用read()方法,若网卡缓冲区中无数据则返回,程序继续向下执行。当缓冲区中有数据时,系统会通知应用程序。伪代码如下:
___________________________________________________________________
首先要明确一点:不同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()方法,若网卡缓冲区中无数据则返回,程序继续向下执行。当缓冲区中有数据时,系统会通知应用程序。伪代码如下:
___________________________________________________________________
相关文章推荐
- Oracle控制文件
- 数据库操作
- first
- 强悍的 Linux —— 系统文件及其作用
- Developing Backbone.js Applications
- jquery
- A2W,W2A等转换函数,由于使用的比较平繁,所以程序内存一直上涨,导致崩溃
- ssh端口映射
- linux 每天一个命令(cd) 只需要1分钟
- 嵌入式Linux裸机开发(二)——S5PV210启动过程分析
- Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
- Guava学习笔记:EventBus
- Google和伙伴们把PROMETHEUS加入Kubernetes平台
- Oracle SCN详解
- CFileFind类的详解以及应用实例
- [FAQ04794]如何修改默认数据连接开关
- 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字
- Extjs4.1中图片数据源
- wireshark使用方法(学习笔记一)
- 数据库课程设计上机安排