概述

本来是想着学学node.js试试的,后来发现node.js才是真正的js啊,它里面用到了很多我们平时没用过的js特性,而且还非常优雅,比如它里面的异步编程思想,总之,《深入浅出node.js》绝对值得一看。

下面是我的读书笔记。

异步IO

1.异步IO的优势:a.从用户体验上来说,异步IO在这个资源的获取时并不会阻塞下一个资源,因此我们可以享受并发的体验;b.从资源分配上来说,单线程同步编程模型会因阻塞IO导致硬件资源得不到更优的使用,多线程编程模型会因为死锁、状态同步等问题让开发人员头疼,但是异步IO利用单线程,远离了死锁和状态同步等问题,而且利用子进程也弥补了无法利用多核CPU的缺点。

2.阻塞IO会造成CPU等待IO,浪费等待时间;非阻塞性IO返回后,CPU的时间片可以用来处理其他事务,但是应用程序需要重复调用IO操作来确认是否完成。这种判断操作叫做轮询。

3.现存的轮询技术主要有:

  1. read。重复调用来检查IO的状态。
  2. select。通过文件描述符的事件状态来进行判断。
  3. poll。采用链表的方式避免数组长度的限制。
  4. epoll。进入轮询的时候如果没有检查到IO事件,将会进行休眠。
  5. kqueue。仅在FreeBSD系统下存在。

4.理想的完美异步IO:应用程序发起非阻塞调用,无须通过遍历或者事件唤醒等方式轮询,可以直接处理下一个任务,只需在IO完成后通过信号或者回调将数据传递给应用程序。

5.现实的异步IO:利用多线程解决。让一个线程进行计算处理,通过线程之间的通信将IO得到的数据进行传递,这就轻松实现了异步IO。

6.由于windows平台和lunix等平台的差异,Node提供了libuv作为抽象封装层,使得所有平台兼容性的判断都由这一层来完成。

7.Node的异步IO:完成整个异步IO环节的有事件循环、观察者和请求对象等。

  1. 事件循环:每个循环称为Tick,每个Tick的过程查看是否有事件待处理,有就处理,没有就进入下个Tick。
  2. 观察者:每个事件循环中有一个或多个观察者,判断是否有事件处理的过程就是向这些观察者询问是否有要处理的事件。
  3. 请求对象:调用过程中,会创建一个FSReqWrap请求对象,来挂载js层传入的参数,并提供调用方法。
  4. 线程池:组装好请求对象后,会将它送入IO线程池等待执行。执行完毕之后,会通知当前对象操作已经完成,然后执行回调,归还线程池。

8.非IO的异步API

  1. setTimeout和setInterval。
  2. process.nextTick。
  3. setImmediate。

9.服务器模型
1.同步式。一次只能处理一个请求,并且其余请求都处于等待状态。
2.每进程/每请求。为每个请求启动一个进程。(不具备扩展能力,因为系统资源只有那么多)
3.每线程/每请求。为每个请求启动一个线程。(由于每个线程都占用一定内存,并发过多时内存容易被用光)
4.事件驱动。无须为每一个请求创建额外的对应线程,可以省掉创建线程和销毁线程的开销,上下文切换的代价也很低。

《深入浅出nodejs》读书笔记(2)的更多相关文章

  1. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  2. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  3. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

  4. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  5. JavaScript高级程序设计 读书笔记

    第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...

  6. JavaScript高级程序设计 读书笔记 第一章

    JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型

  7. Javascript高级程序设计读书笔记(第二章)

    第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...

  8. JavaScript高级程序设计-读书笔记(6)

    第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JS ...

  9. JavaScript高级程序设计-读书笔记(5)

    第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...

  10. JavaScript高级程序设计-读书笔记(4)

    第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...

随机推荐

  1. JavaScript并发模型与Event Loop (转载)

    并发模型可视化描述 model.svg 如上图所示,Javascript执行引擎的主线程运行的时候,产生堆(heap)和栈(stack),程序中代码依次进入栈中等待执行, 若执行时遇到异步方法,该异步 ...

  2. 新手必备的Linux知识

    测试人员为什么学习linux? 对于软件测试人员来说,我们测试的任何产品都是基于操作系统.比如我们每天都在使用的QQ软件,它有windows.ios.Android.Mac OS等版本,需要把QQ安装 ...

  3. 记一次mac下使用mamp集成环境配置lumen项目自定义域名遇到的花样问题

    1.安装好mamp集成环境,自行百度. 2.从公司项目版本库里将项目克隆到本地. 好了,开始配置自定义域名来访问项目,以下是遇到的问题集锦... 1.web服务器使用的nginx,配置完域名访问报40 ...

  4. 201771010134杨其菊《面向对象程序设计java》第九周学习总结

                                                                      第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...

  5. GUI学习之十——QFrame和的QAbstractScrollArea学习总结

    上一章我们学习了单行的文本框QLineEdit类,下面我们要为多行的文本框的学习坐下准备,总结一下QFrame类和QAbstractScrollArea类 一.QFrame类 1.描述 QFrame的 ...

  6. GUI学习之八——QToolButton的学习总结

    QToolButton提供一个快速的访问按钮,通常在工具栏内使用,一般不显示文本标签而显示图标. 一.按钮的样式风格设置 可以按照下面的风格对按钮进行样式设置 从左到右依次是仅显示图标.仅显示文字.图 ...

  7. 浅谈Java和PHP的异同

    编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.float.long.short. ...

  8. Dockerfile制作自定义镜像

    本文介绍最精简的Dockerfile文件构建镜像,Docker启动的时候可以启动一个shell脚本 1.首先编写Dockerfile文件 说明 1.启动的这个shell脚本一定是不退出的,比如服务器的 ...

  9. shell脚本学习-练习写一个脚本2

    # 1.依次展示/var目录下的对象,并说明是文件或者目录.格式如:Hello,$file. # 2.统计一个有多少个文件. #!/bin/bash #Program Description: #Au ...

  10. 55行代码实现Java线程死锁

    死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中.那么如何创造出一个简单的死锁情况?请看代码: class Test implements Runnable { boolean ...