同步IO与异步IO的区别
来源:互联网 发布:linux清空命令行 编辑:程序博客网 时间:2024/06/05 12:43
同步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()时,如果网卡缓冲区中没有数据则程序停止向下执行,直到网卡缓冲区中有数据。伪代码如下
- 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是同步非阻塞,在Linux 2.6以上的内核中,JDK6采用的epoll,如果前提条件不满足,则是select/poll的模式,都属于同步非阻塞IO。
- Byte[] buffer = new Byte[1024];
- While(read(buffer)>0){ //read()返回读到的字节数
- //todo
- }
- processBuffer(); //处理读取的数据
0 0
- 同步IO与异步IO的区别
- 同步IO与异步IO的区别
- 同步IO与异步IO的区别
- 同步IO与异步IO的区别
- 同步IO与异步IO的区别
- 同步与异步IO区别
- 同步IO 异步IO 之间的区别
- 同步IO与异步IO
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- Linux crontab命令
- geoserver添加插件
- CRLF和LF
- JAVA中Properties类的操作
- canvas
- 同步IO与异步IO的区别
- BaseController
- oracle中的数据库、用户、方案、表空间、表对象之间的关系
- Android由网页链接启动app,并获取URI参数
- 积攒的学习网站
- JS中的return的用法---笔记
- 使用js Math.random()函数生成n到m间的随机数字
- [error handle][java web]Spring MVC在类上使用@RequestMapping后对静态资源的访问问题
- cent os svn服务器搭建