深入了解Netty【四】IO模型

引言
IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。
因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。
名词概念
- 阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。
- 非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。
- 同步:指向被调用方,被调用方得到结果后再返回给调用方。
- 异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。
- recvfrom函数:系统调用,经socket接收数据。
5中IO模型
1、阻塞式IO模型(blocking I/O)

进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。
2、非阻塞式IO模型(non-blocking I/O)

进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。
3、IO复用模型(I/O multiplexing)

进程调用select,如果没有套接字变为可读,则阻塞,直到有可读套接字之后,调用recvfrom函数,返回结果。
4、信号驱动式IO模型(signal-driven I/O)

进程先注册信号驱动,之后进程不阻塞,当数据准备好后,会给进程返回信号提示,这时进程调用ecvfrom函数,返回数据。
5、异步IO模型(asynchronous I/O)

由POSIX规范定义,应用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知应用程序何时启动一个I/O操作,而异步I/O模型是由内核通知应用程序I/O操作何时完成。
IO模型对比

阻塞越少,理论上性能也越优。
- 阻塞式IO,每个连接要对应一个线程单独处理,浪费资源。
- 非阻塞式IO,需要不断的轮询,也耗费CPU资源。
- 信号驱动式IO,在大量IO操作时会有信号队列溢出,且对于TCP而言,通知条件过多,每一个进行判断会消耗资源。
- 异步IO,理论最优,但是目前Linux支持还不是很完善。
因此在Linux下网络编程都以IO复用模型为主。
参考
理解高性能网络模型
IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

深入了解Netty【四】IO模型的更多相关文章
- 聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
- Netty学习(1):IO模型之BIO
概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...
- 第四十天 并发编程之io模型
一.今日内容 1.网络IO的两个阶段 waitdata copydata 2阻塞IO模型 之前写的都是阻塞 无论多线程 多进程 还是 进程池 线程池 3.非阻塞IO模型 在非阻塞IO中 需要不断循环询 ...
- 四种IO模型
四种 IO 模型: 首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO): 在linux中,默认情况下 ...
- NetCore Netty 框架 BT.Netty.RPC 系列随讲 二 WHO AM I 之 NETTY/NETTY 与 网络通讯 IO 模型之关系?
一:NETTY 是什么? Netty 是什么? 这个问题其实百度上一搜一堆. 这是官方话的描述:Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个 ...
- 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型
本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进 ...
- Netty学习(2):IO模型之NIO初探
NIO 概述 前面说到 BIO 有着创建线程多,阻塞 CPU 等问题,因此为解决 BIO 的问题,NIO 作为同步非阻塞 IO模型,随 JDK1.4 而出生了. 在前面我们反复说过4个概念:同步.异步 ...
- Netty学习之IO模型
目录 1.1 同步.异步.阻塞.非阻塞 同步 VS 异步 同步 异步 阻塞 VS 非阻塞 阻塞 非阻塞 举例 ...
- 图解四种 IO 模型
最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望.但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方. 例如在博客中,过于大白话的语言 ...
随机推荐
- 03-Thread类中的常用方法
Thread类中的常用的方法: * 1. start():启动当前线程:调用当前线程的run() * 2. run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 ...
- Redis服务之高可用组件sentinel
前文我们了解了redis的常用数据类型相关命令的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13419690.html:今天我们来聊一下redis ...
- JConsole、VisualVM 依赖的 JMX 技术到底是什么
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- @RequestMapping 参数详解
引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为applicatio ...
- URLDecoder异常解决方法
URLDecoder对参数进行解码时候,代码如: URLDecoder.decode(param,"utf-8"); 有时候会出现类似如下的错误: URLDecoder异常Ille ...
- java_方法的定义、调用、重载
方法的定义 1 概述 方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能. 当我们需要这个功能的时候,就可以去调用.这样即实现了代码的复用性,也解决了代码冗余的现象. 2 ...
- Web For Pentester 学习笔记 - XSS篇
XSS学习还是比较抽象,主要最近授权测的某基金里OA的XSS真的实在是太多了,感觉都可以做一个大合集了,加上最近看到大佬的博客,所以这里我也写一个简单的小靶场手册,顺带着也帮助自己把所有XSS的方式给 ...
- 【JVM】JVM优化过程全记录
请大神移步:https://segmentfault.com/a/1190000010510968?utm_source=tuicool&utm_medium=referral 今天看JVM群 ...
- SourceTreet提交时显示remote: Incorrect username or password ( access token )(4种解决办法)
引言 我因为第一次安装Sources Tree的时候进行破解时(跳过安装时的登录),因为操作失误造成了好多bug,导致Sources Tree不论提交,拉取,获取,都会报remote: Incorre ...
- 为什么你的 64-bit 程序可能占用巨大的虚拟空间
出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序.近期我在用 ps 查看我的一个程序的内存使用情 ...