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大部分被浪费了
参考博客:
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大部分被浪费了
相关文章推荐
- 学习笔记<1>
- C++学习笔记之对文件的操作<1>
- 黑马程序员 .NET学习笔记 <1>
- C++学习笔记之对文件的操作<1>
- 学习笔记——JavaEE基础<1>HTML基础
- C++ 学习笔记 <1> C++ 语法基础知识
- OpenCV 2 学习笔记(10): 算法的基本设计模式<1>:策略模式(strategy pattern)
- Hbase 学习笔记(一) Hbase的物理模型 Hbase为每个值维护了一个多级索引,即<key, column family, column name, timestamp>
- Java系列学习笔记------Java技术基础<1>
- CSS学习笔记之<盒子模型>
- 多线程 学习笔记<1> 线程建立
- 『算法学习笔记』10th day. 文件操作<1>
- <C++学习笔记 -- 1> C++中的一些基本概念
- iOS学习笔记<20> iOS中的GCD多线程模型 & ios事件的通知方法
- C++学习笔记之对文件的操作<1>
- <<UNIX环境高级编程>>学习笔记之环境搭建
- C++学习笔记之对文件的操作<1>
- LuaFramework_UGUI_学习笔记 <1>
- C++学习笔记之对文件的操作<1>
- Effective STL 学习笔记<1>