异步io

IO Unix IO BIO AIO NIO

走远了吗. 提交于 2020-03-10 12:57:08
IO: io流分为 字符 和 字节 两种,其实比较好认,一般字节的都是Stream结尾,字符的是Reader或Writer结尾,字符和字节转换用InputStreamReader 字符的用于读取纯文本格式,一次读一个字符,比如utf-8三个字节 字节用来读取二进制文件等,那种人看不懂的,包括图片 视频等 再者就是io流使用了典型的装饰者模式,等等我去偷张图,侵删。 可以清晰的看出FilterInputStream就是装饰者,再不改变原有类的情况下,下面三个Data/Buffered/PushbackInputStream附加实现了不同的功能,比如BufferedInputStream实现了缓冲的功能,如果想深入了解,个人建议去看 https://www.jianshu.com/p/4a530a3c70af 。 具体使用来个例子吧清晰一点: 复制文件 FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dist); byte [] buffer = new byte [ 1024 ]; // read() 最多读取 buffer.length 个字节 返回的是实际读取的个数 返回 -1 的时候表示读到 eof,即文件尾 while (in.read

Netty(1)线程模型

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-09 05:00:35
前言 对于Netty框架的学习 前置知识点:线程模型 目录 线程模型概述 传统阻塞IO线程模型 Reactor基本思想 单Reactor单线程 单Reactor多线程 主从Reactor多线程 总结 线程模型概述 在学习Netty线程模型之前,先要搞清楚各个线程模型的发展过程,再进行Netty线程模型的了解 现有的线程模型: 传统阻塞IO线程模型(也就是BIO) Reactor 模式 其中Reactor模式根据Reactor的数量和线程的数量可以分为三种: 单Reactor单线程 单Reactor多线程 主从Reactor多线程 Netty框架是基于主从Reactor多线程模型进行改进(多个主Reactor) 传统阻塞IO线程模型 传统阻塞IO也就是Java BIO 很简单,就是一个连接一个线程的模型 每一个连接都创建一个线程去处理,而且当完成连接,读取数据时,如果没有数据可读会阻塞线程 传统阻塞IO线程模型缺点: 对于高并发的环境,会创建很多线程,系统开销大 阻塞IO模式会造成线程浪费 Reactor基本思想 Reactor模式是对传统阻塞IO模型的一种改进 其中基本思想有两个: 基于 I/O 复用模型 :多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理

高性能Server---Reactor模型

浪子不回头ぞ 提交于 2020-03-08 18:16:43
无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) …… C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量,更别说天猫双11的瞬间访问量了!这就对服务器有很高的要求!能够快速处理海量的用户请求!那服务器如何能快速的处理用户的请求呢? 高性能服务器 高性能服务器至少要满足如下几个需求:

[内功修神]Java NIO

微笑、不失礼 提交于 2020-03-07 23:46:48
个人博客文章地址 文章目录 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 1.2. 什么是阻塞?什么是非阻塞? 1.3. 什么是阻塞IO?什么是非阻塞IO? 1.4. 什么是同步IO?什么是异步IO? 1.5. 五种IO模型 1.5.1. 阻塞IO模型(BIO) 1.5.2. 非阻塞IO模型 1.5.3. 多路复用IO模型(NIO) 1.5.4. 信号驱动IO模型 1.5.5. 异步IO模型 (Asynchronous IO --- AIO) 1.6. 两种高性能IO设计模式 1.6.1. 传统的网络服务设计模式中,有两种比较经典的模式 1.6.2. Reactor模式 1.6.3. Proactor模式 2. Java NIO之Buffer(缓冲区) 3. Java NIO之通道(Channel) 4. 选择器(Selector) 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行 会导致整个流程的暂时等待 ,这些事件没有办法并发地执行; 异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行 不会导致整个流程的暂时等待 。 1.2. 什么是阻塞?什么是非阻塞? 阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作

伪异步IO理解

让人想犯罪 __ 提交于 2020-03-07 08:44:26
伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理。因此避免了为每个client请求创建一个新线程造成的资源耗尽问题。 来看一下伪异步IO的服务端代码: 线程池类 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author zhouxuejun * * @date 2014年10月21日 上午10:05:43 */ public class TimerServerHandlerExecutePool { private ExecutorService executor; public TimerServerHandlerExecutePool(int maxPoolSize, int queueSize) { executor = new ThreadPoolExecutor(Runtime.getRuntime() .availableProcessors(), maxPoolSize, 120L,

Java NIO 底层原理

旧城冷巷雨未停 提交于 2020-03-05 10:06:43
目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 本文的知识,在《 Netty Zookeeper Redis 高并发实战 》 1.1. Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。 用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。 先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。 read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

高性能Server---Reactor模型

£可爱£侵袭症+ 提交于 2020-03-05 05:30:14
高性能Server---Reactor模型 原文地址: http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量

使用QueueUserAPC线程注入,

回眸只為那壹抹淺笑 提交于 2020-03-03 18:48:04
代码1 #define _WIN32_WINNT 0x0400 #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料 #include < iostream > #include < windows.h > #include < Winbase.h > using namespace std; DWORD WINAPI WorkThread(LPVOID pParam) { HANDLE Event = (HANDLE)pParam; for (;;) { DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE); if (dwRet == WAIT_OBJECT_0) break ; else if (dwRet == WAIT_IO_COMPLETION) printf( " WAIT_IO_COMPLETION\n " ); return 0 ; } } VOID WINAPI APCProc(LPVOID dwParam) { printf( " %s " , (PVOID)dwParam); } void TestAPC(BOOL bFast) { HANDLE QuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

java--BIO、NIO、AIO

独自空忆成欢 提交于 2020-03-03 18:23:13
java 的IO是什么? Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的,java io就是用来进行数据的操作的。 JAVA IO 的三种类型 同步阻塞的BIO 同步非阻塞的NIO 异步非阻塞的AIO 同步 : 使用同步IO时,Java自己处理IO读写。 异步 :使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作API。 阻塞 :使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。 非阻塞 : 使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成。 1.BIO(同步阻塞) 当对一个数据源进行IO操作时,其他操作流都不能对这个数据源进行操作,必须等操作完,其他操作流才能对该数据进行操作。 为什么是同步阻塞? 它其实就是服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个Socket进行通讯。接着客户端和服务端就进行阻塞式的通信,客户端发送一个请求,服务端Socket进行处理后返回响应。 每次一个客户端接入,都需要在服务端创建一个线程来服务这个客户端 (1)字节流 读取单个字节

Python--Demo18--异步IO之协程

≯℡__Kan透↙ 提交于 2020-03-02 12:50:04
协程: 使用一个线程来实现异步操作的。它相对于多线程执行效率高,不存在线程切换;此外协程不牵扯多线程中锁的机制,所以不必考虑加锁这些复杂操作。 协程是通过generator来实现的,就是yield关键字和send()函数的使用。 生成器的yield关键字: yield关键字可以将值(信息)返回,同时在信息返回后使程序停留在当前行。 >>> def test(): ... number=1 ... while True: ... number*=2 ... yield number ... print('yield下面的代码') ... >>> t=test() >>> t <generator object test at 0x000001E372BDA5F0> >>> type(t) <class 'generator'> >>> next(t) 2 >>> >>> next(t) yield下面的代码 4 >>> next(t) yield下面的代码 8 >>> next(t) yield下面的代码 16 生成器的send()函数: yield还可以接收调用者传递过来的信息:通过sned()函数,将值(消息)传递给生成器。生成器通过yield前面的变量来接收传递过来的值。 >>> def tst(): ... number=1 ... while True: ... pam