概述

本来是想着学学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. Image 图片

    随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像.这里打印出的是纯粹的数字,而非自然图像.下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel. impo ...

  2. SSL及使用openssl实现CA

    TLS如何实现各种功能?数据如何加密在网络上传输? 网景(Netscape)公司在应用层和传输层加入了半层,把这个半层称之为SSL,SSL不是软件,可以理解是一个库,当http交给tcp层之前先通过s ...

  3. Django高级实战 开发企业级问答网站完整

    资源获取链接点击这里 Django高级实战 开发企业级问答网站 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问答.私信.消息通知.搜索.个人中心,打造企业级知识问答网站,由此全 ...

  4. mysql 外网访问

    --修改用户Root 可以外网访问 update user set host='%' where user='root'; --查询修改结果 select user,host from user; - ...

  5. 2-创建spring boot项目

    想要创建一个spring boot项目,最好的方法就是参照官网的例子: https://spring.io/guides/gs/maven/#scratch 创建的过程我就不再啰嗦了,官网描述非常详细 ...

  6. linux系统下部署DNS正向解析

    DNS服务概述: DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 正向解析 正向解析是指域名到IP 地址的解析过程. 部署DNS正向解析 DNS服务的三个配 ...

  7. jQuery子页面获取父页面元素并绑定事件

    父页面HTML文件: <ul id="faul"> <li class="sonli">子页面列表1</li> <li ...

  8. 企业微信自建应用移动端动态获取li并给其事件问题总结

    前段时间一个项目增加企业微信移动端应用,其中几个小功能用到ul-li列表点击并获得相应数据: 开始用var lis=$('#ul li'); for(var=i;i<lis.length;i++ ...

  9. 利用clonezilla克隆、还原CentOS整个系统

    实现目的:全盘备份CentOS 6.0系统到U盘或者到移动硬盘 操作步骤: 1.制作再生龙镜像启动光盘或U盘,插入到要备份的CentOS 6.0 Linux上面,设置好开机启动(我这里用的是U盘,所以 ...

  10. Day05 (黑客成长日记) 文件操作系列

    文件操作: 1.以什么编码方式输出,就以什么编码方式打开 f = open('d:\文件操作.txt',mode='r',encoding='GB2312') G = f.read() print(G ...