异步io

Java多线程NIO学习

倖福魔咒の 提交于 2019-12-10 20:51:15
IO模型 阻塞IO 如果数据没有准备就绪,就一直等待,直到数据准备就绪;整个进程会被阻塞。 非阻塞IO 需不断询问内核是否已经准备好数据,非阻塞虽然不用等待但是一直占用CPU。 多路复用IO NIO 多路复用IO,会有一个线程不断地去轮询多个socket的状态,当socket有读写事件的时候才会调用IO读写操作。 用一个线程管理多个socket,是通过selector.select()查询每个通道是否有事件到达,如果没有事件到达,则会一直阻塞在那里,因此也会带来线程阻塞问题。 信号驱动IO模型 在信号驱动IO模型中,当用户发起一个IO请求操作时,会给对应的socket注册一个信号函数,线程会继续执行,当数据准备就绪的时候会给线程发送一个信号,线程接受到信号时,会在信号函数中进行IO操作。 非阻塞IO、多路复用IO、信号驱动IO都不会造成IO操作的第一步,查看数据是否准备就绪而带来的线程阻塞,但是在第二步,对数据进行拷贝都会使线程阻塞。 异步IO jdk7AIO 异步IO是最理想的IO模型,当线程发出一个IO请求操作时,接着就去做自己的事情了,内核去查看数据是否准备就绪和准备就绪后对数据的拷贝,拷贝完以后内核会给线程发送一个通知说整个IO操作已经完成了,数据可以直接使用了。同步的IO操作在第二个阶段,对数据的拷贝阶段,都会造成线程的阻塞,异步IO则不会。 异步IO在IO操作的两个阶段

Java复习--IO(输入/输出){Java NIO}

本小妞迷上赌 提交于 2019-12-10 19:34:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> http://my.oschina.net/u/2263278/blog/508770 中介绍的BufferedReader时提到它的一个特征----当BufferedReader读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用InputStream的read()方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流、输出流都是阻塞式的输入、输出。传统的输入流、输出流都是通过字节的移动来处理的,即使我们不直接去处理字节流,但底层的实现还是依赖于字节处理,面向流的输入/输出系统一次只能处理一个字节,因此面向流的输入/输出系统通常效率不高。从JDK1.4开始,Java提供了一些新IO,这些类都放在java.nio包及其子包下。 一、Java新IO概述 Java的NIO采用了内存映射文件的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式进行输入/输出比传统的输入/输出要快的多。 Channel和Buffer是NIO中两个核心对象,Channel是对传统的输入/输出系统的模拟,在NIO系统中所有的数据都需要通过通道Channel传输

IO并发

偶尔善良 提交于 2019-12-09 22:24:44
IO 分类 IO分类:阻塞IO ,非阻塞IO,IO多路复用,异步IO等 阻塞IO 1.定义:在执行IO操作时如果执行 条件不满足则阻塞 。阻塞IO是IO的 默认 形态。 2.效率:阻塞IO是效率很 低 的一种IO。但是由于逻辑简单所以是默认IO行为。 3.阻塞情况: 因为某种执行条件没有满足造成的函数阻塞 e.g. accept input recv 处理IO的时间较长产生的阻塞状态 e.g. 网络传输,大文件读写 非阻塞IO 定义 :通过修改IO属性行为,使原本阻塞的IO变为非阻塞的状态。 设置套接字为非阻塞IO sockfd.setblocking(bool) 功能:设置套接字为非阻塞IO 参数:默认为True,表示套接字IO阻塞;设置为False则套接字IO变为非阻塞 超时检测 :设置一个 最长阻塞时间 ,超过该时间后则不再阻塞等待。 sockfd.settimeout(sec) 功能:设置套接字的超时时间 参数:设置的时间 IO多路复用 定义 同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件。以此形成可以同时处理多个IO的行为,避免一个IO阻塞造成其他IO均无法执行,提高了IO执行效率。 具体方案 select方法 : windows linux unix poll方法: linux unix epoll方法: linux select 方法 rs , ws

Proactor模式&Reactor模式详解

放肆的年华 提交于 2019-12-09 21:17:33
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):(经典的Reactor设计模式,基于此设计模式,对用户线程来说在I/O的第一阶段即内核准备数据阶段,是异步非阻塞的,但对于Reactor来说,它是阻塞的,它阻塞在了select/epoll上。在I/O第二阶段即内核拷贝数据到用户空间,通过Reactor通知用户线程数据到达了或者回调用户线程注册的回调函数,用户线程此时要发起系统调用recv,recv这个系统调用有些人认为它算是一个阻塞过程,有些人认为这不是阻塞过程,具体情况参照描述的上下文决定。如果用户线程直接调用select/epoll,那么用户线程是同步阻塞的),Java中的Selector和Linux中的epoll都是这种模型。 (4)异步IO(Asynchronous IO):经典的Proactor设计模式,也称为异步非阻塞IO。 同步和异步的概念描述的是用户线程与内核的交互方式

IO并发原理

我们两清 提交于 2019-12-09 20:12:45
并发原理: 几乎所有的 IO 接口都是阻塞型的,处理过程中线程将被阻塞,无法进行任何操作直到返回调用结果,或超时。 IO 模型:系统内核 和 一个调用这个 IO 的线程 第一步 等待数据准备 第二部 将数据从内核拷贝到进程中 传统阻塞 IO 用户线程发送 IO 请求( read 操作)到系统内核,系统内核首先进行数据准备,然后进行数据拷贝。这两个过程中用户线程是完全阻塞的状态,啥也干不了。 非阻塞 IO 用户线程发出 IO 请求,系统内核会开始准备数据并且直接返回一个 error ,然后用户线程接收到返回值可以非阻塞(干别的了)。然后用户线程不断地发送请求,时刻询问,如果系统内核没准备好就还是返回 error ,如果准备好就直接拷贝数据,拷贝过程中是阻塞的。 多路复用 IO 多了一个 select ,用来实时监听多个 socket 是否准备好。当任意 socket 准备好了 select 就会返回,用户就会调用 read ,系统进行拷贝工作。 优点: select 只占用单线程,不消耗太多资源,可以同时处理多个连接 异步 IO 用户线程发出 IO 请求后,系统内核接收到请求会立刻给个返回,使用户线程不会阻塞。 然后系统内核自己等待数据准备,然后拷贝到用户内存,完成后通知一下用户线程。 来源: https://www.cnblogs.com/ttaall/p/12013136

Netty-6、Netty 线程模型

不羁的心 提交于 2019-12-09 11:03:05
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

Netty学习三:线程模型

本秂侑毒 提交于 2019-12-09 11:02:45
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

NIO编程(同步阻塞与同步非阻塞详解)

孤者浪人 提交于 2019-12-09 10:47:20
NIO同步阻塞与同步非阻塞 BIO与NIO IO为同步阻塞形式,NIO为同步非阻塞形式,NIO并没有实现异步,在JDK1.7后升级NIO库包,支持异步非阻塞 同学模型NIO2.0(AIO) BIO(同步阻塞式IO) 同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO(同步非阻塞式IO) 同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO(异步非阻塞式IO) 异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。 BIO(IO)与NIO区别 其本质就是阻塞和非阻塞的区别 什么是阻塞? 应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等待,直到传输完毕为止。 什么是非阻塞? 应用程序直接可以获取已经准备就绪好的数据,无需等待。 同步时 ,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪;或者采用轮训的策略实时检查数据的就绪状态,如果就绪则获取数据. 异步时 ,则所有的IO读写操作交给操作系统

JAVA中IO技术:BIO、NIO、AIO

China☆狼群 提交于 2019-12-07 20:57:51
1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 由上描述基本可以总结一句简短的话,同步和异步是目的,阻塞和非阻塞是实现方式。 1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服,自己亲自干这件事,别的事干不了。 2 异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知) 告诉朋友自己合适衣服的尺寸,大小,颜色,让朋友委托去卖,然后自己可以去干别的事。(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS) 3 阻塞 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止 去公交站充值,发现这个时候,充值员不在(可能上厕所去了),然后我们就在这里等待,一直等到充值员回来为止。(当然现实社会,可不是这样,但是在计算机里确实如此。) 4 非阻塞 非阻塞状态下, 如果没有东西可读, 或者不可写,

网络编程:Reactor与Proactor的概念

十年热恋 提交于 2019-12-07 20:08:31
1、标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。 在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。 而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步