异步io

IO模型

梦想的初衷 提交于 2019-11-28 19:23:22
BIO/NIO/AIO区别 首先需要区分几个概念 IO分为内存IO/网络IO/磁盘IO,磁盘IO都是阻塞的 阻塞与非阻塞是通过代码来实现的,区别在于是在于发过来操作请求,数据准备好才返回(阻塞)还是直接返回(非阻塞) IO读取顺序:磁盘(磁盘IO)/网卡(网络IO)—> 内核缓冲区 —> 用户内存,重点在于后面的过程是否是需要进程阻塞等待的 IO模型 同步阻塞(blocking IO) A去钓鱼了,你一直在那等,鱼上钩了,然后把鱼钓上来(全程阻塞) 普遍使用的IO模型,linux默认的IO模型。 进程调用recvfrom一直到recvfrom返回 同步非阻塞(noblocking IO) B去钓鱼了,放好钩后,然后开始看书,刷抖音去了,过一会看看是不是鱼上钩了。然后等鱼上钩了,把鱼钓上来 这个询问其实询问的是操作系统内核,即文件描述缓冲区是否就绪,准备好了,就进行拷贝数据包的操作。没有数据报准备好时,也不阻塞程序,内核直接返回为准备就绪的信号。 但是这个轮询其实是对CPU来说是一个比较大的消耗 很少使用,因为他浪费了大量的CPU资源 进程recvfrom,如果没有准备就绪的话,直接返回EWOULDBLOCK,过段时间再次调用recvfrom,直到正常返回。这个操作其实就是epolling(轮询),epolling内核是一个很占用CPU资源的操作 但是对管道的操作

Windows内核原理-同步IO与异步IO

为君一笑 提交于 2019-11-28 18:48:30
目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查 异常连接导致的内存泄漏排查 的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O、完成端口、IRP、设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理。 目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇文章为起点,对windows内核原理知识进行学习与梳理。发现并弥补遗漏的知识点并加以学习。同时通过理解windows内核原理,设计出更好、更合理的应用程序。 I/O I/O即输入输出。在现在操作系统,输入输出是计算机完整功能必不可少的一部分。处理器负责各种计算任务,然后通过各种输入输出设备与外界进行交互。常见的输入输出设备包括键盘、鼠标、显示器、硬盘、网络适配器接口等。有了硬件设备,在软件层面上,使得操作系统通过以一致的方式与设备驱动交互从而的操控硬件设备。而应用程序通过统一的接口与系统内核进行交互。 Windows从一开始就设计了可扩展的I/O接口。在应用层通过统一的 Win32 API ,将I/O请求分配给正确的设备驱动程序。设备驱动程序调用设备控制器来操控硬件

同步异步

我是研究僧i 提交于 2019-11-28 17:25:30
阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 执行的角度: ​ 阻塞: 程序运行时,遇到了IO,程序挂起,cpu被切走. ​ 非阻塞: 程序没有遇到IO,程序遇到IO但是我通过某种手段,让cpu强行运行我的程序. 提交任务的角度: ​ 同步: 提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个任务. ​ 异步: 一次提交多个任务,然后我就直接执行下一行代码. ​ 返回结果如何回收? 给三个老师发布任务: 同步: 先告知第一个老师完成写书的任务,我从原地等待,等他两天之后完成了,告诉完事了,我在发布下一个任务...... 异步: 直接将三个任务告知三个老师,我就忙我的我,直到三个老师完成之后,告知我. 同步调用,异步调用 1. 异步调用 # 异步调用返回值如何接收? 未解决. from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time import random import os def task(i): print(f'{os.getpid()}开始任务') time.sleep(random.randint(1,3)) print(f'{os.getpid()}任务结束') return i if __name_

漫话:如何给女朋友解释什么是BIO、NIO和AIO?

夙愿已清 提交于 2019-11-28 17:24:33
​ 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写道:"对Java的IO提醒理解不够深入"。恰好被女朋友看到了。 Java IO IO,常协作I/O,是Input/Output的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)或其他周边设备之间的输入和输出。 输入/输出是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。 输入是系统接收的信号或数据,输出则是从其发送的信号或数据。 在Java中,提供了一些列API,可以供开发者来读写外部数据或文件。我们称这些API为Java IO。 IO是Java中比较重要,且比较难的知识点,主要是因为随着Java的发展,目前有三种IO共存。分别是BIO、NIO和AIO。 Java BIO BIO 全称Block-IO 是一种 同步且阻塞 的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。 Java NIO Java NIO,全程 Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种 非阻塞同步 的通信模式。 NIO 与原来的 I/O 有同样的作用和目的,

多线程(三)

流过昼夜 提交于 2019-11-28 16:19:50
多线程(三) 1.同步/异步and阻塞/非阻塞 进程运行的三种状态:运行,就绪,阻塞 从进程执行的态度: 阻塞:程序运行时,遇到了IO,程序挂起,cpu被切走 非阻塞:程序没有遇到IO,或者程序遇到IO,通过某种手段,让cpu强行运行该程序 从提交任务的角度: 同步:提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,再提交下一个任务 异步:一次提交多个任务,然后就直接执行下一行代码 ps: 1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。 2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程 3.阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 #举例: 1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住

Node1-1 NodeJS是什么?

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 15:28:41
Node.js is a JavaScript runtime built on Chrome's V8 Node.js uses an event-driven,non-blocking I/O model(事件驱动和IO模型) 非阻塞I/O (Input / Ouput) 阻塞I/O:I/O 时进程休眠等待I/O完成后进行下一步 非阻塞I/O:I/O时函数立即返回,进程不必等待I/O完成   疑问:所有的指令都可以理解为阻塞的,上一条执行完才能执行下一句,为什么单单把IO拿出来说?   简单来讲,指令依赖的都是CPU运算,CPU的运行速度时很快的,可以执行31条指令,非IO操作根本感觉不到阻塞的过程(拷贝电影的速度) IO结束后通知主程序------->事件驱动 事件驱动 I/O等异步操作结束后通知主进程 观察者模式 来源: https://www.cnblogs.com/chorkiu/p/11412575.html

二十二、进程管理工具

最后都变了- 提交于 2019-11-28 13:46:12
pstree,ps,pgrep pkill,pidof top,htop glance,pmap, vmstat,dstat kill,pkill job,bg,fg,nohup sar(内存),tsar,iosstat(磁盘IO),iftop(网络接口数据) Linux 系统各进程的相关信息均保存在/proc/PID目录下的个文件中,而进程查看的命令都是遍历去读取该目录下的内容   靠什么命令来启动相应进程的 就在cmdline文件中 一、pstree显示进程树 二、ps 2.1、BSD风格:     ps option           a 与终端相关的进程 x 与终端无关的进程 u 与用户相关的进程 Z 安全标签(安全上下文) o 自定义显示格式 [root@izpo45bh60h6bsz ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND USER: 进程用户 PID: 进程PID %CPU: 运行占据CPU时间百分比 VSZ:虚拟内存集:可交换出的数据 一般大于RSS RSS: 常驻内存集:不可交换出的数据 TTY: 通过哪个终端启动 (?代表与终端无关) STAT:进程状态 R(Running),S(Interrupt Sleeping),D(uninterrupt Sleeping),T

自定义异步IO模块开发

£可爱£侵袭症+ 提交于 2019-11-28 11:25:41
响应头和响应体是用两个换行分割的 sk.setblock(False)  不阻塞 host是IP 比如www.baidu.com也是host,IP地址也是 r,w,e=select.select() w是连接成功的socket对象 r是有数据返回的socket对象 IO多路复用:r,w,e=while 监听多个socket对象 异步IO:非阻塞的socket+IO多路复用     -非阻塞socket     -select[自己对象],w,r 异步IO模块本身是一个线程同步,使用者是异步的 import socket import select # ########################## HTTP请求本质,阻塞 ########################## """ sk = socket.socket() # 1.连接 sk.connect(('www.baidu.com',80,)) # IO阻塞 print('连接成功了...') # 2. 连接成功发送消息 sk.send(b'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n') # sk.send(b'POST / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\nk1=v1&k2=v2') # 3. 等待着服务端响应 data =

异步IO模块的使用

二次信任 提交于 2019-11-28 11:24:38
gevent:mokey.path_all  (找到所有socket,进行异步IO) gevent+requests=》grequests Twisted: reactor.run() 死循环 Tornado =》gevent > Twisted > Tornado > asyncio www.cnblogs.com/wupeiqi/articles/6229292.html """ import gevent import requests from gevent import monkey monkey.patch_all() def task(method, url, req_kwargs): print(method, url, req_kwargs) response = requests.request(method=method, url=url, **req_kwargs) print(response.url, response.content) # ##### 发送请求 ##### # gevent.joinall([ # gevent.spawn(task, method='get', url='https://www.python.org/', req_kwargs={}), # gevent.spawn(task, method='get', url=

IO复用

橙三吉。 提交于 2019-11-28 10:55:22
IO复用: MariaDB PerconaDB web :Nginx , LNMP, Memcached ,tomcat ,varnish www.nginx.org 官方站点 Nginx pronounced engine-x HTTP服务器 反向代理 :reverse proxy 反向代理的协议 http mail netcraft 网站 web市场占有率 Nginx优势 : 高性能 稳定性 丰富的特性 简单配置 低资源消耗 多进程模型 进程切换 阻塞状态 不可中断睡眠 DMA 直接内存访问 C10K 单进程 :阻塞 多进程 :每个进程响应一个请求 进程量大。进程切换次数过多 每个进程的地址空间是独立,很多空间是重复的数据,所以内存使用效率较低 线程 :thread, Light Weight Process, LWP 每个线程响应一个请求 线程依然需要切换,切换较之进程轻量级 同一个进程的线程可以共享进程的诸多资源,比如打开的文件 对内存的需求较之进程略有下降 快速切换时会带来线程抖动 忙等 :自旋锁 Spin lock 闲等 多进程多线程模型: 多线程:n个请求 一个线程响应多个请求 select(1024) AIO :异步IO 同步通信 异步通信 多路IO,IO复用 来源: https://blog.51cto.com/14087650/2432310