异步io

JAVA IO/NIO

痴心易碎 提交于 2020-02-10 00:50:55
个人博客 http://www.milovetingting.cn JAVA IO/NIO 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! JAVA IO/NIO 阻塞 IO 模型 最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出 CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除 block 状态。典型的阻塞 IO 模型的例子为:data = socket.read();如果数据没有就绪,就会一直阻塞在 read 方法 非阻塞 IO 模型 当用户线程发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error 时,它就知道数据还没有准备好,于是它可以再次发送 read 操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。所以事实上,在非阻塞 IO 模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞 IO 不会交出 CPU,而会一直占用 CPU。典型的非阻塞 IO 模型一般如下: while

Java IO、BIO、NIO、BIO

大憨熊 提交于 2020-02-09 09:49:27
一、什么是IO/NIO:   IO:即BIO(Blocking IO);面向流的、同步阻塞式IO;(JDK1.4之前唯一的选择)   NIO:面向缓冲的、同步非阻塞式IO;三大核心部分:Selector、Channel(通道)、Buffer(缓冲区);(JDK1.4引进的,一般网络编程中用得较多)   AIO:异步非阻塞式IO;(JDK1.7引进,算较新的特性) 二、同步、异步、阻塞、非阻塞(分布式系统角度理解,较抽象):   同步异步 和 阻塞非阻塞并没有直接的关系。      同异步描述的是一种" 消息机制 ";比如两个线程A,B,线程A请求线程B需要一些数据,然后B去给A拿数据去:(主被动关系)     1:同步机制下,线程A要定时去 主动 的问A数据拿来没有。     2:异步机制下,线程A请求完B,就不管了,B如果把数据拿来准备好了,由 B来通知A 来处理。      阻塞非阻塞:描述的是线程间请求时所处的一种 状态 :(能不能去做别的事)     1:阻塞:体现在A请求B,一直到到读取数据B的过程中,A线程被挂起(期间不能使用CPU),直到当前数据段获取完了。(一次while()的执行)。     2:非阻塞:体现在A请求到获取数据之间,A线程不会被挂起,从 请求 到 准备好数据 这个阶段,A可以离开去做其它事。   注:同步异步,一般我们从编程中的多线程的角度理解是

Nginx 简述

喜你入骨 提交于 2020-02-08 17:05:43
I/O 模型 同步/异步:关注的是消息通信机制 同步:synchronous 调用者等待被调用者返回信息,再继续执行后续操作 异步:asynchronous 被调用者通过状态、通知或回调机制主动通知调用者被调用者的状态 阻塞/非阻塞模型 阻塞:blocking IO操作需要彻底完成后才回到用户空间,调用结果返回前,调用者被挂起 非阻塞:noblocking IO操作被调用后立即给用户返回一个状态值,无需等待IO彻底完成,最终的调用结果返回前,调用者不挂起 (非阻塞型并不直接使用,程序虽然没有挂起,但是会不断发起IO请求等待答复,消耗大量CPU资源。一般在其他模型中使用) IO多路复用型 有等待机制作(select)为中间调和,负责接收请求,并不直接请求内核。本质上也是阻塞特征,阻塞点在等待机制select 使用场景: 客户端处理多个描述符是(一般为交互输入和网络套接口) 一个TCP服务器既要已连接套接字又要监听套接字 一个服务器要处理TCP、UDP 一个服务器要处理多个服务或协议 具体实现: select:linux实现,对应IO复用模型 poll:linux实现,对应IO复用模型 epoll:linux实现,对应IO复用模型,具有信号驱动IO某些特征 kqueue: FreeBSD实现,IO复用,有信号驱动IO特性 /dev/poll: SUN的Solaris实现 Iocp

云计算学习路线图素材课件:Linux性能优化IO子系统

老子叫甜甜 提交于 2020-02-06 00:13:21
Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统,具有免费使用和自由传播的特性。随着开源软件的发展以及云计算技术的革新,Linux成为云计算人才必须要掌握的技能之一。下面给大家分享云计算学习路线图素材课件:Linux性能优化IO子系统的内容。 很多同学听过IO流,即以流的方式进行输入输出,其中流是一种抽象的概念,它代表了数据的无结构化传递。IO系统,英文全称为“Input output system”,中文全称为“输入输出系统”,由输入输出控制系统和外围设备两部分组成,是计算机系统的重要组成部分。 作为Linux服务器来讲,最大的两个IO类型是磁盘IO和网络IO。一个完整的IO系统过程如下: 1)一个用户进程通过write()系统调用发起写请求; 2)内核更新对应的page cache; 3)pdflush内核线程将page cache写入至磁盘中; 4)文件系统层将每一个block buffer存放为一个bio结构体,并向块设备层提交一个写请求; 5)块设备层从上层接受到请求,执行IO调度操作,并将请求放入IO请求队列中; 6)设备驱动(如SCSI或其他设备驱动)完成写操作; 7)磁盘设备固件执行对应的硬件操作,如磁盘的旋转、寻道等,数据被写入到磁盘扇区中。 block layer处理bio请求,并将这些请求链接成一个队列,称作IO请求队列

云计算学习路线图素材课件:Linux性能优化IO子系统

风格不统一 提交于 2020-02-05 19:10:37
Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统,具有免费使用和自由传播的特性。随着开源软件的发展以及云计算技术的革新,Linux成为云计算人才必须要掌握的技能之一。下面给大家分享云计算学习路线图素材课件:Linux性能优化IO子系统的内容。 很多同学听过IO流,即以流的方式进行输入输出,其中流是一种抽象的概念,它代表了数据的无结构化传递。IO系统,英文全称为“Input output system”,中文全称为“输入输出系统”,由输入输出控制系统和外围设备两部分组成,是计算机系统的重要组成部分。 作为Linux服务器来讲,最大的两个IO类型是磁盘IO和网络IO。一个完整的IO系统过程如下: 1)一个用户进程通过write()系统调用发起写请求; 2)内核更新对应的page cache; 3)pdflush内核线程将page cache写入至磁盘中; 4)文件系统层将每一个block buffer存放为一个bio结构体,并向块设备层提交一个写请求; 5)块设备层从上层接受到请求,执行IO调度操作,并将请求放入IO请求队列中; 6)设备驱动(如SCSI或其他设备驱动)完成写操作; 7)磁盘设备固件执行对应的硬件操作,如磁盘的旋转、寻道等,数据被写入到磁盘扇区中。 block layer处理bio请求,并将这些请求链接成一个队列,称作IO请求队列

【31】常见IO模型浅析 · Qingfeng.Du

独自空忆成欢 提交于 2020-02-05 12:42:12
note:本文以及 《说说Redis的非阻塞IO多路复用技术》 都是NIO学习的预热,本文对常见的四种IO模型进行归纳总结。 常见的IO模型有: 同步阻塞IO(Blocking IO):即传统的IO模型 同步非阻塞IO(Non-blocking IO) IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO 1 同步阻塞IO 简单,就不多说了。 2 同步非阻塞IO 不难,也不多说。 3 IO多路复用 用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。 从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的soc 大专栏 【31】常见IO模型浅析 · Qingfeng.Du ket

java.nio异步线程安全的IO

主宰稳场 提交于 2020-02-04 23:51:11
BIO 方式使得整个处理过程和连接是绑定的,只要连接建立,无论客户端是否有消息发送,都要进行等待处理,一定程度上浪费了服务器端的硬件资源,因此就有了 NIO 方式。Java 对于 NIO 方式的支持是通过 Channel和 Selector 方式来实现,采用的方法为向 Channel注册感兴趣的事件,然后通过 Selector 来获取到发生了事件的 key,如发生了相应的事件,则进行相应的处理,否则则不做任何处理,是典型的Reactor 模式,按照这样的方式,就不用像 BIO 方式一样,即使在没有消息的情况下也需要占据一个线程来阻塞读取消息,从而提升服务器的使用效率, 为实现 TCP/IP+NIO 方式的系统间通讯, Java 提供了 SocketChannel和 ServerSocketChannel两个关键的类,网络 IO 的操作则改为通过ByteBuffer 来实现,具体的基于 java实现TCP/IP+NIO 方式的通讯的方法如下所示。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

大白话五种IO模型

微笑、不失礼 提交于 2020-02-04 12:57:12
目录 大白话五种IO模型 一、I/O模型介绍 二、阻塞I/O模型 2.1 一个简单的解决方案 2.2 该方案的问题 2.3 改进方案 2.4 改进后方案的问题 三、非阻塞I/O模型 3.1 非阻塞I/O实例 四、多路复用I/O模型 4.1 select/poll模型 4.1.1 select网络I/O模型 4.1.2 select监听fd变化的过程分析 4.1.3 该模型的优点 4.1.4 该模型的缺点 4.2 epoll模型(了解) 五、信号驱动I/O模型(了解) 六、异步I/O模型 七、I/O模型比较分析 大白话五种IO模型 一、I/O模型介绍 为了更好地了解I/O模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) I/O和异步(asynchronous) I/O,阻塞(blocking) I/O和非阻塞(non-blocking)I/O分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I/O和non-blocking I/O是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network I/O。本文最重要的参考文献是Richard

Node.js入门:异步IO

好久不见. 提交于 2020-02-04 07:59:17
异步IO 在操作系统中,程序运行的空间分为内核空间和用户空间。我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务。 同步IO的并行模式 多线程单进程 多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果。多线程的缺点在于执行时上下文交换的开销较大,和状态同步(锁)的问题。同样它也使得程序的编写和调用复杂化。 单线程多进程 为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启动多进程的方式来达到充分利用CPU和提升总体的并行处理能力。它的缺点在于业务逻辑复杂时(涉及多个I/O调用),因为业务逻辑不能分布到多个进程之间,事务处理时长要远远大于多线程模式。 异步IO的必要性 采用同步方式的程序要完成这两个任务的时间总花销会是m + n。但是如果是采用异步方式的程序,在两种I/O可以并行的状况下(比如网络I/O与文件I/O),时间开销将会减小为max(m, n)。而当并行任务更多的时候,m + n + …与max(m, n, …)之间的孰优孰劣更是一目了然。Node.js天然地支持这种异步I/O,这是众多云计算厂商对其青睐的根本原因。 操作系统对异步I/O的支持 异步与非阻塞听起来似乎是同一回事。从实际效果的角度说,异步和非阻塞都达到了我们并行I/O的目的

Java IO

前提是你 提交于 2020-02-03 00:26:33
Java IO可以从三个方面理解,即硬盘、网络和终端,在这三个方向上都存在输入输出。然后根据处理模型的不同,Java的IO处理又可以划分为BIO、NIO和AIO。 一、java.io 从传输的内容的不同,总体上可以分为两大类,即字节流和字符流。 (一)字节流 A。输入流 这里又区分为节点流和处理流,由于处理流都是装饰器流,所以都会迭代在节点流之上工作。 B。输出流 输出流当然与输入流类似,节点流可以单独使用,但是处理流需要迭代节点流来使用 (二)字符流 我们都知道计算机其实只能存储0和1,或者说字节,这里之所以还有个字符流,只是为了方便使用,底层与终端真正交互肯定还是用的字节流。 A。输入流 也是一样的体系。 B。输出流 一般建议使用处理流包装之后的节点流来处理数据,比较提供了更多的功能和灵活性。 二、Java BIO、Java NIO与Java AIO 从包空间来看,java.io中的类都是BIO,而java.nio中的类则既有NIO又有AIO。另外,还可以从同步异步以及阻塞非阻塞来理解。 同步与异步,这个主要是从接受者来区分。 同步就是发起一个请求后,接受者未处理完请求之前,不返回结果。 异步就是发起一个请求后,立刻得到接受者的回应表示已接收到请求,但是接受者并没有处理完,接受者通常依靠事件回调等机制来通知请求者其处理结果。 阻塞和非阻塞,这个主要从请求者来区分。