《深入浅出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 ...
随机推荐
- UNIX 系统下退出 git commit 编辑器
如果是 Emacs 编辑器,输入 Ctrl X + Ctrl S(保存),再输入Ctrl X + Ctrl C(退出) 如果是VIM编辑器,输入 ESC + :wq UNIX 系统默认打开的是 Ema ...
- Asp.net core 向Consul 注册服务
Consul服务发现的使用方法:1. 在每台电脑上都以Client Mode的方式运行一个Consul代理, 这个代理只负责与Consul Cluster高效地交换最新注册信息(不参与Leader的选 ...
- linux内存黑洞
1.问题 k8s集群中node节点的内存使用率居高不下,使用率达到90%多.通过以下命令可以发现此虚拟机分配的内存为15g,但是用户进程使用的内存总共为7个多g,并且slab和pageTables使用 ...
- tensorflow学习之(九)classification 分类问题之分类手写数字0-9
#classification 分类问题 #例子 分类手写数字0-9 import tensorflow as tf from tensorflow.examples.tutorials.mnist ...
- tensorflow学习之(七)使用tensorboard 展示神经网络的graph/histogram/scalar
# 创建神经网络, 使用tensorboard 展示graph/histogram/scalar import tensorflow as tf import numpy as np import m ...
- redis学习-string常用命令
keys * :查询所有的key值 set:为指定键设置对应的值 get:获取指定键的值 mset:一次传入多个键值对 mget:一次获取多个键的值 del:删除指定键 strlen:获取指定键值的长 ...
- 【ORA-12516 TNS监听程序找不到符合协议堆栈要求的可用处理程序】
服务器上某个数据库出现' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,要解决该问题首先查看一下数据库现有的进程数,是否已经达到参数processes的大小. 取得 ...
- 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常
概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...
- beego笔记
beego学习笔记一:创建第一个beego Web项目 Go语言beego框架快速搭建体验五分钟讲解01 beego框架图文简介五分钟讲解02 beego框架图文简介五分钟讲解03-go语言简单方式操 ...
- JavaScript-BOM与DOM
BOM与DOM BOM: Browser Object Model(浏览器对象模型),即把 浏览器 当做一个对象来看待.BOM 除了可以访问文档中的组件之外,还可以访问 浏览器组件,比如页面中的 na ...