2. 彤哥说netty系列之IO的五种模型
你好,我是彤哥,本篇是netty系列的第二篇。
欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。
简介
本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。
何为IO模型
对于一次IO操作,数据会先拷贝到内核空间中,然后再从内核空间拷贝到用户空间中,所以一次read操作,会经历两个阶段:
(1)等待数据准备
(2)数据从内核空间拷贝到用户空间
基于以上两个阶段就产生了五种不同的IO模式。
阻塞IO
从进程发起IO操作,一直等待上述两个阶段完成。
两阶段一起阻塞。
非阻塞IO
进程一直询问IO准备好了没有,准备好了再发起读取操作,这时才把数据从内核空间拷贝到用户空间。
第一阶段不阻塞但要轮询,第二阶段阻塞。
多路复用IO
多个连接使用同一个select去询问IO准备好了没有,如果有准备好了的,就返回有数据准备好了,然后对应的连接再发起读取操作,把数据从内核空间拷贝到用户空间。
两阶段分开阻塞。
信号驱动IO
进程发起读取操作会立即返回,当数据准备好了会以通知的形式告诉进程,进程再发起读取操作,把数据从内核空间拷贝到用户空间。
第一阶段不阻塞,第二阶段阻塞。
异步IO
进程发起读取操作会立即返回,等到数据准备好且已经拷贝到用户空间了再通知进程拿数据。
两个阶段都不阻塞。
IO模式对比
各种IO模式同比如下:
同步非同步的区别在于调用操作系统的recvfrom()的时候是否阻塞,可见除了最后的异步IO其它都是同步IO。
select poll epoll
select 有最大文件描述符的限制,只能监听到有几个文件描述符就绪了,得遍历所有文件描述符获取就绪的IO。
poll 没有最大文件描述符的限制,与select一样,只能监听到有几个文件描述符就绪了,得遍历所有文件描述符获取就绪的IO。
epoll 没有最大文件描述符的限制,它通过回调的机制,一旦某个文件描述符就绪了,迅速激活这个文件描述符,当进程下一次调用epoll_wait()的时候便得到通知。
所以,在有大量空闲连接的时候,epoll的效率要高很多。
彩蛋
Java中的nio使用的是哪种IO模型呢?
答:Java中的nio实际上是new io的缩写,它使用的是多路复用的IO模型。
参考
本文对IO的五种模型做了很简短的总结,没看懂的同学可以看看下面这篇文章,讲得很详细。
https://segmentfault.com/a/1190000003063859
最后,也欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。
2. 彤哥说netty系列之IO的五种模型相关推荐
- 1. 彤哥说netty系列之开篇(有个问卷调查)
你好,我是彤哥,本篇是netty系列的第一篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文主要讲述netty系列的整体规划,并调查一下大家喜欢的学习方式. 知识点 ne ...
- java aio nio bio_3. 彤哥说netty系列之Java BIO NIO AIO进化史
你好,我是彤哥,本篇是netty系列的第三篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/ ...
- java nio netty 教程,4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现...
4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现 你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识 ...
- java channel源码_彤哥说netty系列之Java NIO核心组件之Channel
你好,我是彤哥,本篇是netty系列的第五篇. 欢迎来我的工从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Ja ...
- java channel源码_5. 彤哥说netty系列之Java NIO核心组件之Channel
你好,我是彤哥,本篇是netty系列的第五篇. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一--Channel. 思维转变 首先, ...
- java nio attachment_7. 彤哥说netty系列之Java NIO核心组件之Selector
--日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第七篇. 简介 上一章我们一起学习了Java NIO的核心组件Buffer,它通常跟Channel一起使用,但是它们在网络IO中又该如何 ...
- 4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)
你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使 ...
- 6. 彤哥说netty系列之Java NIO核心组件之Buffer
--日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...
- java 仿qq庅,4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)
你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使 ...
最新文章
- Centos 常用系统命令
- javascript动态添加form表单元素
- JS~字符串长度判断,超出进行自动截取(支持中文)
- 数据结构考完,想了很多。
- 【libcudnn】ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
- 基于.NetCore3.1系列 —— 日志记录之日志配置揭秘
- 【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】
- 从零实现一个3D目标检测算法(2):点云数据预处理
- java设置等待锁的时间_java的锁池和等待池
- vue环境搭建以及vue-cli使用
- 全国首个园区型绿色能源网一年“减碳”上万吨
- ERROR: Could not find a version that satisfies the requirement absl (from versions: none) ERROR: No
- CSS3D写3d画廊滚动
- android管理交换机,用手机android超级终端 如何开启交换机端口
- 本页设置mac地址过滤来控制计算机对本无线网络的访问,D-Link无线路由器MAC地址过滤怎么设置...
- 服务器系统怎么安全驱动精灵,服务器驱动精灵
- android rs232串口协议,RS232串口协议详解
- Bugzilla一些权限设置(bug,项目的权限)
- 使用Apache2 搭建静态文件服务器
- return this java_简单的this,麻烦的this