1. 为什么要异步I/O

  (1)用户体验上:

    并发的优势: M+N+... -> max(M,N,...)  --> 使后端能够快速的响应资源

    *并发的劣势:...

  (2)资源分配:

    单线程同步编程模型会因阻塞I/O导致硬件资源得不到更优的使用。 -> 硬件使用效率低     -----

                                               | -----> Node:利用单线程,远离多线程死锁,状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好的使用CPU。

    多线程编程模型会因为编程中的死锁、状态同步等问题让开发人员头疼。 -> 编程上的困难  -----

2. Node的异步I/O

  (1)Node自身的执行模型 -- 事件循环(令回调函数十分普遍)

    当进程启动时,Node会创建一个类似于while(true)的循环,没执行一次循环体的过程称为一次"Tick"(“滴答”一声)。

    每个Tick中,Node会:

      A. 查看是否有事件待处理(什么是事件?) 事件的来源:文件I/O,网络请求

      B. 如果有,取出事件以及相关的回调函数

      C. 如果存在关联的回调函数,就执行他们

      D. 进入下一个循环

      E. A -> 没有事件了 -> 退出

    谁来查看是否有事件? --> 观察者(一个或多个)->文件I/O观察者,网络请求观察者

    产生事件 :文件I/O,网络请求

    观察事件 :观察者

    取出并处理事件 :事件循环

  (2)请求对象 -- 是异步I/O过程中的重要中间产物,所有的状态都保存在这个对象中,包括送入线程池等待执行以及I/O操作完毕后的回调问题。(还是没明白是什么。)

  (3)异步I/O的过程:

    A.组装好请求对象,送入I/O线程池等待执行

    B.回调通知

      回调函数的行为:取出请求对象的result属性作为参数,取出oncomplete_sym属性为方法,然后调用执行,以此达到调用JavaScript中传入的回调函数的目的。

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

3. 非I/O的异步API(什么意思?)

  (1)定时器

    setTimeout() -- 单次定时执行任务

    setInterval() -- 多次定时执行任务

    两者创建的定时器会被插入到定时器观察者内部的一个红黑树种,每次Tick执行时,会从该红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过,就形成一个事件,他的回调函数将立即执行。

    存在的问题:时间是非精确

  (2)process.nextTick()

    每次调用process.nextTick()方法,只会讲回调函数放入队列中,在下一轮Tick时取出执行。相较于setTimeout(fn,0)更高效(无需调用红黑树)

  (3)setImmediate()

    功能类似于process.nextTick(),但优先级要低于前者。

    具体实现上,process.nextTick()回调函数保存在一个数组中,setImmediate()的结果保存在链表中。

    在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完,而setImmediate()在每轮循环中执行链表中的一个回调函数。

4. 事件驱动与高性能服务器

  事件驱动的实质:通过主循环加事件触发的方式运行程序。

  几种经典的服务器模型:

    A. 同步式:一次只能处理一个请求,并且其余请求都处于等待状态。

    B. 每进程/每请求:为每个请求启动一个进程,这样可以处理多个请求,但是他不具备拓展性,因为系统资源只有那么多。

    C. 每线程/每请求:为每个请求启动一个线程来处理。尽管线程比进程要轻量,但是由于每个线程都占用一定内存,当大并发请求到来时,内存将会很快用光,导致服务器变缓慢。(此方式的拓展性强于每进程/每请求,但对于大型站点而言依然不够)【Apache使用】

    【Node高性能的原因之一】:Node通过事件驱动的方式处理请求,无须为每一个请求创建额外的对应线程,可以省掉创建线程和销毁线程的开销,同时操作系统在调度任务时因为线程较少,上下文切换的代价很低。这使得服务器能够有条不紊的处理请求,即使在大量连接的情况下,也不受线程上下文切换开销的影响。

【读书笔记】《深入浅出nodejs》第三章 异步I/O的更多相关文章

  1. 【读书笔记】C++Primer---第三章

    1.由于为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型: 2.以下代码中,cin有几点需要注意:a.读取并忽略开头所有的空白字符(如空格.换行符.制表符):b.读取字符直至再次遇 ...

  2. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  3. The Art of Multiprocessor Programming读书笔记 (更新至第3章)

    这份笔记是我2013年下半年以来读“The Art of Multiprocessor Programming”这本书的读书笔记.目前有关共享内存并发同步相关的书籍并不多,但是学术文献却不少,跨越的时 ...

  4. Chrome插件安利!可以一键导出微信读书笔记|支持Markdown等三种格式

    众所周知,微信读书App 是一款非常优秀的阅读类App ,周围也有不少人在用.虽然工作比较忙.但是也没少在上面看书做笔记. 美中不足的是,目前微信读书虽然支持笔记导出,但是提供的是将笔记复制到剪切板, ...

  5. 精读《C++ primer》学习笔记(第一至三章)

    第一章: 重要知识点: 类型:一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算:所以说类定义,实际上就是定义了一种数据类型: >>和<<运算符返回其左侧的运算 ...

  6. NodeJs>------->>第三章:Node.js基础知识

    第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 console.log(" node app1.js 1> ...

  7. 读书笔记_Effective_C++_条款三十:了解inline的里里外外

    学过基本程序课的同学都知道,inline是内联的关键字,它可以建议编译器将函数的每一个调用都用函数本体替换.这是一种以空间换时间的做法.把每一次调用都用本体替换,无疑会使代码膨胀,但可以节省函数调用的 ...

  8. 【读书笔记】《深入浅出nodejs》第一章 Node简介

    1. Node的官方网站: http://nodejs.org 2. Node的缘起: Ryan Dahl 打算设计一个高性能的Web服务器. Ryan Dahl 认为设计高性能Web服务器的要点在于 ...

  9. 【读书笔记】《深入浅出nodejs》第二章 模块机制

    1.什么是模块? 指在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分. ----<百度百科> 2.JavaScr ...

随机推荐

  1. jenkins 配置 ssh插件

    一.安装SSH插件 系统管理->插件管理,在可选插件下,过滤SSH,找到publish over ssh插件,直接安装(我这里已经安装过了,在已安装选项下可以找到publish over ssh ...

  2. 160304-01、mysql数据库插入速度和读取速度的调整记录

    需求:由于项目变态,需要在一个比较短时间段急剧增加数据库记录(两三天内,由于0增加至5亿).在整个过程调优过程非常艰辛 思路: (1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data Fil ...

  3. c#自定义控件做漂亮的列表

    效果图如下: 完整项目代码下载: 点击下载

  4. Convolution Matrix

    w褶积矩阵.二值化旧图经核矩阵得到新图. https://docs.gimp.org/en/plug-in-convmatrix.html 8.2. Convolution Matrix 8.2.1. ...

  5. Python--格式化输出%s和%d

    https://www.cnblogs.com/claidx/p/7253288.html pythn print格式化输出. %r 用来做 debug 比较好,因为它会显示变量的原始数据(raw d ...

  6. 阿里云部署 Flask + uWSGI + Nginx

    一.引言 今天入手了一台阿里云服务器,是centeros 7.5版本.本文解决的是 Flask 的部署问题.假设你的Flask的应用已经完成,现在只是部署的问题,本文以部署我的二次开发微信订阅号的项目 ...

  7. OCR技术浅探:特征提取(1)

    研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究人员对相关的技术研究已久,也有不 ...

  8. Spark2.0 Pipelines

    MLlib中众多机器学习算法API在单一管道或工作流中更容易相互结合起来使用.管道的思想主要是受到scikit-learn库的启发. ML API使用Spark SQL中的DataFrame作为机器学 ...

  9. 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence

    问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...

  10. MongoDB的固定集合

    一.MongoDB固定集合概念 固定集合指的是事先创建,并且大小固定的集合.即假设一个集合设置了固定大小为100,再添加一条文档的时候,会把最前面的文档剔除,永远只保留100条数据. 固定集合特性:固 ...