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

来源:互联网 发布:怎么注册淘宝云客服 编辑:程序博客网 时间:2024/04/26 00:36

参考书籍: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大部分被浪费了

0 0
原创粉丝点击