异步io

【IO流】学习笔记

十年热恋 提交于 2019-11-29 17:15:48
按流向来分: 输入流:InputStream、Reader 输出流:OutputStream、Writer 按处理单元分: 字节流 :InputStream、OutputStream,按byte处理,能处理所有文件 FileInputStream、FileOutputStream ByteInputStream、ByteOutputStream BufferedInputStream、BufferedOutputStream ObjectInputStream DataInputStream 字符流 :Reader、Writer,按char处理,只能处理 文本文件 CharReader、CharWriter BufferedReader、BufferedWriter 字节流和字符流转换:InputStreamReader、OutputStreamWriter BIO、NIO、AIO BIO 同步阻塞IO: SeverSocket中,在客户端请求时,服务器为每个客户端分配一个线程进行处理。在通信过程中,这个线程只能为 当前的客户端服务。 NIO 同步非阻塞IO: 一个线程能处理多个客户端。 多路复用机制:利用单线程轮询事件,定位就绪Channel 。在查询时是阻塞的,为了避免大量客户端连接导致线程频繁切换。 AIO 异步非阻塞IO 服务器在收到客户端的请求时

转载:IO模型

老子叫甜甜 提交于 2019-11-29 17:13:07
简介 参考《UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] : The Sockets Networking API》 进程运行状态分为内核态和用户态两种。 对于文件读取: 第一步:等待数据准备 第二步:将数据从内核空间复制到用户空间中 对于socket: 第一步:等待网络上的数据到达,然后被复制到内核空间 第二步:将数据从内核空间复制到用户空间中 同步与异步 同步与异步关注的是进程与内核的交互。同步进程触发IO并等待或者轮询IO是否完成。 异步进程触发IO后直接返回,IO交给内核来处理,完成后内核通知进程IO完成。 阻塞与非阻塞 阻塞和非阻塞关注的是进程(线程)在等待调用结果时的状态。阻塞是指调用结果返回之前,当前进程(线程)会被挂起。非阻塞则相反,当前进程(线程)不会被挂起。 同步阻塞IO模型 进程执行recvfrom系统调用后进程阻塞,等待数据准备好,此时进程让出CPU。当数据准备好后,等待内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功,进程解除阻塞。此模型特点是IO过程的两步都会等待。 同步非阻塞IO模型 进程执行recvfrom系统调用,如果数据还没有准备好,那么recvfrom系统调用返回一个错误。这个过程一直重复,直到数据准备好后

Boost.Asio技术文档

烈酒焚心 提交于 2019-11-29 16:56:41
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0 的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从 http://www.boost.org/LICENSE_1_0.txt ) Boost.Asio 是用于网络和低层IO 编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多, 可通过文件,网络,串口或控制台.例如在网络通信中,完成独立的IO操作需要很长时间.对应用程序开发者提出了一个挑战. Boost.Asio 提供了管理需长时间运行操作的工具, 但不必涉及到线程的并发模式和显式锁定. Boost.Asio 库使用C++ 来实现,提供如网络编程等常用的操作系统接口. Boost.Asio实现了如下目标: · 可移植性Portability. 库支持一系列的常用系统操作, 具有稳定的跨平台特性. · 可扩展性Scalability. 库可以帮助开发者构建数千并发连接的网络应用程序.asio 库实现的每个系统操作都使用了最具扩展性的机制. · 效率Efficiency. 库支持发散聚合IO(scatter-gather I/O) 等技术,使应用程序尽量少的拷贝数据. · 可以像BSD Sockets

缓存IO和直接IO

人盡茶涼 提交于 2019-11-29 11:25:42
缓存IO和直接IO 缓存IO: 数据先从磁盘通过DMA copy到内核空间,再从内核空间copy到用户空间。 直接IO: 数据直接从磁盘通过DMA copy到用户空间。 3.1 缓存IO 缓存IO又被称为标准的I/O,大多数文件系统的默认I/O操作都是缓存IO 。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后再从内核空间的缓冲区复制到应用程序的地址空间。 读操作:操作系统检查内核空间的缓冲区有没有需要的数据,如果有就直接从缓存区返回;否则从磁盘中读取,然后再缓存在操作系统的缓存中。 写操作:将数据从用户空间复制到内核空间的缓冲区中。这时候对用户程序来说,写操作已经完成,至于什么时候把数据写到磁盘中是由操作系统决定,除非显示调用sync同步命令( linux 同步IO: sync、fsync与fdatasync ) 缓存IO优点:减少了磁盘读写,提高了系统性能;在一定程度上分离了用户空间和内核空间,保护系统本身运行安全。 缓存IO缺点:在缓存I/O机制中,DMA方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回磁盘上,而不能直接在应用程序的地址空间(用户空间)和缓存(内核空间)之间进行数据传输。这样,数据在传输过程中就需要在应用程序地址空间和缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU及内存开销是非常大的。 3.2 直接IO

Redis03——Redis架构

冷暖自知 提交于 2019-11-29 10:29:59
Redis架构 1.1.问题 redis是单线程,单实例,为什么并发那么多,依旧很快呢? 回答:因为调用了系统内核的epoll 1.2.Linux的早期版本 Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。 1.3.内核的跃迁 Linux kernal在之后的发展,有了很大的变化,Linux到达率NIO时期。我们可以使用客户端进行轮询访问。但是,我们如果打进1000个线程访问,那么成本就会很大。我们出现了select函数,select函数和pselect函数,我们可以直接传1000个文件描述符,一旦有返回,那么再去调read函数。这个叫做多路复用的NIO。 紧接着,内核再次跃迁,我们出现了一个共享空间,通过mmap进行空间映射。(本质是红黑树+链表//红黑树是一种自平衡的二叉查找树)。我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取

linux-nginx

☆樱花仙子☆ 提交于 2019-11-29 10:11:23
IO分为内存IO,网络IO,磁盘IO IO模型: 同步IO模型: 同步阻塞:一个进程对应一个IO,进程在运行时,不能去干别的,一直等待 同步非阻塞:一个进程对应一个IO,进程运行时,可以去做别的事,等待别的程序的数 据传输,进程会定时询问是否准备完成 多路访问的IO模型--IO复用(select poll epoll) 多线程运行 这种情况适合大并发请求的情况, 异步IO模型: *异步10* 进程只需要发起请求,内核准备数据,当数据准备就绪以后,会主动通知进程; apache采用的select就是同步IO模型,而nginx采用的就是 epoll的异步模型;所以,从这点上说,nginx要远远由于apache; nginx适用环境:小文件的高并发传输 nginx - engine X (Tengin:属于淘宝公司对nginx的=次开发优化版本,更好的支持高并发,与web安全功能); 由俄罗斯I君开发的,2004年开发的,I君为elusive第二大网站开发的一个前端静态资源解析程序 安装nginx 安装nginx: ./configure --prefix=/usr/local/nginx --conf-path=(配置文件一定要放到程序目录下,不要放到etc目录下面去)/etc/nginx/nginx.conf --user=nginx --group=nginx --error

Python 基础之 I/O 模型

女生的网名这么多〃 提交于 2019-11-29 07:07:18
一、事件驱动模型介绍 1、传统的编程模式 例如:线程模式大致流程 开始--->代码A--->代码B--->代码C--->代码D--->......--->结果 每一个代码里是完成各种各样事情的代码,但编程者知道代码A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据。输入不同的数据, 根据条件语句判断,流程或许就改为A--->B--->D...--->结束。 每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和你编写的程序决定的。如果你知道这个程序当前的运行状态(包括输入 数据和程序本身),那你就知道接下来甚至一直到结束它的运行流程。 例如:事件驱动程序模型大致流程 开始--->初始化--->等待 与上面传统编程模式不同,事件驱动程序在驱动之后,就在那等待,等待什么呢?等待被事件触发。传统编程下也有“等待”,比如在 编代码D中,你定以了一个input(),你作为程序编写者是知道或者强制用户输入东西的,或许是数字,或许是文件名称,如果用户输入 错误,你还需要提醒他,并请他重新输入,事件驱动程序的等待则是完全不知道,也不强制用户输入或者干什么,只要某一事件 发生,那程序就会做出相应的“反应”。这些事件包括:输入信息、鼠标、敲击键盘上某个键还有系统内部定时器触发。 2、事件驱动模型 通常,我们写服务器处理模型的程序时,有一下几种模型: (1)每收到一个请求;创建一个新的进程

IO模型

江枫思渺然 提交于 2019-11-29 06:34:37
io模型: 1.阻塞I/O模型 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包), 这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户 进程才解除block的状态,重新运行起来。所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。 eg:老李去火车站买票,排队三天买到一张退票。 耗费:在车站吃喝拉撒睡 3天,其他事一件没干。 2.非阻塞I/O模型 Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待, 而是马上就得到了一个结果

Java NIO之理解I/O模型

☆樱花仙子☆ 提交于 2019-11-29 05:14:48
前言 自己以前在Java NIO这块儿,一直都是比较薄弱的,以前还因为这点知识而错失了一个机会。所以最近打算好好学习一下这部分内容,我想应该也会有朋友像我一样,一直想闹明白这块儿内容。但是一直无从下手,每次被问到什么NIO,BIO,AIO就慌,下面我们先从一些基本概念来慢慢了解NIO这部分内容。 同步与异步 同步和异步是比较好理解的,网上也有好多解释。下面我通过个人的理解来解释这两个概念可能会通俗一些,希望能更好理解。 同步 就是多个任务或事件在执行时需要按顺序逐个执行,如果排在顺序前面的任务或事件在执行的时候,排在后面的任务或事件就需要等待前面的执行完后才可以执行,这些任务或事件是不能并行执行的 。同步执行任务可以被设计为可靠的任务序列,前后两个任务可以保持一致才算整个任务结束。 异步 是多个任务或事件可以同时并行执行,前面的任务不会导致后面的任务的等待 。因为是多个任务同时进行的,所以每个任务之间不产生相互的依赖,所以无法保证可靠性。 同步流程图 异步流程图 同步示例代码 public static void test1(){ System.out.println(">>>>>>>>>test1<<<<<<<<<<"); } public static void test2(){ System.out.println(">>>>>>>>>test2<<<<<<<<<<"); }

python3.6异步IO包asyncio部分核心源码思路梳理

情到浓时终转凉″ 提交于 2019-11-29 03:41:20
关于python异步编程的演进过程,两篇文章阐述得妥妥当当,明明白白。 中文资料:https://mp.weixin.qq.com/s?__biz=MzIxMjY5NTE0MA==&mid=2247483720&idx=1&sn=f016c06ddd17765fd50b705fed64429c 英文资料:http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 其实中文资料就是参考的英文资料,英文资料是开源书《 500 Lines or Less 》中的一个主题章节,整书地址:https://github.com/aosabook/500lines python的asyncio源码的核心思路其实跟基于生成器的协程异步编程思路大体一致,只是前者做了大量的代码优化和功能扩充。所以对照生成器协程代码来理解asyncio是很有帮助的。以下的这一小段代码就是采用基于生成器的协程的异步编程方式写的一个小爬虫案例,来自上述中文资料,asyncio的核心代码的思路大体上能从这段代码中找到原型。 该脚本命名为:yield_from.py import socket from selectors import DefaultSelector, EVENT_READ, EVENT_WRITE selector =