处理大并发之一 对异步非阻塞的理解

2023-11-20

处理大并发之一 对异步非阻塞的理解

    在研究nginxnode.js的时候常会遇到异步、非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下。

    首先讨论下使用事件驱动,异步编程的优点:

    充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。其非常适合于后端的网络服务编程。

    在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。其nginxnode.js处理并发都是采用的事件驱动异步非阻塞模式。其中nginx中处理并发用的是epollpoll,queue等方式,node.js使用的是libev,它们对大规模的HTTP请求处理的都很好。

阻塞

    《node.js开发指南》是这样定义的:线程在执行中如果遇到(I/O 操作)如磁盘读写或网络通信,通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。

非阻塞

    非阻塞是这样定义的,当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。

对比阻塞与非阻塞

    阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。

    非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的 CPU 核心利用率永远是 100%,I/O 以事件的方式通知。

    在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞时还有其他线程在工作,多线程可以让 CPU 资源不被阻塞中的线程浪费。

    而在非阻塞模式下,线程不会被 I/O 阻塞,永远在利用 CPU。多线程带来的好处仅仅是在多核 CPU 的情况下利用更多的核。

    来看看《深入浅出Node.js对异步I/O的解释,在操作系统中,程序运行的空间分为内核空间和用户空间。我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务。

    I/O的阻塞与非阻塞的解释

    阻塞模式的I/O会造成应用程序等待,直到I/O完成。同时操作系统也支持将I/O操作设置为非阻塞模式,这时应用程序的调用将可能在没有拿到真正数据时就立即返回了,为此应用程序需要多次调用才能确认I/O操作完全完成。

    I/O的同步与异步I/O的同步与异步出现在应用程序中。如果做阻塞I/O调用,应用程序等待调用的完成的过程就是一种同步状况。相反,I/O为非阻塞模式时,应用程序则是异步的。

    参照《node.js入门经典》中对同步的解释,同步的代码意味着每一次执行一个操作,在一个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上。也就是说代码的执行会在函数返回前停止。直到函数返回后,代码才会继续执行。

相反,异步就意味着函数的执行无需等待某个操作的结果就可以继续执行,其操作的结果会在事件发生时由回调来处理。

异步I/O优缺点

    使用同步IO,它的优点是可以使程序调试方便,但是它的缺点也是明显的,程序的执行过程中如果入到一些耗时的IO操作,程序的执行都要等待该IO的完成,在这个等待的过程中,程序无法充分利用CPU,导致了CPU的闲置,为了充分利用CPU,和IO并行操作,常用的方法有2中:

    (1)多线程单进程

    多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果。

    多线程缺点:

    其一、执行时(线程切换)上下文交换的开销较大,一个线程大约需要2M的内存空间,占用资源较大。

    其二、状态同步(锁)的问题,它也使得程序的编写和调用复杂化。

    (2)单线程多进程

    为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启动多进程的方式来达到充分利用CPU和提升总体的并行处理能力。它的缺点在于业务逻辑复杂时(涉及多个I/O调用),因为业务逻辑不能分布到多个进程之间,事务处理时长要远远大于多线程模式。

异步I/O与轮询技术

    当进行非阻塞I/O调用时,要读到完整的数据,应用程序需要进行多次轮询,才能确保读取数据完成,以进行下一步的操作。轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。现存的轮询技术有以下这些: read、select、poll、epoll、pselect、kqueue 

    read是性能最低的一种,它通过重复调用来检查I/O的状态来完成完整数据读取。

    select是一种改进方案,通过对文件描述符上的事件状态来进行判断。

    操作系统还提供了poll、epoll等多路复用技术来提高性能。

    轮询技术满足了异步I/O确保获取完整数据的保证。但是对于应用程序而言,它仍然只能算时一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间来等待。上一种方法重复调用read进行轮询直到最终成功,用户程序会占用较多CPU,性能较为低下。而实际上操作系统提供了select方法来代替这种重复read轮询进行状态判断。select内部通过检查文件描述符上的事件状态来进行判断数据是否完全读取。但是对于应用程序而言它仍然只能算是一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间等待,select也是一种轮询。

理想的异步I/O模型

    理想的异步I/O应该是应用程序发起异步调用,而不需要进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调将数据传递给应用程序即可。

    暂时就整理这么多吧,感觉好多看过的东西都忘记了,回头会写一篇关于epoll使用的详细例子,该例子支持2W并发是通过的。哎,今天状态不好,写的不好,本打算自己多加点什么的,结果都是参考别人的,如有错误请大家指正,谢谢。

参考资料:

node.js入门经典》 George Ornbo 著 傅强 陈宗赋 译 人民邮电出版社

《深入浅出node.js

node.js开发指南》 BYVoid 人民邮电出版社

 




FROM: http://blog.csdn.net/feitianxuxue/article/details/8936802

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理大并发之一 对异步非阻塞的理解 的相关文章

  • Entity Framework Core系列教程-3为现有数据库生成实体模型

    在Entity Framework Core中为现有数据库创建模型 在这里 您将学习如何在Entity Framework Core中为现有数据库创建上下文和实体类 为现有数据库创建实体和上下文类称为Database First方法 EF
  • 俄罗斯方块游戏(C语言)

    简介 俄罗斯方块 Tetris 是一款经典的游戏 下面是用C语言实现俄罗斯方块的示例代码 code include
  • Android kotlin使用注解实现防按钮连点功能

    SingleClick Retention AnnotationRetention RUNTIME Target AnnotationTarget FUNCTION annotation class SingleClick 点击间隔时间 毫
  • 计算机网络那些事之 MTU 篇

    哈喽大家好 我是咸鱼 今天我们来聊聊计算机网络中的 MTU Maximum Transmission Unit 什么是 MTU MTU Maximum Transmission Unit 是指数据链路层中的最大传输单元 通俗点来讲 MTU
  • 建模方法(十)-灰色预测模型GM(1,1)

    引言 灰色预测的主要特点是模型使用的不是原始数据序列 而是生成的数据序列 其核心体系是灰色模型 Grey Model 简称GM 即对原始数据作累加生成 或其它方法生成 得到近似的指数规律再进行建模的方法 灰色预测模型对于不同问题采用不同模型
  • git常见问题总结

    文章目录 1 xxx com port 22 Connection refused 2 xcrun error invalid active developer path 3 终端使用git发现不能用这么办 4 lt lt lt lt lt
  • Python手册(Python Basics)--Python基础

    本站已停止更新 查看最新内容请移至本人博客 Wilen s Blog 文章目录 对象 标量 运算符 数据类型 tuple 元祖 list 列表 dict 字典 set 集合 列表 集合和字典推导式 iterator 迭代器 and gene
  • 设置mysql远程登录

    要将MySQL的root用户授权远程登录 请按照以下步骤操作 使用root用户登录到MySQL mysql u root p 在MySQL命令行中 输入以下命令以创建root用户可以从任何IP地址访问的用户 GRANT ALL PRIVIL
  • java: 二元运算符 ‘<‘ 的操作数类型错误 第一个类型: java.lang.Object 第二个类型: java.lang.Object

    在对对象进行大小比较时 运行就会出现下面报错 原因不能使用 gt 运算符对两个Object对象进行比较 gt 运算符只能直接用于原始整数类型 解决方法 1 将Object进行转换 转换成比如转换成Character类 String类 Int
  • 二分答案总结&例题解析

    对于二分我们最初的了解 就是在一个一次函数中 对于要求的点 x y 已知y 对于包含x值的区间二分 根据函数值与y比较 逐步靠近要求的点 直到最终求出要求的点 在程序执行时 二分的时间复杂度为logn 可以极大的减少查找的时间 二分的应用
  • Fiddler的安装和使用教程(详细)

    一 安装 1 fiddler工具下载网址 http www telerik com download fiddler 2 运行 FiddlerSetup exe一键完成安装 3 安装成功后点击关闭按钮 所选路径下多出一个Fiddler文件夹
  • 朋友问我,程序员和非程序员的思维模式有什么区别?

    英文 https javascript plainenglish io what is the difference in thinking model between programmers and normal persons 8ff8
  • dokcer命令一览

    Docker服务状态 安装参考 https yutian blog csdn net article details 119705377 1 为什么要使用Docker Docker是开发运维一体化的核心工具 提高开发 测试 运维的生命周期的
  • Linux下安装tomcat

    1 上传tomcat到root目录 通过ftp软件将tomcat上传到root目录下 在 usr local 创建一个tomcat目录 复制tomcat到 tomcat目录下 解压 tar 运行命令 tar xvf apachexxx 2

随机推荐

  • 如何在Oracle VM VirtualBox上安装ubuntu

    虚拟机链接 Virtual Box Downloads Oracle VM VirtualBox Ubuntu Ubuntu系统下载 Ubuntu 点开链接后进入首页如图 点击桌面系统进入 点击下载 下载完成后不用解压 打开Oracle V
  • 数学建模:18 粒子群算法

    目录 基础的粒子群算法 流程图 核心公式 改进惯性权重 线性递减的惯性权重 非线性递减的惯性权重 自适应的惯性权重 随机的惯性权重 改进学习因子 压缩学习因子 非对称学习因子 改进 自动退出迭代 测试函数 Matlab 自带的粒子群函数 p
  • 一种把四个字节(BYTE)组成一个32位int型的方法

    实现代码如下 int ConvertTo32 int la int lb int lc int ld la 0XFFFFFF la lt lt 24 lb 0XFF00FFFF lb lt lt 16 lc 0XFFFF00FF lc lt
  • linux扩展/dev/sda1分区方法

    一 准备 扩展虚拟机的磁盘空间 在虚拟机关闭状态下 点击虚拟机 gt 设置 gt 硬盘 gt 扩展 扩展自己需要的容量 二 开始扩展 idriver ubuntu su 1 切换至root用户 root ubuntu home idrive
  • Kettle教程(一):ETL简介、Kettle安装部署

    文章目录 前言 一 ETL 1 ETL是啥 2 ETL有啥价值 二 Kettle 1 简介 2 安装 三 总结 前言 随着大数据的不断发展 企业级别的数据转换显得尤为重要 从本文开始和大家一起学习一款开源ETL工具 Kettle 一 ETL
  • Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 1 什么是插件化 能运行的宿主APP去加载没有下载的APK文件 并使用APK文件里面的功能 这就叫插
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • equals()方法的重写

    equals 本身是一个方法 并不是运算符 而且仅适用于引用数据类型 在java的引用数据时使用时 比较的并不是具体的数值 而是地址值 此时并不能有效地比较引用数据类型中的具体数据 比较地址值对于引用数据类型而言没有用 就出现了equals
  • 数组添加元素的方法-6种

    数组添加元素的方法 6种 使用 length 属性追加元素 使用length属性 可以在数组末尾后面添加一个元素 var arr 1 2 3 4 5 arr length 6 console log arr 1 2 3 4 5 6 使用 p
  • 远程控制 ToDesk

    ToDesk 远程控制软件 支持跨平台的远程控制 有且不限于PC对PC iOS Android也可以直接控制 最近发现的一个好用的远程连接软件 也是近些年非常火热的 远程控制软件 ToDesk 虽然 QQ 和 向日葵 也都可以满足我们实现的
  • 深入理解spring注解之@ComponentScan注解

    2018 05 20 10 02 23 今天主要从以下几个方面来介绍一下 ComponentScan注解 ComponentScan注解是什么 ComponentScan注解的详细使用 1 ComponentScan注解是什么 其实很简单
  • nginx配置同时支持https/wss协议(http/https ws/wss)都可以

    在Nginx代理集群支持SSL 整体架构如下 SSL SSL Secure Socket Layer 安全套接层 简单来说是一种加密技术 通过它 我们可以在通信的双方上建立一个安全的通信链路 因此数据交互的双方可以安全地通信 而不需要担心数
  • iis6.0配置与漏洞复现

    实验环境 windows sesrver 2003 asp环境 1 iss服务器的搭建 1 点击开始 gt 控制面板 gt 添加或删除程序 2 点击添加或删除程序 3 点击应用程序服务器 gt 点击详细信息 点击确定完成配置 4 点击开始
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • python 使用setup.py安装packages

    前置条件 安装了python 我的版本是python 3 6 5 安装pip 1 打开cmd 2 安装pip python m ensurepip 3 升级pip python m pip install upgrade pip 本地安装
  • 【ChatGPT实践篇】给小孩制作一个数字人恐龙科普短视频

    以下文章来源于飞书 1 科普文本生成 起初我也是试了不少prompts去让chatgpt自由发挥 生成恐龙科普文章 但科普内容要么过于复杂 要么过于宽泛 无法到达自己想要的效果 既然如此 我决定定制化科普内容 让它实现我的想法 1 1 确定
  • 编译原理13:SLR(1)分析表、LR(1)分析表

    更强的LR分析 可以根据当前单词 来选择是移进还是归约 只要所有移进项目中的点后面的那些终结符 与归约项目生成的非终结符的Follow集合的元素没有重叠 若当前单词属于上述Follow集合里则规约 SLR 1 冲突解决办法 SLR 1 分析
  • c++学习笔记

    c 学习笔记 1 安装环境 1 安装环境 windows 下载MinGW w64 linux
  • 在Mac上安装ArduinoIDE并布置环境支持NodeMcu

    前言 笔者最近在研究Swoole 因为对物联网很感兴趣 在某宝上买来了 NodeMcu 开发板 关于NodeMcu大家请提前做好功课 我选择的是CP2102版 Swoole TCP Server负责和小车通讯 Swoole WebScoke
  • 处理大并发之一 对异步非阻塞的理解

    处理大并发之一 对异步非阻塞的理解 在研究nginx和node js的时候常会遇到异步 非阻塞等 之前自己也经常使用epoll 对其同步与阻塞 异步与非阻塞有了一定的认识 现对参考资料总结下 首先讨论下使用事件驱动 异步编程的优点 充分利用