2019独角兽企业重金招聘Python工程师标准>>>

刚开始了解Node感觉很吊,各种说高性能,可是一直不理解为什么单线程会比多线程快?为什么异步IO比非阻塞IO快?因此,本篇在阅读相关书籍后,根据自己的理解,整理此文,如有错误,仅代表理论不精,必当修改,以免误导他人。还请多多指正.....

关于阻塞IO和非阻塞IO

系统内核只有两种IO模式—— 阻塞IO和非阻塞IO。这里的IO可不仅仅是读取文件内容,而是更为广泛的概念。比如Socket啊,网络Socket,磁盘读取等等,这些相比于CPU计算都是很耗时的。

下图为阻塞IO的工作模式:

阻塞IO在需要获取数据进行IO操作时,CPU会等待,当读取完成后,再继续运行。那么很容易就能想到,如果读取很耗时,CPU就会长期处于阻塞状态,显然效率很低。

再看看非阻塞IO:

非阻塞IO在进行IO操作时,会直接返回。然后CPU该干嘛干嘛,只不过需要一定的策略来确定什么时间请求数据完成,这个时候就需要一些轮训策略了,比如select poll等等。那么这个也应该能想到,当有长期的IO操作,会白白执行大量的查询操作,效率也不高。(当然目前的系统内的非阻塞IO都是很高级的玩法,卤煮也没有仔细研究,就不献丑了)

异步IO与Node工作原理

通过上面两种典型的IO操作,很显然,一种理想的模型是,有IO操作时,系统去执行IO操作,CPU该干嘛干嘛,当请求数据完成后,就通知CPU继续执行刚才没有完成的工作。

Node就是利用了javascript的回调函数思想,实现这种工作模式。

那么为什么单线程的Node会效率很高呢?什么又是事件机制呢?

原来,一直说的单线程,都是javascript端的,Node底层还是使用c来实现,因此底层仍然是多线程的。只不过,Node基于不同的操作系统linux或者windows之上实现了一个封装层,用户执行的操作命令会转交给这个封装层,由它再去判断操作系统,进而调用相应平台的c代码。

有点跑题了,简单的说,就是Node只是表面暴露给用户的javascript代码是单线程的,底层还是多线程的。

说到事件机制,就要上图了!

简单的解释一下,当我们使用Node的时候,会在javascript触发一些命令调用方法,这些方法会被包装成一个对象,放入线程池,然后前面的方法就返回了,继续执行下面的JS代码。

线程池中采用多线程的方式执行,执行完的对象放入事件循环队列。

事件循环队列采用类似while(true)这种循环的方式,不断的查看是否有事件,并且读取是否包含回调,由于前面回调函数被包装到对象中,这里直接调用执行就可以了。

通过这三种阶段,就实现了 【 异步请求——>回调 】 的工作模式。

转载于:https://my.oschina.net/u/204616/blog/545029

图解NodeJS【基于事件、回调的单线程高性能服务器】原理相关推荐

  1. linux C 基于事件回调的epoll反应堆模型

    先看一眼事件声明的结构体 #define MAX_EVENTS 1024 //监听上限数 #define BUFLEN 4096 #define SERV_PORT 8080void recvdata ...

  2. redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...

    Java相关的面试都会问到缓存的问题,基础一点的会问到什么是"二八定律".什么是"热数据和冷数据",复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存 ...

  3. 基于事件的 NIO 多线程服务器--转载

    JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...

  4. 基于事件的 NIO 多线程服务器

    2019独角兽企业重金招聘Python工程师标准>>> JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个 ...

  5. 基于事件的NIO多线程服务器

    JDK1.4的NIO有效解决了原有流式IO存在的线程开销的问题,在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个CPU的处理能力和处理中的等 ...

  6. 剖析nodejs的事件循环

    本文首发在github,感兴趣请点击此处 nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型.这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码.当异步事件触发之后,就会 ...

  7. 图解|高性能服务器设计之缓存系统一致性

    缓存系统交互 缓存系统设计是后端开发人员的必备技能,也是实现高并发的重要武器. 对于读多写少的场景,我们通常使用内存型数据库作为缓存,关系型数据库作为主存储,从而形成两层相互依赖的存储体系. 共识:我 ...

  8. 高性能dhcp服务器,基于线程池机制的高性能DHCP服务器研究与实现

    摘要: 随着互联网的蓬勃发展,IP地址资源越来越紧张.DHCP服务是在现有IPv4协议基础上解决IP地址资源短缺问题的有效途径. 目前,多数DHCP服务器是单线程运行,串行处理客户请求的.其应用于大型 ...

  9. dhcp计算机毕业论文,基于线程池机制的高性能DHCP服务器研究与实现-计算机科学与技术专业毕业论文.docx...

    文档介绍: 西北丁业大学硕士学位论文 摘要摘 要随着互联网的蓬勃发展,IP地址资源越来越紧张.DHCP服务是在现有IPv4协议基础上解决IP地址资源短缺问题的有效途径.目前,多数DHCP服务器是单线程 ...

最新文章

  1. oracle无法登录em,oracle em登陆不了,账户密码过期
  2. Emit应用中的常用技巧
  3. centOS安装pip
  4. Intellij Idea使用教程汇总篇
  5. linux线程间通信优点,进程间通信与线程间通信【转】
  6. 40无法u盘启动_戴尔主板bios设置u盘启动 戴尔台式电脑如何bios设置U盘启动教程...
  7. 使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...
  8. BZOJ 1072 排列
  9. hdu 1506:Largest Rectangle in a Histogram 【单调栈】
  10. 服务器显示A40故障码,求助大神,车子出现故障码,5053无法消除
  11. 思科模拟器Cisco Packet Tracer的中文安装 [含安装包]
  12. Dubbo的服务暴露过程
  13. php计算第几周,php计算当前是一年或一月中第几周的函数
  14. 服务器项目命名规则,云服务器命名规范
  15. java 主机字节序_java字节序、主机字节序和网络字节序扫盲贴
  16. res资源文件学习之res/values/attr.xml
  17. linux进程调度算法,关于嵌入式Linux系统实时进程调度算法系统详解
  18. HTML5期末大作业:体育网页设计——篮球专题6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  19. ALSA学习笔记 (1) ALSA 简介
  20. 分享4个不为人知的黑科技网站,每一个都让你大开眼界

热门文章

  1. 从山景城看,Android看起来像什么? 关于Google I / O的见解
  2. hbase 使用lzo_hadoop hbase lzo 安装
  3. Git关联多个远程仓库
  4. Qt开发经验总结之武林秘籍
  5. 齿轮-转子-轴承系统动力学matlab程序代码
  6. 乐动机器人 2D DTOF激光雷达 LD06、LD19驱动包开源仓库分享
  7. openldap 集成 sssd
  8. 音乐app、音乐原型、在线音乐、云音乐、听歌、电台、本地音乐、点赞、收藏、歌单广场、动态、社区、评论、歌词、歌手、主播、视频、云村、下载、翻唱、歌曲播放、订阅、频道、引导页、登录注册、axure原型
  9. python之文件操作、对.txt文本文件的操作(读、写、修改、复制、合并)、对json文本文件的操作、json字符串与字典的相互转换。
  10. 华为设备配置BGP负载分担