您的位置:首页 > 其它

Netty学习笔记<1>--UNIX的5种I/O模型

2016-09-17 00:09 288 查看
参考书籍:Netty权威指南

参考博客:

http://blog.csdn.net/CMbug/article/details/48419983

http://www.jianshu.com/p/2461535c38f3

阻塞I/O模型:它是最常用的I/O模型,它是指直到应用的缓存区有数据或者发生错误是才返回,否则将一直阻塞,直到上述情况发生(ServerSocket的accept()方法,在没有新的连接到之前来会一直阻塞)

非阻塞I/O模型:应用的缓存区没有数据就返回EWOULDBLOCK错误,一般都会轮询检查这个状态,看看是否有数据到来(在非阻塞模式下,ServerSocketChannel的accept() 方法会立刻返回,如果还没有新进来的连接,返回的将是null)

I/O复用模型



连接完成后,使用select来管理所有的I/O,一旦其中的一个IO或这多个IO发生了我们感兴趣的事件,select函数就返回,返回值为检测到的个数,并且会告诉我们哪些IO发生了事件,事件发生后我们再调用recv去复制数据到用户缓冲区

信号驱动I/O模型

异步I/O



调用该函数,它会递交一个用户缓冲区给操作系统,就算没有数据,也立即返回,一旦有数据到来,操作系统内核会自动将数据拷贝到用户缓冲区中,然后通过一个信号通知应用程序。这种方式相当于内核在自动“推送”数据

阻塞、非阻塞、同步、异步

一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作

阻塞IO和非阻塞IO的区别在于第一步:发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO;如果不阻塞,那么就是非阻塞IO

同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO

同步非阻塞

非阻塞:体现在,这个线程可以去干别的,不需要一直在这等着;比如线程去读数据,发现没有返回,线程可以去干别的

同步:体现在消息通知机制,这个线程仍然要定时的读取stream,判断数据有没有准备好,client采用循环的方式去读取,可以看出CPU大部分被浪费了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io 模型 netty