《深入浅出nodejs》读书笔记(2)
概述
本来是想着学学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.现存的轮询技术主要有:
- read。重复调用来检查IO的状态。
- select。通过文件描述符的事件状态来进行判断。
- poll。采用链表的方式避免数组长度的限制。
- epoll。进入轮询的时候如果没有检查到IO事件,将会进行休眠。
- kqueue。仅在FreeBSD系统下存在。
4.理想的完美异步IO:应用程序发起非阻塞调用,无须通过遍历或者事件唤醒等方式轮询,可以直接处理下一个任务,只需在IO完成后通过信号或者回调将数据传递给应用程序。
5.现实的异步IO:利用多线程解决。让一个线程进行计算处理,通过线程之间的通信将IO得到的数据进行传递,这就轻松实现了异步IO。
6.由于windows平台和lunix等平台的差异,Node提供了libuv作为抽象封装层,使得所有平台兼容性的判断都由这一层来完成。
7.Node的异步IO:完成整个异步IO环节的有事件循环、观察者和请求对象等。
- 事件循环:每个循环称为Tick,每个Tick的过程查看是否有事件待处理,有就处理,没有就进入下个Tick。
- 观察者:每个事件循环中有一个或多个观察者,判断是否有事件处理的过程就是向这些观察者询问是否有要处理的事件。
- 请求对象:调用过程中,会创建一个FSReqWrap请求对象,来挂载js层传入的参数,并提供调用方法。
- 线程池:组装好请求对象后,会将它送入IO线程池等待执行。执行完毕之后,会通知当前对象操作已经完成,然后执行回调,归还线程池。
8.非IO的异步API:
- setTimeout和setInterval。
- process.nextTick。
- setImmediate。
9.服务器模型:
1.同步式。一次只能处理一个请求,并且其余请求都处于等待状态。
2.每进程/每请求。为每个请求启动一个进程。(不具备扩展能力,因为系统资源只有那么多)
3.每线程/每请求。为每个请求启动一个线程。(由于每个线程都占用一定内存,并发过多时内存容易被用光)
4.事件驱动。无须为每一个请求创建额外的对应线程,可以省掉创建线程和销毁线程的开销,上下文切换的代价也很低。
《深入浅出nodejs》读书笔记(2)的更多相关文章
- javascript高级程序设计读书笔记-事件(一)
读书笔记,写的很乱 事件处理程序 事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别 没有DOM1 同样的事件 DOM0会顶掉html事件 因为他们都是属性 而 ...
- javascript高级程序设计读书笔记
第2章 在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...
- Javascript高级程序设计读书笔记(第六章)
第6章 面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- JavaScript高级程序设计 读书笔记
第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...
- JavaScript高级程序设计 读书笔记 第一章
JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型
- Javascript高级程序设计读书笔记(第二章)
第二章 在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...
- JavaScript高级程序设计-读书笔记(6)
第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l 简单值:使用与JavaScript相同的语法,可以在JS ...
- JavaScript高级程序设计-读书笔记(5)
第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...
- JavaScript高级程序设计-读书笔记(4)
第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...
随机推荐
- 利用正则表达式实现python强口令检测
""" Chapter 7 模式匹配和正则表达式 1 用import re 导入正则表达式模块 2 用re.compile()函数创建一个Regex对象(记得使用原始字符 ...
- 201771010134杨其菊《面向对象程序设计java》第十周学习总结
第8章泛型程序设计学习总结 第一部分:理论知识 主要内容: 什么是泛型程序设计 泛型类的声明及实例化的方法 泛型方法的定义 ...
- Hello The Merciless World!
这里是一名FJ蒟蒻OIer的Blog,ID在上面自己不会看嘛QAQQQ是GldHkkowo(很随性的名字w 联系方式:QQ:735900335 加 Q Q 看 蒟 蒻 WA 题 爱好? 死宅的爱好是什 ...
- BFC和清除浮动
1.清浮动(不考虑兼容的话这一项够用了): .clear:after{ content:''; display:block; clear:both; } 兼容ie6或7 加一个 .clear{ *zo ...
- python 练习3
简单计算器的实现: 计算:1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' #!usr/bin/en ...
- CSS绝对定位的原点:是在border上、padding上还是在content上?
用了那么久的绝对定位,却一直没在意一个问题,就是绝对定位的原点,究竟是在盒模型的哪一处.今天想到这个问题,直接搜索没有找到标准文档,也没有搜索到相关的问题,于是决定自己动手实现一下看看,并把这个结果发 ...
- scrum与第一次teamwork
一.关于Scrum Scrum是什么?是迭代式增量软件开发过程,通常用于敏捷软件开发,Scrum是一种偏重于过程的敏捷开发的具体方式.Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作 ...
- final,finally,finalize
final:可以修饰属性,可以修饰方法(方法不能被重写,可以继承),可以修饰类(该类不能被继承,不能产生子类) finally:无论什么情况,都会执行 finalize:垃圾回收时,调用此方法
- redis学习-集合set常用命令
redis学习-集合set常用命令 1.sadd:添加一个元素到集合中(集合中的元素无序的并且唯一) 2.smembers:查看集合中所有的元素(上图事例) 3.srem:删除结合中指定的元素 4 ...
- mysql官方的测试数据库employees超30万的数据,安装方法介绍
安装方法 1.mysql必须开启环境变量 2.shift右键官方数据库打开在命令行运行此窗口 3.进入cmd以后输入mysql -uroot -proot 回车 4.输入 source employ ...