异步io

nodejs原理

允我心安 提交于 2019-12-05 14:12:04
即使还没有用nodejs写过什么项目,但是,核心中的核心,原理中的原理,maybe已经掌握到了。 先说nodejs和java对于并发处理上到区别。 java是最熟悉的了,所有人都知道,java在处理并发业务的时候是直接开一个线程去做。如下图所示 即使新开了线程,在并发更高的情况下,还是会出现等待,这是必然的。多个线程的并行运行,cpu会不断的在线程的上下文之间切换,会增加服务器的负担,多线程的创建和删除也会产生内存上的负担和GC的负担。当一个线程去完成一个业务的时候如果遇到IO操作还是会让线程进行阻塞,也就是说拜托不了任务同步的问题。 但是nodejs的处理方式是孑然不同,因为它的特点是单线程,异步IO,事件循环。 先说nodejs的单线程。关于它的单线程,有一个最直观的理解就是开发者不能自己新建线程去处理一个任务,对于web应用所有的请求的处理都是在一个主线程中完成的,所有请求的处理和请求的响应都是在一个线程中。这样的话当前的cpu只对当前的任务进行处理,不会同时处理多个请求,自然也就不需要像java那样需要锁,加锁,解锁,死锁各种问题。但是你也不能理解成进来一个请求就处理,处理完之后再处理下一个请求,这样的话也太low了吧。这里就提到了异步io 异步io的意思就是当主线程处理请求遇到io操作的时候不会由主线程自己去完成(因为这样会造成主线程的阻塞),而是交给libuv

BIO、NIO、AIO有什么区别?

梦想的初衷 提交于 2019-12-05 11:00:10
BIO:线程发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。 NIO:线程发起 IO 请求,立即返回;内核在做好 IO 操作的准备之后,通过调用注册的回调函数通知线程做 IO 操作,线程开始阻塞,直到操作完成。 AIO:线程发起 IO 请求,立即返回;内存做好 IO 操作的准备之后,做 IO 操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做 IO 操作完成或者失败。 BIO 是一个连接一个线程。 NIO 是一个请求一个线程。 AIO 是一个有效请求一个线程。 BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的 IO 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。 适用场景分析 BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。 NIO

IO模式和IO多路复用

ぐ巨炮叔叔 提交于 2019-12-05 09:42:55
原文链接: https://www.cnblogs.com/zingp/p/6863170.html https://www.cnblogs.com/guxuanqing/p/10482066.html   网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人装13不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。 回到顶部 1 基础知识回顾 注意: 咱们下面说的都是 Linux环境 下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间   现在操作系统都采用虚拟寻址, 处理器先产生一个虚拟地址 ,通过 地址翻译成物理地址(内存的地址) ,再通过总线的传递,最后处理器拿到某个物理地址返回的字节。   对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用

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

心不动则不痛 提交于 2019-12-04 22:56:26
你好,我是彤哥,本篇是netty系列的第三篇。 简介 上一章我们介绍了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.println("new conn: " + socket.getRemoteSocketAddress()); new Thread(()->{ try { BufferedReader reader = new BufferedReader(new

Netty学习第三章--Linux网络编程使用的I/O模型

旧巷老猫 提交于 2019-12-04 18:39:17
一、同步阻塞IO:blocking IO(BIO)    1.过程分析:   当进程进行系统调用时,内核就会去准备数据,当数据准备好后就复制到内核缓冲器,返回成功后将数据复制给进程内存,其中这一系列过程就是阻塞的。 2.特点:   优点:能及时响应数据   缺点:因为整个过程都是阻塞的,所以高并发下性能非常差 二、同步非阻塞IO:nonblocking IO(NIO)    1.过程分析:   当进程调用系统时,会立即返回error,当用户知道返回的是error后就知道数据没有准备好,此时进程进行等待,这一个过程是没有阻塞的,因此可以有多个调用请求。当第一个请求来到时,内核会去准备数据,就和BIO的模式一样,当数据准备好后,复制给用户进程内存,这一个过程是阻塞的,但是用户进程会一直去轮询判断数据是否已经准备好了。 2.特点:   优点:能够在数据处理好之前去做其他的事情   缺点:性能依旧很差,第一需要不断去判断数据释放准备好了;第二在拷贝数据这个过程中,进程依旧书阻塞的;第三因为是轮询去找数据,所以数据会有延迟 三、IO多路复用    1.定义:   所谓的IO多路复用指的就是一个或多个线程处理多个TCP连接。 2.网络模型:   IO多路复用的网络模型有三种:   ①select模型:   调用select函数时会阻塞住进程,等有数据可读、可写、出异常或者超时就会返回

并发编程

做~自己de王妃 提交于 2019-12-04 06:55:09
目标:让服务端能够支持高并发+高性能一、 操作系统发展史 多道技术(*****) 产生背景:想要在单核下实现并发 多道技术的核心: 1、空间上的复用(具体指的是内存中同时读入多道程序,多道程序的内存空间是物理隔离) 2、时间上的复用(复用cpu的时间) 切换+保存状态=》并发 切换: 1、遇到IO切换(可以提升效率) 2、运行时间过长或者有一个优先级更高的进程抢走了cpu(反而会降低效率) 二、进程 (参考博客: https://www.cnblogs.com/linhaifeng/articles/7428874.html ) 1、进程理论(*****) 1、进程与程序区别 2、并发与并行 并发:看起来同时运行,单核就可以实现并发,但是单核无法实现并行 并行:真正意义上的同时运行,一个cpu同一时刻只能做一件事 只有多核才能同时做多件事,即并行的效果 串行:按照固定的顺序一个个地执行 3、不同操作系统开启子进程的区别 4、一个进程的三种运行状态 2、开启进程的两种方式(*****) #方式一 from multiprocessing import Process import time def task(name): print('%s is running' %name) time.sleep(3) print('%s is done' %name) if __name__ =

Oracle 异步IO 优缺点

你离开我真会死。 提交于 2019-12-04 06:04:50
一、 Oracle在Linux下使用异步IO配置 最近在测试Oracle的时候,很想测试下使用异步IO的性能。但是异步IO是需要专门配置的,否则的话,容易遇到很著名的“ORA-01578: ORACLE data block corrupted (file # 202, block # 257)”的问题。 那么什么是异步IO呢,异步IO有什么好处? 一般说来,异步I/O是和同步I/O相比较来说的,如果是同步I/O,当一个I/O操作执行时,应用程序必须等待,直到此I/O执行完. 相反,异步I/O操作在后台运行,I/O操作和应用程序可以同时运行,提高了系统性能; 使用异步I/O会提高I/O流量,如果应用是对裸设备进行操作,这种优势更加明显, 因此象数据库,文件服务器等应用往往会利用异步I/O,使得多个I/O操作同时执行. Oracle在默认情况是不使用异步IO的。可查看参数filesystemio_options(默认值为none),有四种选项 ■ ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission. ■ DIRECTIO: enable direct I/O on file system files, which bypasses

聊聊Linux 五种IO模型

▼魔方 西西 提交于 2019-12-04 04:48:18
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 上一篇 《聊聊同步、异步、阻塞与非阻塞》 已经通俗的讲解了,要理解同步、异步、阻塞与非阻塞 重要的两个概念点 了,没有看过的,建议先看这篇博文理解这两个概念点。在认知上,建立统一的模型。这样,大家在继续看本篇时,才不会理解有偏差。 那么,在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 #1 概念说明# 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO ##1.1 用户空间与内核空间## 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。 操作系统的核心是内核,独立于普通的应用程序

PHP并发IO编程之路

Deadly 提交于 2019-12-04 03:56:53
并发 IO 问 题一直是后端编程中的技术挑战,从最早的同步阻塞Fork进程,到多进程/多线程,到现在的异步IO、协程。PHP程序员因为有强大的LAMP框架,对底 层方面的知识知之甚少,本文目的就是详细介绍PHP进行并发IO编程的各种尝试,最后再介绍Swoole的使用,深入浅出全面理解并发IO问题。 多进程 / 多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发 IO 的问题。进程模型出现的最早,从 Unix 系统诞生就开始有了进程的概念。 最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。 多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间是共享内存堆栈 的,所以不同的线程之间交互非常容易实现。比如聊天室这样的程序,客户端连接之间可以交互,比聊天室中的玩家可以任意的其他人发消息。用多线程模式实现非 常简单,线程中可以直接读写某一个客户端连接。而多进程模式就要用到管道、消息队列、共享内存实现数据交互,统称进程间通信( IPC )复杂的技术才能实现。 代码实例: 多进程 / 线程模型的流程是 创建一个 socket ,绑定服务器端口( bind ),监听端口( listen ),在 PHP 中用 stream_socket_server 一个函数就能完成上面 3 个步骤

PHP并发IO编程之路

非 Y 不嫁゛ 提交于 2019-12-04 03:56:42
并发 IO 问 题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在的异步IO、协程。PHP程序员因为有强大 的LAMP框架,对这类底层方面的知识知之甚少,本文目的就是详细介绍PHP进行并发IO编程的各种尝试,最后再介绍Swoole的使用,深入浅出全面解 析并发IO问题。 多进程 / 多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发 IO 的问题。进程模型出现的最早,从 Unix 系统诞生就开始有了进程的概念。 最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。 多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间是共享内存堆栈 的,所以不同的线程之间交互非常容易实现。比如聊天室这样的程序,客户端连接之间可以交互,比聊天室中的玩家可以任意的其他人发消息。用多线程模式实现非 常简单,线程中可以直接向某一个客户端连接发送数据。而多进程模式就要用到管道、消息队列、共享内存,统称进程间通信( IPC )复杂的技术才能实现。 代码实例: 多进程 / 线程模型的流程是 创建一个 socket ,绑定服务器端口( bind ),监听端口( listen ),在 PHP 中用 stream_socket_server 一个函数就能完成上面