异步io

一个对异步IO的小小的介绍 (1)

二次信任 提交于 2019-12-07 16:35:49
一个对异步IO的小小的介绍 (2) 一个对异步IO的小小的介绍 (3) 一个对异步IO的小小的介绍 (4) 许多初学者都是从阻塞式IO网络编程开始的。如果一个IO操作是同步的,意味着当你调用相关的函数时,除非IO操作已经完成,否则函数不会立即返回,或者达到超时时间后才会返回。举例来说,当你使用TCP协议中的connect()函数时,你所在的操作系统将一个SYN包放入发往TCP另一端的数据队列中。除非从TCP另一端收到SYN ACK包,否则你的应用程序不会获得响应,或者经过足够的时间后放弃了连接网络才会获得响应。 这里有一个使用阻塞式IO的简单的客户端的例子:它打开一个www.google.com的连接,发送一个简单的HTTP请求,然后输出应答到stdout。 Example: A simple blocking HTTP client /* For sockaddr_in */#include <netinet/in.h>/* For socket functions */ #include <sys/socket.h>/* For gethostbyname */#include <netdb.h> #include <unistd.h> #include <string.h> #include <stdio.h> int main(int c, char **v) {

一个对异步IO的小小的介绍 (2)

旧城冷巷雨未停 提交于 2019-12-07 16:35:39
一个对异步IO的小小的介绍 (1) 一个对异步IO的小小的介绍 (3) 一个对异步IO的小小的介绍 (4) 这是另外一个 ROT13 server的实现,使用select() Example: select()-based ROT13 server /* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */#include <sys/socket.h> /* For fcntl */#include <fcntl.h> /* for select */#include <sys/select.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define MAX_LINE 16384charrot13_char(char c) { /* We don't want to use isalpha here; setting the locale would change * which characters are considered alphabetical. */ if ((c >= 'a' && c

一个对异步IO的小小的介绍 (4)

自作多情 提交于 2019-12-07 16:35:29
一个对异步IO的小小的介绍 (1) 一个对异步IO的小小的介绍 (2) 一个对异步IO的小小的介绍 (3) 这里是ROT13 server的最后一个实现,它使用 bufferevents API。 Example: A simpler ROT13 server with Libevent /* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */ #include <sys/socket.h> /* For fcntl */ #include <fcntl.h> #include <event2/event.h> #include <event2/buffer.h> #include <event2/bufferevent.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define MAX_LINE 16384void do_read(evutil_socket_t fd, short events, void *arg);void do_write(evutil_socket_t fd, short

Reactor和Proactor模式

南笙酒味 提交于 2019-12-07 10:19:41
在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。 阻塞和非阻塞 阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO 1.同步阻塞 用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式! 2.同步非阻塞 用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。 3.异步阻塞 此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢

一个对异步IO的小小的介绍 (3)

醉酒当歌 提交于 2019-12-07 03:14:39
一个对异步IO的小小的介绍 (1) 一个对异步IO的小小的介绍 (2) 一个对异步IO的小小的介绍 (4) 这里是另一个ROT13 server的异步实现。这次,它使用libevent 2 来替代select。注意fd_sets已经不再使用,取而代之的是: 我们使用一个event_base结构关联或者取消关联事件,它内部实现了select、poll、epoll、kqueue等 。 Example: A low-level ROT13 server with Libevent /* For sockaddr_in */ #include <netinet/in.h> /* For socket functions */ #include <sys/socket.h> /* For fcntl */ #include <fcntl.h> #include <event2/event.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define MAX_LINE 16384void do_read(evutil_socket_t fd, short events, void *arg);void

一文理解JavaIO、NIO、AIO

非 Y 不嫁゛ 提交于 2019-12-06 18:17:25
目录 概述 一、IO流(同步、阻塞) 二、NIO(同步、非阻塞) 三、NIO2(异步、非阻塞) 正文 回到顶部 概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous): 同步 是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而 异步 则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系 阻塞与非阻塞:在进行 阻塞 操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket新连接建立完毕,或者数据读取、写入操作完成;而 非阻塞 则是不管IO操作是否结束,直接返回,相应操作在后台继续处理 同步和异步的概念:实际的I/O操作 同步是用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行 异步是用户线程发起I/O请求后仍需要继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数 阻塞和非阻塞的概念:发起I/O请求 阻塞是指I/O操作需要彻底完成后才能返回用户空间 非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成 BIO、NIO、AIO的概述 首先,传统的 java.io包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如

我对网络IO的理解

回眸只為那壹抹淺笑 提交于 2019-12-06 13:47:17
Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read)、写(write),socket在Linux系统被抽象为流(stream)。 网络IO模型 在Unix/Linux系统下,IO分为两个不同阶段: 等待数据准备好 从内核向进程复制数据 阻塞式I/O 阻塞式I/O(blocking I/O)是最简单的一种,默认情况下,socket 套接字的系统调用都是阻塞的,我以recv/recvfrom 理解一下网络IO的模型。当应用层的系统调用recv/recvfrom时,开启Linux的系统调用,开始准备数据,然后将数据从内核态复制到用户态,然后通知应用程序获取数据,整个过程都是阻塞的。两个阶段都会被阻塞。 阻塞I/O模型 图片来源于《Unix网络编程卷1》 阻塞I/O下开发的后台服务,一般都是通过多进程或者线程取出来请求,但是开辟进程或者线程是非常消耗系统资源的,当大量请求时,因为需要开辟更多的进程或者线程有可能将系统资源耗尽,因此这种模式不适合高并发的系统。 非阻塞式I/O 非阻塞IO(non-blocking I/O)在调用后,内核马上返回给进程,如果数据没有准备好,就返回一个error ,进程可以先去干其他事情,一会再次调用,直到数据准备好为止,循环往返的系统调用的过程称为轮询(pool)

C++ 异步编程:Boost.Asio

可紊 提交于 2019-12-06 10:53:40
Boost.Asio 是一个用于网络和低级 I/O 编程的跨平台 C++ 库,它使用现代 C++ 方法为开发人员提供一致的异步模型 一个异步使用计时器的样例 #include <iostream> #include <boost/asio.hpp> void print(const boost::system::error_code & /* e */) { std::cout <<“hello world!” << std::endl; } int main() { boost :: asio :: io_context me; // 提供对 i/o 功能的访问 boost :: asio :: steady_timer t(io,boost :: asio :: chrono :: seconds(5)); t.async_wait(print); // 插入回调函数 io.run(); return; } asio 库提供了一种保证,即只能从当前调用 io_context::run() 的线程调用回调处理程序 io_context::run() 函数将继续运行,它的工作是计时器上的异步等待,在计时器到期并且回调完成之前调用不会返回 在调用 io_context::run() 前需要给 io_context 设定一些工作,如果省略了 t.async_wait(print);

回调函数、同步、异步、阻塞、非阻塞、D-BUS等概念的理解

强颜欢笑 提交于 2019-12-06 08:08:12
同步、异步与阻塞、非阻塞 这个几个概念很容易被混淆。这些概念基本都是使用在多个部件进行协作或需要在一定时间内完成的场景中。 首先,将这几个概念的定义和应用场景分析一下: 同步、异步 同步 同步的概念是应用在线程上,线程之间的同步是指两个或多个线程对同一个资源的协调使用。 那么什么是同步函数哪? 仍然与线程和资源有关。这里的资源,可以看做线程的操作任务。通常,此时同步函数内有对资源的同步操作,如mutex等。 当一个线程调用一个同步函数时(例如:该函数用于完成写文件任务),如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系统分配给其他线程使用),直到该同步函数规定的操作完成才返回,最终才能导致该调用线程被重新调度。 异步 而异步函数,则是即使函数中的操作没有完成,没有结果返回,主线程也不会被阻塞。 而函数的任务则可能由其他线程或子线程来完成。完成后,再通知调用主线程,主线程内应该有相应的机制等待或响应处理结果(这里又是一个主线程对函数结果进行等待处理的过程)。 而当调用结果出来时,通知主线程的方式,即异步调用的实现方式有哪些? 回调函数(register, response)、event(windows)、消息(windows) 阻塞、非阻塞 不同的背景知识,对这些概念的使用范围也不同,这里特指网络IO的阻塞、非阻塞。另外多路IO,

深入了解Netty【四】IO模型

我是研究僧i 提交于 2019-12-06 06:57:23
引言 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) 进程先注册信号驱动,之后进程不阻塞,当数据准备好后