异步io

IO多路复用的作用?

北城余情 提交于 2019-12-16 09:36:44
I/O多路复用实际上就是用select, poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。当然具体区别我们后面再讨论,现在先来看下I/O多路复用的流程: 1. 阻塞I/O模型 老李去火车站买票,排队三天买到一张退票。 耗费:在车站吃喝拉撒睡 3天,其他事一件没干。 2. 非阻塞I/O模型 老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。 3. I/O复用模型 1.select/poll 老李去火车站买票,委托黄牛,然后 每隔6小时电话黄牛询问 ,黄牛三天内买到票,然后老李去火车站交钱领票。 耗费: 打电话 2.epoll 老李去火车站买票,委托黄牛, 黄牛买到后即通知老李去领 ,然后老李去火车站交钱领票。 耗费: 无需打电话 4. 信号驱动I/O模型 老李去火车站买票, 给售票员留下电话 ,有票后,售票员电话通知老李,然后老李去火车站交钱领票。 耗费:无需打电话 5. 异步I/O模型 老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。 耗费:无需打电话 1. I/O多路复用 1.1 它的形成原因 如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,

什么才是真正的异步??

假装没事ソ 提交于 2019-12-15 21:05:05
异步定义 关于异步的定义,网上有很多不同的形式,但是归根结底中心思想是不变的。无论是在http请求调用的层面,还是在cpu内核态和用户态传输数据的层面,异步这个行为针对的是调用方: 一个可以无需等待被调用方的返回值就让操作继续进行的方法 在多数程序员的概念中一般是指线程处理的层面: 异步是计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程 可以这样通俗的理解,异步主要解决的问题是不阻塞调用方,调用方这里可以是http请求的发起者,也可以是一个线程。 但此处需要明确的是:异步与多线程与并行不是同一个概念。 CPU密集型操作 我听有的同学说,异步解决的是IO密集型的操作,菜菜觉得是不准确的。异步同样可以解决CPU密集型操作,只不过场景有限而已。有一个前提:利用异步解决CPU密集型操作要求当前运行环境支持多线程才行,比如javascript这个语言,本质上它的运行环境是单线程的,所以对于CPU密集型操作,javascript会显得力不从心。 异步解决CPU密集操作一般情况下发生在同进程中,为什么这么说呢,如果发生在不同机器或者不同进程在很多情况下已经属于IO密集型的范围了。这里顺便提醒一下:IO操作可不单单是指磁盘的操作,所有有输入/输出(Input/Output)操作的都可以泛称为IO。 举个栗子吧

阻塞与非阻塞 同步与异步

ぃ、小莉子 提交于 2019-12-15 20:08:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 如果你想吃一份宫保鸡丁盖饭: 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊! 同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊! 异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。 异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。 一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO。 阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。 来源: oschina 链接: https://my.oschina.net/u/1247524/blog/500074

关于异步,同步,阻塞与非阻塞

て烟熏妆下的殇ゞ 提交于 2019-12-15 20:00:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 如果你想吃一份宫保鸡丁盖饭: 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊! 同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊! 异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。 异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。 上面的比喻给出一个形象的感觉,这里有一段关于Reactor和Proactor模式的讲解,给出了更加严谨清晰的分析: 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。 在 比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进 程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO 完成的通知(异步的特点就是通知)。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操 作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下

Buffer和Channel

那年仲夏 提交于 2019-12-13 06:40:19
    在细讲Buffer和Channel前,我们先对几个概念梳理一下。我们在做网络编程的时候时常听到三种东西:BIO,NIO,AIO。 BIO是java中普通的IO包,jdk1.4时出现了NIO,N表时New,所以其实就是新版的IO,jdk1.7时出现了AIO,也叫NIO2.0。那这三种IO有什么区别呢?IO是同步阻塞IO,NIO是同步非阻塞IO,AIO是异步非阻塞IO。这里有几个名词,同步和异步,阻塞和非阻塞,我们举个例子:     我们在烧水,当水还没开这一段时间里,我们有两种选择,站在旁边等水烧开或者先去做别的事(比如刷个剧),如果我们选择等水烧开,就是阻塞,如果我们先去刷个剧,等会儿再来看一眼水有没有烧开,就是非阻塞。但是你会觉得,看会儿剧又要回来瞅一眼水开没开是一件很烦的事情,要是水开了能够告诉我水开了就好了,比如现在的智能家居,你尽管去刷剧,等水开了通过app给弹个消息告诉你水开了,这就是异步非阻塞。     放到我们网络编程的场景下,现在有AB两个系统,B调A系统一个接口,如果该系统是一个耗时操作(像烧水那样), BIO 模式下,B系统的当前线程就会等在那里(等水烧开),而NIO模式下,B系统的这个线程就会先去做别的事情,等会儿回来看接口有没有返回,如果返回了继续处理,没返回再去做别的事情(就跟你看会儿剧去看一眼水开没有一样)。而在AIO模式下

java整理 io和nio区别

折月煮酒 提交于 2019-12-13 00:58:39
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

Java NIO

安稳与你 提交于 2019-12-12 18:29:09
1. IO的定义 计算机中的I/O总线(输入输出总线),主要用于联系硬盘、USB、网卡等接口设备,和这些设备的数据“交流”(读与写),就可以叫做I/O操作。 2.四种主要的IO模型 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO) 首先,解释一下这里的阻塞与非阻塞: 阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间,执行用户的操作。阻塞指的是用户空间程序的执行状态,用户空间程序需等到IO操作彻底完成。传统的IO模型都是同步阻塞IO。在java中,默认创建的socket都是阻塞的。 其次,解释一下同步与异步: 同步IO,是一种用户空间与内核空间的调用发起方式。同步IO是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。异步IO则反过来,是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。 (2)同步非阻塞IO(Non-blocking IO) 非阻塞IO,指的是用户程序不需要等待内核IO操作完成后,内核立即返回给用户一个状态值,用户空间无需等到内核的IO操作彻底完成,可以立即返回用户空间,执行用户的操作,处于非阻塞的状态。 简单的说:阻塞是指用户空间(调用线程)一直在等待,而且别的事情什么都不做;非阻塞是指用户空间(调用线程)拿到状态就返回,IO操作可以干就干,不可以干,就去干的事情

异步IO框架:asyncio 中篇

隐身守侯 提交于 2019-12-11 12:49:49
上一节我们首先介绍了,如何创建一个协程对象. 主要有两种方法 通过 async 关键字, 通过 @asyncio.coroutine 装饰函数。 然后有了协程对象,就需要一个事件循环容器来运行我们的协程。其主要的步骤有如下几点: 将协程对象转为task任务对象 定义一个事件循环对象容器用来存放task 将task任务扔进事件循环对象中并触发 上一节,其实就只是讲了协程中的 单任务,我们就来看下,协程中的 多任务。 协程中的并发 协程的并发,和线程一样。举个例子来说,就好像 一个人同时吃三个馒头,咬了第一个馒头一口,就得等这口咽下去,才能去啃第其他两个馒头。就这样交替换着吃。 asyncio 实现并发,就需要多个协程来完成任务,每当有任务阻塞的时候就await,然后其他协程继续工作。 第一步,当然是创建多个协程的列表。 # 协程函数 async def do_some_work(x): print('Waiting: ', x) await asyncio.sleep(x) return 'Done after {}s'.format(x) # 协程对象 coroutine1 = do_some_work(1) coroutine2 = do_some_work(2) coroutine3 = do_some_work(4) # 将协程转成task,并组成list tasks = [

IO并发编程及二进制位运算

﹥>﹥吖頭↗ 提交于 2019-12-10 23:56:01
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 代码实现: day9/block_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

IO系统-基本知识

最后都变了- 提交于 2019-12-10 22:55:53
注:本文档主要整理了Linux下IO系统的基本知识,是整理的网易云课堂的学习笔记,老师讲得很不错,链接如下: Linux IO系统 1.Linux操作系统的基本构成 内核:操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统;控制系统和硬件之间的相互通信;决定着系统的性能和稳定性。 shell:提供给用户界面的软件。 文件系统、应用程序 1.1 基本术语 1.文件和文件系统 文件:数据或设备的一种逻辑组织; 文件系统:文件间关系管理的一种逻辑组织。 2.程序和进程 程序:计算机执行的指令集合; 进程:程序的一个运行实例,操作系统资源分配的最小单位。 3.线程(轻量级进程) 程序运行的基本单位,一个进程内部可以有一个或若干线程同时运行。 4.信号 Linux系统中进程通信的一种技术,异步程序设计的基础。 5.客户端和服务器 2 启动流程 芯片和部分外围电路的初始化 加载内核 加载最小文件系统 加载硬盘上的根文件系统 启动1号进程/sbin/init bootloader:就是在操作系统内核运行之前运行的一段小程序,主要功能有:初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它是严重依赖于硬件,在嵌入式开发中建立一个通用的bootloader几乎是不可能的。在Linux中称为grub。