底层操作系统,异步通过信号量、消息等方式有着广泛的应用。

PHP语言从头到尾都是以同步堵塞方式执行,利于程序猿顺序编写业务逻辑。

异步I/O、事件驱动、单线程构成Node的基调。

why异步I/O

(1)、用户体验

在Web2.0中Ajax广泛应用异步刷新机制能够更好的提高用户体验,消除UI堵塞。后端相同採用异步I/O能够有效较少同一时候请求多个资源的效应时间其为max(M,N)。

(2)、资源分配

多任务主流方式:

a. 单线程异步I/O

b. 多线程并行

多线程的代价在于创建线程和运行期线程上下午切换的开销较大。在复杂场景中,多线程常常面临锁、状态同步的问题。但多线程能够更有效的利用多核CPU,提高利用率。

NodeJS利用单线程远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离堵塞,以更好利用CPU。

为了弥补单线程无法利用多核CPU特点,Node採用类似Web Workers的子进程。

异步I/O

操作系统内核对于I/O仅仅有两种方式:堵塞和非堵塞

堵塞I/O一个特点是调用之后一定要等到系统内核层面完毕全部操作后,调用才结束。其造成CPU等待I/O,浪费时间和资源,CPU利用不充分。

非堵塞I/O不同之处在于调用之后会马上返回。其问题在于为了获取完整的数据,应用程序须要反复调用I/O操作来确认是否完毕,这样的反复调用判定是否完毕的技术叫做轮询

堵塞I/O会造成CPU等待浪费、非堵塞I/O须要轮询确认数据是否全然获取,让CPU处理状态推断,也会浪费CPU。轮询技术主要有下面几种:

(1) read。最原始效率最低的一种,反复调用来检查I/O的状态来完毕完整的数据读取。

(2) select。在read上改进,通过对文件描写叙述符上的事件状态进行推断。有个限制是因为採用1024长度的数组存储状态,最多能够同一时候检查1024个文件描写叙述符。

(3) poll。採用链表的方式避免数组长度的限制,其次能避免不须要的检查。但文件较多的时候,性能还是十分低下。

(4) epoll。linux下效率最高的I/O事件通知机制,在进行轮询的时候假设没有检查到I/O事件,将会进行休眠,直到事件发生将其唤醒。真实利用事件通知、运行回调的方式、而不是遍历查询。kequeue和epoll类似应用在FreeBSD下。

理想非堵塞异步I/O

多线程模拟理想非堵塞异步I/O,通过部分线程运行堵塞I/O或非堵塞I/O加轮询技术完毕数据获取,让一个线程进行计算处理,通过线程之间的通信将I/O得到的数据进行传递。

glibc的AIO是典型的线程池模拟异步I/O,然而其存在一些难以忍受缺陷,不推荐。

libio是由libev的作者又一次实现的一个异步I/O库,实质仍然是採用线程池与堵塞I/O模拟异步I/O。

IOCP是windows平台的异步I/O方案,提供理想的异步I/O:调用异步方法、等到I/O完毕后通知、运行回调、用户无需考虑轮询。其内部仍然是採用线程池原理,只是是线程池由系统内核管理。

Node提供libuv作为抽象封装层,兼容windows平台和*nix平台。

Node是单线程,这里的单线程仅仅是指JavaScript运行在单线程中。在Node中,不管是windows或*nix平台,内部完毕I/O任务另有线程池,仅仅是对用户透明罢了。Node自身事实上是多线程,仅仅是I/O线程使用CPU较少,除了用户代码无法并行运行,全部的I/O则是并行运行。

Node的异步I/O

Node运行模型—事件循环

在进程启动的时候Node会创建一个类似while(true)的循环,每次运行一个循环体的过程称为Tick。每一个Tick过程就是查看是否有事件待处理,若有则取出事件及其相关的回调函数,若存在关联的回调函数,则运行。

观察者

每一个事件循环中有一个或多个观察者,推断是否有事件待处理的过程就是向这些观察者询问是否有要处理的事件。

事件循环是一个典型的生产者/消费者模型。异步I/O、网络请求等是事件的生产者、源源不断为Node提供不同类型的事件、这些事件被传递到观察者那里,事件循环从观察者那里取出事件并处理。在Windows下,这个循环基于IOCP创建,而在*nix则基于多线程创建。

请求对象

从JavaScript发起调用到内核运行完毕I/O操作的过渡过程中,存在一个中间产物称为请求对象。

事件循环观察者请求对象I/O线程池共同构成Node异步I/O模型的基本要素。

非I/O的异步API

setTimeout()setInterval()分别用于单次和多次运行任务,其创建的定时器会被插入到定时器观察者内部的一个红黑树中。每次Tick运行时,会从该红黑树中迭代取出定时器对象,检查是否超过定时时间,若超过则形成一个事件,其回调函数马上运行。

定时器的问题在于,它并不是精确的,虽然事件循环十分快,但有可能某次Tick运行时间比較长。

process.nextTick()将回调函数放入到队列中,在下一轮Tick时取出运行,能够达到setTimeout(fn,0)的效果,因为不须要动用红黑树,效率更高时间复杂度为O(1)。

setImmediate()也是将回调函数延迟运行,process.nextTick()中的回调函数运行的优先级要高于setImmediate()。因为事件循环对观察者的检查是有先后顺序的,process.nextTick()属于idle观察者,setImmediate()属于check观察者,优先级例如以下idle观察者>I/O观察者>check观察者

process.nextTick()的回调函数保存在数组中,每次Tick会将数组中的回调函数所有运行;setImmediate()的回调函数保存在链表中,每次Tick仅仅运行链表中的一个回调函数。

转载于:https://www.cnblogs.com/lcchuguo/p/4072215.html

深入浅出NodeJS——异步I/O相关推荐

  1. Node.js: 深入浅出Nodejs读书笔记

    今天终于把朴灵老师写的<深入浅出Node.js>给学习 完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内 ...

  2. nodejs异步测试_异步过程的自动化测试

    nodejs异步测试 自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了,而该行为还不是事件驱动的系统. 异步行为始终是设计和测试中一个有趣的挑战. 通常,异步行为不应该很难进行单元测试– ...

  3. java socket 异步回调函数,分享nodejs异步编程基础之回调函数用法

    nodejs异步编程基础之回调函数用法分析 本文实例讲述了nodejs异步编程基础之回调函数用法.分享给大家供大家参考,具体如下: Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实 ...

  4. NodeJs 异步非阻塞

    一般来说,高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步 I/O,系统通过线程切换来弥补同步 I/O 调用的时间开销.比如 Apache 就是这种策略,由于 I/O ...

  5. 《深入浅出Nodejs》—— 读后总结

    这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动 ...

  6. nodejs异步流程控制

    场景: 1.图片上传服务器 2.图片写入磁盘 3.图片写入数据库 在nodejs里面这三种方式都是异步操作,不想java其他语言同步进行,这就需要对异步流程进行控制,保证1,2,3逐步进行.有可能1还 ...

  7. Nodejs异步回调的优雅处理方法

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...

  8. nodejs异步流程控制co 模块

    万恶的回调 对前端工程师来说,异步回调是再熟悉不过了,浏览器中的各种交互逻辑都是通过事件回调实现的,前端逻辑越来越复杂,导致回调函数越来越多,同时 nodejs 的流行也让 javascript 在后 ...

  9. 《深入浅出NodeJS》读书笔记

     NodeJS NodeJS 4个特点:异步I/O,事件驱动与回调,单线程事件轮询,跨平台. NodeJS 5个大坑:异常处理,嵌套太深,没有Sleep,多线程编程,异步转同步. NodeJS 4 ...

最新文章

  1. 六个最佳的软件工程实践(持续的质量验证、变更管理)
  2. mysql的复合类型_PLSQL 复合类型数据
  3. 深度学习核心技术精讲100篇(六十六)- 基于LXD的GPU算力虚拟化(附解决方案代码)
  4. python之路day03--数据类型分析,转换,索引切片,str常用操作方法
  5. 活动丨PGConf.Asia大会11月17-20日线上直播!
  6. 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
  7. time datetime
  8. PyCharm中,如何成功 import caffe?
  9. 计算机word的常用功能技巧,10个Word操作神技巧,看看你会多少?
  10. wps下一步快捷键_WPS快捷键大全(最常用138个办公快捷键)
  11. 【H∞控制】H无穷控制器的matlab仿真
  12. 了解Linux操作系统
  13. 麦迪逊大学计算机科学咋样,威斯康星大学麦迪逊分校计算机科学
  14. 北京市公布533家接种点名单 (zz)
  15. P1107 [BJWC2008]雷涛的小猫
  16. php采集一言代码_php抓取一言数据
  17. 【HTTP状态码查询】
  18. 网络:分布式和网络的区别
  19. mysql是一门编程语言吗_掌握一门编程语言对非程序员的工作和生活有多大好处?...
  20. 某计算机系统20位地址线 8位数据线,同济大学2009-2010(1)微机原理期终考试试题(A卷)...

热门文章

  1. 蓝灰红商务通用述职报告PPT模板
  2. 切身体会设计系统时的前瞻性问题
  3. ios模仿微信的我界面的demo
  4. centos8搭建owncloud
  5. 腾讯优测优分享 | 分布式系统测试的应用方法——场景注入测试
  6. 编译原理-学习指导与典型题解析
  7. mqtt(2)发布、订阅、订阅确定、取消订阅
  8. mqtt 传文件断开连接的原因_MQTT——取消订阅报文和断开连接报文
  9. 测试开发面试准备之Linux -常用Linux系统命令
  10. special effects - 鼠标移动,出现泡泡拖尾