异步io

Java与Node.js性能PK

被刻印的时光 ゝ 提交于 2019-11-30 11:19:14
原文链接: www.tandemseven.com/b ... 如果你打开浏览器,搜索“Java与Node.js哪个更快”,你会发现大部分答案声称Node.js更快,也有一些人持相反意见。Java使用JIT编译器,其性能甚至可以超过C++。在这种情况下,为什么这么多人还是声称Node.js要比Java快呢?小编现在就跟大家一起往下看。 实际检验结果 实际上,在处理原始计算任务方面,Node.js并不比Java快;一旦涉及到IO型任务,Java就没有竞争力了。也就是说,在典型的Web应用程序执行的任务类型场景中,Node.js运行速度确实比Java更快,在接下来模拟的4种场景测试的结果充分验证了这一点。 性能因素 为了更好的理解Node.js如何完胜Java,需要考虑到3个性能因素:IO,并发和计算。这三大因素对于提高应用程序的整体运行速度和吞吐量都是有影响的。 1、IO 根据servlet规范,Java在早几年前引入的NIO实际上是Java编写后端服务器代码的标准。在整个规范中,servlet API都假定代码可以并且将在每个级别阻塞。虽然过去几年规范有所改进,能够允许非阻塞请求处理,但servlet规范的基本范例仍然完全包含IO阻塞。这意味着以非阻塞方式写入磁盘或使用JDBC写入数据库的操作会阻止处理线程执行任何其他操作。虽然Java能够以非阻塞的方式工作

漫谈linux文件IO

浪尽此生 提交于 2019-11-30 10:26:42
漫谈linux文件IO 转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。 穿越各层写文件方式 程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折中的方案来保证这些。让我们来看一个最常用的写文件典型example,也是路径最长的IO。 { char *buf = malloc(MAX_BUF_SIZE); strncpy(buf, src, , MAX_BUF_SIZE); fwrite(buf, MAX_BUF_SIZE, 1, fp); fclose(fp); } 这里malloc的buf对于图层中的application buffer,即应用程序的buffer;调用fwrite后,把数据从application buffer 拷贝到了 CLib buffer,即C库标准IObuffer

阻塞 、非阻塞;同步、异步

痴心易碎 提交于 2019-11-30 09:28:14
同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。 什么是同步和异步 同步请求 ,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。 异步请求 ,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。 所以说,同步和异步 最大的区别就是 被调用方的执行方式 和 返回时机 。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。 什么是阻塞和非阻塞 阻塞请求 ,A调用B,A一直等着B的返回,别的事情什么也不干。 非阻塞请求 ,A调用B,A不用一直等着B的返回,先去忙别的事情了。 所以说,阻塞非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。 阻塞、非阻塞和同步、异步的区别 首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。 阻塞、非阻塞说的是调用者 , 同步、异步说的是被调用者 。 有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。 Java中的三种IO模型 在Java语言中,一共提供了三种IO模型,分别是 阻塞IO

Java NIO之理解I/O模型(二)

此生再无相见时 提交于 2019-11-30 06:36:17
前言 上一篇文章 讲解了I/O模型的一些基本概念,包括同步与异步,阻塞与非阻塞,同步IO与异步IO,阻塞IO与非阻塞IO。这次一起来了解一下现有的几种IO模型,以及高效IO的两种设计模式,也都是属于IO模型的基础知识。 UNIX下可用的五种I/O模型 根据UNIX网络编程对IO模型的分类,UNIX提供了5中IO模型,下面分别来介绍一下。 阻塞I/O模型 最常见的一种IO模型,之前介绍过,一个read操作是分两个阶段的,第一个阶段是,等待数据准备就绪,第二个阶段是将数据拷贝到调用这个IO得线程中。阻塞是发生在第一个阶段的,当数据没有准备好时,会一直阻塞用户线程,当数据就绪后再将数据拷贝到线程中,并返回结果给用户线程。 大致过程如下图。 其实,大部分的socket接口都是典型的阻塞型。所谓阻塞型的接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。 通过介绍了阻塞IO,我们很容易就会发现它的问题,那就是阻塞会是用户线程无法进行任何运算和请求。一般我们的处理这种问题的情况是使用多线程,每个链接创建一个线程,或是使用线程池来管理线程,或许可以缓解部分压力,但是不能解决所有问题。多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求,多线程模型也会遇到瓶颈,可以用非阻塞接口来尝试解决这个问题。 非阻塞I/O模型

124 IO模型

二次信任 提交于 2019-11-30 06:32:48
一、IO模型介绍 回顾:同步、异步、阻塞、非阻塞 同步 : 指的是协同步调。既然叫协同,所以至少要有2个以上的事物存在。协同的结果就是:多个事物不能同时进行,必须一个一个的来,上一个事物结束后,下一个事物才开始。 异步 :就是步调各异,就是多个事物,你进行你的,我进行我的,谁都不用管谁,所有的事物都在同时进行中 总结 :同步就是多个事物不能同时开工,异步就是多个事物可以同时开工。 阻塞 :由于执行任务过程中遇到了阻塞,导致任务执行不了,处于等待的状态 非阻塞 :就是执行任务过程中没有遇到阻塞,进而可以一直执行任务 总结 :回到程序里,阻塞同样意味着停下来等待,非阻塞表明可以继续向下执行。 1.阻塞I/O模型(blocking I/O) 2.非阻塞I/O模型(noblocking I/O) 3.I/O多道复用(I/O multiplexing) 4.信号驱动I/O(signal driven I/O) 5.异步I/O(asynchronous I/O) 前四个I/O都被称之为同步I/O I/O发生时涉及的对象和步骤 :对于一个network I/O (网络I/O)(这里我们以read举例),它会涉及到两个系统对象,一个是调用这个I/O的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,该操作会经历两个阶段: 等待数据准备

网络IO

﹥>﹥吖頭↗ 提交于 2019-11-30 02:42:13
大并发服务器框架 大并发服务器设计目标 高性能(High Performance). 要求编写出来的服务器能够最大限度发挥机器性能, 使得机器在满负荷的情况下能够处理尽可能多的并发请求, 对于大量并发请求能够及时快速做出响应 高可用(High Availability). 要求服务器7*24小时服务, 故障转移 伸缩性(Scalability). 服务器具有良好框架, 分层设计, 业务分离, 并且能够进行灵活部署 分布式: 负载均衡 分布式存储 分布式计算 C/S结构: 任何网络系统都可以抽象为C/S结构(客户端, 服务端) 网络I/O+服务器高性能编程技术+数据库 超出数据库连接数: 数据库并发连接数10个, 应用服务器这边有1000个并发请求, 将会有990个请求失败. 解决办法: 增加一个中间层DAL(数据库访问控制层), 一个队列进行排队 超出时限: 数据库并发连接数10个, 数据库1秒钟之内最能处理1000个请求, 应用服务器这边有10000个并发请求, 会出现0-10秒的等待. 如果系统规定响应时间5秒, 则该系统不能处理10000个并发请求, 这时数据库并发能力5000, 数据出现瓶颈. 数据库瓶颈缓解 提高数据库的并发能力 队列+连接池(DAL) 主要逻辑挪到应用服务器处理, 数据库只做辅助的业务处理. 在数据库上进行计算能力或处理处理逻辑不如操作系统效率高. --

聊聊BIO、NIO与AIO的区别

烂漫一生 提交于 2019-11-29 21:41:38
题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? 1F 说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,只要具有输入输出类型的交互系统都可以认为是I/O系统,也可以说I/O是整个操作系统数据交换与人机交互的通道,这个概念与选用的开发语言没有关系,是一个通用的概念。 在如今的系统中I/O却拥有很重要的位置,现在系统都有可能处理大量文件,大量数据库操作,而这些操作都依赖于系统的I/O性能,也就造成了现在系统的瓶颈往往都是由于I/O性能造成的。因此,为了解决磁盘I/O性能慢的问题,系统架构中添加了缓存来提高响应速度;或者有些高端服务器从硬件级入手,使用了固态硬盘(SSD)来替换传统机械硬盘;在大数据方面,Spark越来越多的承担了实时性计算任务,而传统的Hadoop体系则大多应用在了离线计算与大量数据存储的场景,这也是由于磁盘I/O性能远不如内存I/O性能而造成的格局(Spark更多的使用了内存,而MapReduece更多的使用了磁盘)。因此,一个系统的优化空间,往往都在低效率的I/O环节上,很少看到一个系统CPU、内存的性能是其整个系统的瓶颈。也正因为如此,Java在I

Linux下5种IO模型以及阻塞/非阻塞/同步/异步区别

混江龙づ霸主 提交于 2019-11-29 19:29:34
1. 引言 同步(synchronous) I/O和异步(asynchronous) I/O,阻塞(blocking) I/O和非阻塞(non-blocking)I/O分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I/O和non-blocking I/O是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network I/O。 本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种I/O的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。 Linux下的五种I/O模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiplexing) 信号驱动I/O

3. 彤哥说netty系列之Java BIO NIO AIO进化史.md

青春壹個敷衍的年華 提交于 2019-11-29 18:43:37
你好,我是彤哥,本篇是netty系列的第三篇。 欢迎来我的公从号 彤哥读源码 系统地学习 源码&架构 的知识。 先说两个事 (1)上周五的那篇文章发重复了,是定时任务设置错误导致,给大家带来干扰,这里说声抱歉。 (2)之前的问卷调查结果出来了,认为先讲案例的票数较多,所以后面的文章都是先讲案例,再以案例展开讲解组件。 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/AIO。 本文将介绍Java中这三种IO的进化史,并从使用的角度剖析它们背后的故事。 Java BIO BIO概念解析 BIO,Blocking IO,阻塞IO,它是Java的上古产品,自出生就有的东西(JDK 1.0)。 使用BIO则数据准备和数据从内核空间拷贝到用户空间两个阶段都是阻塞的。 BIO使用案例 public class EchoServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8080); while (true) { System.out.println("start accept"); Socket socket = serverSocket.accept(); System.out

同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

主宰稳场 提交于 2019-11-29 17:26:26
原文链接https://www.cnblogs.com/euphie/p/6376508.html POSIX 同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。 POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO 按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧。 IO模型 这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会 从用户进程空间切换到内核空间运行一段时间再切换回来 。默认情况下recv会等到网络数据到达并且复制到用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。 阻塞IO模型 使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。 非阻塞IO模型 改变flags,让recv不管有没有获取到数据都返回