异步io

【IO多路复用】 -- 2019-08-09 10:54:02

ε祈祈猫儿з 提交于 2019-11-26 16:09:45
原文: http://106.13.73.98/__/8/ 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”

Linux IO 概念(2)【转】

那年仲夏 提交于 2019-11-26 15:57:02
转自: https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇 IO底层的概念 中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从linux一切皆文件的设计哲学,介绍了文件描述符,从进程的运行内存分配,进程的切换,介绍了进程的阻塞,以及引出了阻塞IO. 在讲到阻塞IO的时,候受限于知识水平,也没有实际操作过,还是没有理解进程和IO函数的调用关系,IO又是如何操作磁盘,文件描述符又是怎样工作,进程怎么去拷贝字节流, 了解linuxIO的最终目的我是想知道JavaIO和JavaNIO在虚拟机中是如何调用的,虚拟机作为一个linux进程又是如何跟底层IO进行交互的.这些问题最终还是要去图书馆查阅书籍才能理解的更清楚, 下面继续在网络上搬迁别人家的博客 注:以下下文章整理自网络 阻塞IO 非阻塞IO 多路复用IO, 多路复用IO是为了处理多个IO问价句柄的数据操作,一个典型场景是当有很多socket服务监听不同端口以接收数据时,如果采用阻塞IO则需要多线程,每个线程和进程负责一个端口socket.但是,大量的线程和进程往往造成CPU的浪费 linuxIO多路复用技术提供一个单进程,单线程内监听多个IO读写时间的机制,其基本原理是各个IO将句柄设置为非阻塞IO,然后将各个IO句柄注册到linux提供的IO复用函数上

高性能WEB服务NGINX

情到浓时终转凉″ 提交于 2019-11-26 14:06:59
I/O介绍 I/O: 网络IO:本质是socket文件读取 磁盘IO: 每次IO,都要经由两个阶段: 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短 I/O模型 同步/异步:关注的是消息通信机制 同步:synchronous,调用者等待被调用者返回消息,才能继续执行 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态 阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起 I/O模型: 阻塞型、非阻塞型、复用型、信号驱动型、异步 非阻塞IO模型 阻塞IO模型 阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作 用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时

python3.4之后的异步IO的

戏子无情 提交于 2019-11-26 10:27:29
在python3.5之后 async更加的方便阅读 异步IO采用消息循环的模式,重复“读取消息—处理消息”的过程, 也就是说异步IO模型”需要一个消息循环,在消息循环中,主线程不断地重复“读取消息-处理消息”这一过程 。 协程 :以 async 声明的关键字的函数 函数名() 不会立马执行,而是返回一个异步对象 用于注册 run_until_complete :同时启动执行协成列表 wait用于 挂起阻塞的异步调用接口 立马交出cpu执行权 async def hello(): 定义async异步函数,中间可以添加await async.sleep(N) 来设定中断并执行下一个循环消息 tasks = [] 任务则是对协程进一步封装,其中包含任务的各种状态。即多个coroutine函数可以封装成一组Task然后并发执行 loop = asyncio.get_event_loop() #获取“事件循环”对象 loop.run_until_complete(asyncio.wait(tasks)) #通过事件循环,去调用协程函数 loop.close() 结束时间循环 来源: https://www.cnblogs.com/xzqpy/p/11317942.html

通过实例理解Java网络IO模型

天大地大妈咪最大 提交于 2019-11-25 22:17:37
网络IO模型里有多个概念比较难理解,本文通过用Java实现一个简单的redis,从最简单的单线程单连接到NIO与netty,介绍不同的IO模型。 网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解。 Socket连接 不管是什么模型,所使用的socket连接都是一样的。 以下是一个典型的应用服务器上的连接情况。客户的各种设备通过Http协议与Tomcat进程交互,Tomcat需要访问Redis服务器,它与Redis服务器也建了好几个连接。虽然客户端与Tomcat建的是短连接,很快就会断开,Tomcat与Redis是长连接,但是它们本质上都是一样的。 建立一个Socket后,就是"本地IP+port与远端IP+port"的一个配对,这个Socket由应用进程调用操作系统的系统调用创建,在内核空间会有一个与之对应的结构体,而应用程序拿到的是一个文件描述符(File Describer),就跟打开一个普通的文件一样,可以读写。不同的进程有自己的文件描述符空间,比如进程1中有个socket的fd为100,进程2中也有一个socket的fd为100,它们对应的socket是不一样的(当然也有可能一样,因为socket也可以共享)。 Socket是全双工的,可以同时读和写。 对于不同的应用场景

Netty 学习之路(一) NIO介绍

无人久伴 提交于 2019-11-25 21:51:53
NIO介绍 Netty 是基于 Java NIO进行二次开发的高性能网络框架, 在介绍Netty之前, 先介绍 NIO 相关的东西. OIO,NIO,AIO OIO又叫 BIO (Blocking IO) 同步阻塞的IO, 获取不到资源的时候, 会阻塞当前线程, IO操作的时候会阻塞直至IO操作完毕返回结果(同步IO). 每一个客户端连接都需要单独开辟一个线程来进行处理,连接数多的时候,线程数也随之上升, CPU 切换线程频繁, 实际处理业务操作的时间最终可能还没有切换线程的时间长, 线程多的时候, CPU资源利用率极低 NIO , new-IO 或者 non-blocking IO (JDK1.4开始支持) 同步非阻塞IO, OIO的升级版, 获取不到资源的时候, 不会阻塞当前线程, 同步IO. NIO一个线程可以处理多个通道(连接), 线程数量往往不会很多, CPU资源利用率高. AIO, Asynchronous IO (JDK1.7开始支持) 异步非阻塞, NIO 的升级版, 获取不到资源不会阻塞当前线程(非阻塞),IO操作也不会阻塞当前线程(异步IO),IO调用完成后OS返回一个通知给用户程序, 当然这需要OS的充分支持才能发挥最高的性能. extra 关于同步/异步/阻塞/非阻塞, 可以参考这一篇文章: https://www.cnblogs.com/mhq

异步IO-数据库-队列-缓存10

筅森魡賤 提交于 2019-11-25 21:34:18
Python之路,Day10 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱

【IO多路复用】 -- 2019-08-07 10:55:51

天涯浪子 提交于 2019-11-25 20:15:21
原创: http://106.13.73.98/__/8/ 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”