异步io

Pipe——高性能IO(二)

百般思念 提交于 2019-11-27 08:22:00
Pipelines - .NET中的新IO API指引(一) Pipelines - .NET中的新IO API指引(二) 关于 System.IO.Pipelines 的一篇说明 System.IO.Pipelines: .NET高性能IO System.IO.Pipelines 是对IO的统一抽象,文件、com口、网络等等,重点在于让调用者注意力集中在读、写缓冲区上,典型的就是 IDuplexPipe中的Input Output。 可以理解为将IO类抽象为读、写两个缓冲区。 目前官方实现还处于preview状态,作者使用Socket和NetworkStream 实现了一个 Pipelines.Sockets.Unofficial 作者在前两篇中提到使用System.IO.Pipelines 改造StackExchange.Redis,在本篇中作者采用了改造现有的SimplSockets库来说明System.IO.Pipelines的使用。 文章中的代码 ( SimplPipelines, KestrelServer ) ## SimplSockets说明 + 可以单纯的发送(Send),也可以完成请求/响应处理(SendRecieve) + 同步Api + 提供简单的帧协议封装消息数据 + 使用byte[] + 服务端可以向所有客户端广播消息 + 有心跳检测等等

关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

谁说胖子不能爱 提交于 2019-11-27 08:04:44
昨天面试的时候没有答上来同步与异步,阻塞与非阻塞的区别,回来搜了一下,发现这篇文章写的不错,转载学习一下,链接如下: https://blog.csdn.net/chen8238065/article/details/48315085 相关资料 IO基本概念 Linux环境 同步异步阻塞非阻塞 同步与异步 阻塞与非阻塞 IO模型Reference Link 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动异步IO模型 异步IO模型 总结 AIOBIONIO Java对BIONIOAIO的支持 AIOReference Link1ReferenceLink2 NIOReference Link epollselectpollReference Link LTETepoll select的几大缺点 poll实现 epollreference Link 总结 IOCP ReferenceLinkConcreteRealization 相关资料 IO基本概念 Linux环境 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)

blktrace分析IO

非 Y 不嫁゛ 提交于 2019-11-27 05:05:52
前言 由于在iostat输出中,只能看到service time + wait time,因为对于评估一个磁盘或者云磁盘而言,service time才是衡量磁盘性能的核心指标和直接指标。很不幸iostat无法提供这个指标,但是blktrace可以。 blktrace是一柄神器,很多工具都是基于该神器的:ioprof,seekwatcher,iowatcher,这个工具基本可以满足我们的对块设备请求的所有了解。 blktrace的原理 一个I/O请求,从应用层到底层块设备,路径如下图所示: 从上图可以看出IO路径是很复杂的。这么复杂的IO路径我们是无法用短短一篇小博文介绍清楚的。我们将IO路径简化一下: 一个I/O请求进入block layer之后,可能会经历下面的过程: Remap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备 Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O 被IO Scheduler依照调度策略发送给driver 被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备

linux 同步IO: sync、fsync与fdatasync

删除回忆录丶 提交于 2019-11-27 03:38:20
阅读目录 概述 关于sync, fsync, fdatasync, fflush 的区别 概述 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。 延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。 sync函数 sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。 通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。 fsync函数 fsync函数只对由文件描述符filedes指定的单一文件起作用

【IO多路复用】

五迷三道 提交于 2019-11-27 02:51:01
原文: 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 ”

nginx

徘徊边缘 提交于 2019-11-27 02:26:33
NGINX 1、异步:在发送数据给客户端是,不需要等待客户端确认,就可以继续发送第二个第三个数据过去,等发送完之后统一确认即可 2、非阻塞:在worker process等待IO的过程中,不需要等待,可以放下,去做别的工作,比如处理别的客户请求,等IO结束之后再回过来响应客户即可 3、事件驱动模型:在等待IO的过程中,不需要worker process去主动探测IO是否完成,这部分工作交给操作系统的事件驱动模型(如epoll)处理,等IO结束之后,直接epoll通知worker process即可,worker process再回过来响应客户即可。新请求到来,放入一个待处理列表,然后worker process使用非阻塞IO去处理这个列表 4、epoll事件驱动模型:就是等IO事件完成后内核自动通知worker process,而select和poll都是worker process主动去探测IO事件是否完成。 5、中断:是从应用程序或硬件到内核的操作,而事件驱动模型是从内核到应用程序的操作 来源: https://blog.51cto.com/13970077/2428723

Java中级知识归纳(三)

允我心安 提交于 2019-11-27 00:29:50
十一、Java垃圾回收机制   Java 的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。可以使用显式调用,System.gc();Runtime.getRuntime().gc();这两个方法调用时,用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。 十二、类加载器、类加载时机   类初始化的时机,有且仅有四个:A、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。   B、使用java.lang.reflect进行反射调用的时候。   C、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。   D、当虚拟机启动的时候,需要初始化main函数所在的类。 十三、Java IO和NIO的区别   NIO操作直接缓存区,直接与OS交互,Selector IO复用机制。    IO   NIO   面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器    Selector:Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道,这些通道里已经有可以处理的输入,或者选择已准备写入的通道

网络编程二-LINUX网络IO模型

泄露秘密 提交于 2019-11-26 19:25:31
目录 前言:网络编程里通用常识 一、同步和异步与阻塞和非阻塞 同步和异步 阻塞和非阻塞 两者的组合 二、五种I/O模型 阻塞I/O模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 5个I/O模型的比较 今天台风利奇马就要登陆浙江了,风那叫一个大啊,所以,就别出门了,老老实实在家学习看博客吧哈O(∩_∩)O 前言:网络编程里通用常识 既然是网络编程肯定是面临着通信的,既然是通信,那么是肯定是有两个对端的。在通信编程里提供服务的叫服务端,连接服务端使用服务的叫客户端。在开发过程中,如果类的名字有Server或者ServerSocket的,表示这个类是给服务端用的,如果类的名字只有Socket的,那么表示这是负责具体的网络读写的。那么对于服务端来说ServerSocket就只是个场所,具体和客户端沟通的还是一个一个的socket,所以在通信编程里,ServerSocket并不负责具体的网络读写,ServerSocket就只是负责接收客户端连接后,新启一个socket来和客户端进行沟通。这一点对所有模式的通信编程都是适用的。 在通信编程里,我们关注的其实也就是三个事情:连接(客户端连接服务器,服务器等待和接收连接)、读网络数据、写网络数据,所有模式的通信编程都是围绕着这三件事情进行的。那么今天我们围绕双方通信的模型进行展开吧。 一、同步和异步与阻塞和非阻塞

socket阻塞与非阻塞,同步与异步【转】

岁酱吖の 提交于 2019-11-26 18:31:43
原文: socket阻塞与非阻塞,同步与异步 作者: huangguisu 1. 概念理解 在进行网络编程时,我们常常见到 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock) 四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 也就是必须一件一件事做 , 等前一件做完了才能做下一件事。 例如普通 B/S 模式(同步):提交请求 -> 等待服务器处理 -> 处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 例如 ajax请求( 异步) : 请求通过事件触发 -> 服务器处理(这是浏览器仍然可以作其他事情) -> 处理完毕 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在s ocket 中调用r ecv 函数,如果缓冲区中没有数 据,这个函数就会一直等待,直到有数据才返回。而此时

Netty相关

☆樱花仙子☆ 提交于 2019-11-26 17:09:42
1.BIO、NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理, BIO是面向流的,NIO是面向缓冲区的;BIO的各种流是阻塞的。而NIO是非阻塞的;BIO的Stream是单向的,而NIO的channel是双向的。 NIO的特点:事件驱动模型、单线程处理多任务、非阻塞I/O,I/O读写不再阻塞,而是返回0、基于block的传输比基于流的传输更高效、更高级的IO函数zero-copy、IO多路复用大大提高了Java网络应用的可伸缩性和实用性。基于Reactor线程模型。 在Reactor模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。如在Reactor中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事件、事件到来,激活分发器,分发器调用事件对应的处理器、事件处理器完成实际的读操作,处理读到的数据,注册新的事件