文章目录

I/O的工作机制

  1. 用户空间地址:用户程序运行期间使用的空间地址

  2. 内核空间地址:操作系统核心程序运行空间

之所以进行区分是操作系统为了保护系统本身的运行安全,从而将两种类型应用运行空间进行隔离造成,保证了安全但是磁盘IO、网络I/O(磁盘,网课为物理设备只能通过系统调用)过程中需要涉及系统和用户之间数据拷贝。

此处请明晰:是站在线程/进程的层面考虑引出的同步/异步、阻塞/非阻塞

  1. 同步: 调用者进行一次请求一直等待获取到结果才返回,即调用者主动等待调用结果

  2. 异步: 调用者进行一次请求不用等待结果可以返回继续发起下一个请求或者其他人物,等待有结果后由响应发通知,即调用后被调用者主动通知结果。

    所以同步和异步关注的是调用方和被调用者对于结果的’通知机制’,主动同步等待结果,还是异步通知结果。

  3. 阻塞: 等待待用结果的过程中,该线程被挂起从而阻塞线程

  4. 非阻塞: 等待待用结果的过程中,该线程不被挂起,可以执行别的人任务

阻塞和非阻塞关注的是线程/进程等待结果的过程中的状态,线程是否被挂起。所以基于上述的理解同步有阻塞非阻塞状态,异步不存在阻塞与否

LIUNX的五种网络I/O模型

1. 阻塞IO模型

​ 进程读请求调用内核recv(recvfrom)函数,没有数据内核会等待 则进程阻塞,数组准备完成 则内核将数据复制到用户空间

2. 非阻塞IO模型

SOCKET 接口设置为非阻塞,进程读请求调用内核recv(recvfrom)函数,没有数据内核返回一个错误,紧接着进程主动轮询内核(数据是否准备好),数据准备完成则内核将数据复制到用户空间。

3. IO复用模型

​ 进程读请求不在受限于recv(recvfrom)函数阻塞,而是受限于select(poll,epoll)函数,两者不同之处在于select可以以事件监听的形式同时处理多个客户端连接,且只有对应事件真实发生时候才进行处理(缺点:监听的多个连接事件过多的话则轮询时间差会变大,事件处理会有一定的延迟)

4. 信号驱动IO

进程读请求进行信号驱动 I/O,会注册一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

5. 异步IO模型

进程度请求通过aio_read系统调用之后直接返回进行其他处理,等到内核数据准备完毕且复制数据到用户空间完成后通知进程。上述四种IO都是同步调用,只有该IO模型才是真正异步。

BIO操作的缺点

一个客户端需要使用一个线程来单独处理,对于大并发请求来说性能较差(线程数需要很多,其次线程这种‘重’资源切换销毁频繁),第二个例子即使使用线程池使线程得到复用,并使用队列来避免线程过多的情况,虽然比第一个例子性能稍微好的,但是我们发现在read()、write()方法中还是同步阻塞,且阻塞事件取决于I/O线程的处理速度和网络I/O的传输速度。

第一个例子 一个客户端需要使用一个线程来单独处理,对于大并发请求来说性能较差(线程数需要很多,其次线程这种‘重’资源切换销毁频繁),第二个例子即使使用线程池使线程得到复用,并使用队列来避免线程过多的情况,虽然比第一个例子性能稍微好的,但是我们发现在read()、write()方法中还是同步阻塞,且阻塞事件取决于I/O线程的处理速度和网络I/O的传输速度。

NIO 的相关概念

  1. Buffer 缓冲区:(减少I/O操作) 针对数据的读和写都是Buffer对象:提供数据结构化访问以及维护读写位置属性的数组,相关属性:capacity(容量),limit(读写结束位置 flip()操作),position(当前读写指针)。 常用的Buffer类有ByteBuffer(字节数组缓冲区),MappedByteBuffer(直接内存映射字节缓冲区 详情参考用户空间和内核空间)。

  2. **channel 通道: ** 进行数据读写的通道,与流stream对应区别在于流式单向的而通道是双向的。功能上可以分成两大类网流IO的SelectableChannel和磁盘IO的FileChannel

  3. Selector 多路复用器: NIO的基础,也是非阻塞得以实现的核心功能组件,本质上其通过轮询注册在其上面的Channel,且只有在某个Channel 发生真正的读、写、连接事件时候去进行处理(也可以处理自己感兴趣的事件),其使用了操作系统多路复用IO模型来使用一个线程监听多个客户端连接。

AIO的相关概念

AIO是一个完全异步的IO模型,每次读写请求过来的时候,线程直接返回,内核数据准备完成并发送到用户空间后回调用其注册的异步回调函数发送最终结果。完全的异步非阻塞

核心API对象

  1. AsynchronousServerSocketChannel: 服务端异步Socket
  2. AsynchronousSocketChannel: 客户端异步Socket
  3. CompletionHandler : 网络读写的回调处理接口,需要实现该接口来处理对应的读写操作,该接口有两个方法
    void completed(V result, A attachment); 连接建立、读操作完成,写操作完成都会触发该方法
    void failed(Throwable exc, A attachment); 在上述操作过程中出现的异常则会触发该回调方法。

有关BIO、NIO、AIO相关实例请参考:nettty学习示例 io-model模块

Netty使用前传-IO模型相关推荐

  1. Netty之四种常用 IO 模型

    四种常用 IO 模型: 同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞. 数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区. 用户线程在 IO 过程中被阻塞 ...

  2. 性能测试前传——测试模型(二)

    本文是看<软件测试从零开始>是的摘要: 但我们如果能深入软件性能测试的本质,从哲学的角度看问题,找出其内在联系,比如因果关系.形式内容关系,甚至重叠关系等,理清思路之后,那么做软件性能测试 ...

  3. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  4. 1.聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  5. 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  6. Netty框架-IO模型(Linux五大网络IO模型)

    一. IO读写的基础原理:read.write 1.编程模型一致性以及底层系统调用的理解(缓冲区与直接调用): 1.1.无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux ...

  7. netty发送数据_【Netty】JAVA IO模型

    为什么要学Netty? 其实我们每学一样东西,就要了解学这个的必要性.那么为什么要学Netty呢. 其实但凡涉及网络通信就必然离不开网络编程.Netty目前作为JAVA网络编程最热门的框架,毫不夸张的 ...

  8. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )

    文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...

  9. (二)Netty之IO模型

    IO模型 I/O模型的简单理解: 就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能 JAVA共支持三种网络编程模型IO模式:BIO.NIO.AIO JAVA BIO:同步并阻塞( ...

最新文章

  1. ai取代程序员_你现在从事的程序员还有多久会消失?牛津大学研究员帮你算了算...
  2. 互联网造车如火如荼,我们错怪贾跃亭了? | 圆桌脱口秀
  3. CentOS上安装 jdk
  4. 你人生中的那口井挖了没有?
  5. 分享Hadoop处理大数据工具及优势
  6. 计算机上机模拟试题答案,2016计算机二级上机模拟试题及答案
  7. How does JdkRegexpMethodPointcut work
  8. java判断名字是否为张三_用java代码写一个判断名字是不是以K或T开头的?
  9. Qt学习之路(60): 创建shared library
  10. 湖南工程学院计算机网期末考试,湖南工程学院__操作系统期末试卷试题
  11. 车主因眼睛小被自动驾驶误判?——智能座舱CV体验的经典corner case剖析 by 资深AI产品经理@方舟...
  12. 个人项目----吴华文
  13. [渝粤教育] 广东-国家-开放大学 21秋期末考试马克思主义基本原理概论(A)10882k1
  14. 货拉拉2021岗位招聘内推计划开始啦
  15. 重庆华侨城跨界联合潮牌T.M.D PCP发财潮流文化艺术聚会国庆开档
  16. 德卡D3读卡器C#开发中的填坑记录
  17. 《五子棋大师》技术支持
  18. Mac连接网线能够接收微信消息,浏览器不能访问网页
  19. XenCenter软件中的Centos7离线安装yum源,不用wget和crul
  20. tl-wdr5620虚拟服务器,TP-Link TL-WDR5620路由器怎么设置?

热门文章

  1. 怎么使用3DMax制作三维地形
  2. React——浅析useState原理
  3. 如何选择印刷的纸张和打印说明【转】
  4. CGAL环境配置(VS2019 PCL1.8)
  5. 替换GINA.DLL实现自己的登陆界面[酷狗] 转
  6. 闵可夫斯基距离—大白话篇幅[有错误的话请指教]
  7. 浅析《只狼》中的优秀战斗设计
  8. 事业环境因素和组织过程资产
  9. JavaScript实现动态表格
  10. 阿武老师百搭傲娇句式1