Node 入门<1>
1. Node
JavaScript web服务器框架,主要特点:事件驱动,异步 I/O,强制不共享任何资源的单线程,单进程系统。
每一个node进程都构成网络应用中的一个节点。

左图是Chrome浏览器的大体框架,右图是Node大体框架。补充说明webkit是用c语言开发的浏览器内核。
浏览器的主要组件有:
- HTML,XML,CSS,JavaScript 解析器
- LayOut
- 文字和图形渲染
- 图像解码
- GPU交互
- 网络访问
- 硬件加速
Node是一个JavaScript web应用服务器框架,即在Node中,JavaScript 可以访问本地文件,搭建websocket服务器端,可以连接数据库,可以创建web worker多线程。
2. 异步事件如何协作
Node是事件驱动的,而事件又是异步的。这里就需要解决多个异步事件如何协作的问题,也就是异步事件之间如何通信。
方法:将函数作为对象传递给方法作为实参进行调用。
Node的优势主要事件驱动异步I/O,即避免CPU等待I/O或者网络请求,从而达到高效利用CPU,快速处理大量网络请求的效果。但是Node保持JavaScript单线程的特点,意味这,Node 线程之间无法共享任何状态。单线程避免了多线程上下文切换,和资源共享带来的问题,但是它也避免了多线程的优势,带来了一些问题:
- 单线程无法利用多核CPU
- 错误会导致整个应用退出,应用的健壮性值得考验
- 如果大量计算占用cpu,将导致无法调用异步I/O
解决方案是:创建工作线程来进行计算,避免大量计算主线程的I/O处理。
补充:CPU,进程,线程之间的关系
单个CPU一次只能运行一个任务,即一个进程。一个进程可以包含多个线程,进程内的内存空间是多个线程共享的,多个线程可以同时运行。但是由于进程内的内存空间的数量或者性质不同,<1>导致某些内存空间(a)一次只允许一个线程使用,那么如何解决多线都要使用的情况呢,利用互斥锁来解决这个问题,即如果有一个线程正在使用a内存空间,那么就给a内存空间上锁,其他要访问a内存空间的线程,只能等待,当使用完之后,a内存空间的锁被打开,下一个线程才允许访问。<2>某些内存空间(b)只允许特定数量的线程访问,如何解决超过该限制数量的线程使用该内存空间呢,利用信号量来解决这个问题,即给(b)设置一个信号量,当一个线程进入则该信号量-1,如果一个线程使用完毕,则信号量+1,若信号量=0时,表示该资源已经达到线程的访问上限,不再允许其他线程访问,其他线程只能等待。
进程是由程序,数据集合和进程控制块三部分组成。程序是指令的集合,数据集合是程序在执行时分配的数据和工作区,进程控制块包含进程描述信息和控制信息,是进程存在的唯一标识。进程拥有独立的地址空间,处理机分配给线程,线程通过消息通信协同完成一个任务。
JavaScript是单线程的,是指JavaScript只在一个线程上运行(创建了web worker 的JavaScript脚本例外)。而V8 JavaScript 引擎是由C++ 编写,是一个多线程程序,单个JavaScript 只能在一个线程上运行,其他的V8线程在后台配合浏览器的I/O线程。补充:web worker允许一个JavaScript脚本创建多个线程,子线受主线程的控制,不能操作DOM。JavaScript 单线程也是为了避免多线程同时造作DOM带来不一致性。worker 线程与主线程的通信也是通过事件机制来完成的。
3.语言规范

浏览器端是W3C标准,Node端是CommonJs标准。
Node 入门<1>的更多相关文章
- <Node入门经典>读书笔记
最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...
- Node入门(转)
原文链接:http://www.nodebeginner.org/index-zh-cn.html Node入门 作者: Manuel Kiessling翻译: goddyzhao & Gra ...
- node入门笔记
看了<node入门>http://www.nodebeginner.org/index-zh-cn.html.有些疑难点记下来. 在导出模块的时候给出的代码是这样的 var http = ...
- Node入门教程(1)目录
aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 ...
- [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题
花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...
- 《Node入门》读书笔记——用Node.js开发一个小应用
Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个 ...
- node入门(三)——gulp运用实例
在上一篇<node入门(二)——gulpfile.js初探>中,我们知道了(看懂入门二及其参考资料)怎么运用gulp来更高效的开发,现在来示范一下. 在package.json里面配置好d ...
- node入门(二)——gulpfile.js初探
本文关于gulpfile.js怎么写,利于完成个性化需求.本文开发环境默认已安装node,详情参考<node入门(一)——安装>. 一.安装gulp npm install -g gulp ...
- Node 入门
Node 入门 NodeJs 安装,HelloWorld 下载地址 https://nodejs.org/zh-cn/ https://nodejs.org/dist/ 用 Node命令行输出Hell ...
- Node入门教程(6)第五章:node 模块化(上)模块化演进
node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不 ...
随机推荐
- [洛谷P2197]nim游戏
题目大意:Nim游戏.地上有n堆石子,每人每次可从任意一堆石子里取出任意多石子,不能不取,且每次只能从一堆里取.没石子可取的人输.问是否存在先手必胜的策略. 题解:Nim游戏有一个定理,就是当所有棋子 ...
- 洛谷P4589 [TJOI2018]智力竞赛 【floyd + 二分 + KM】
题目链接 洛谷P4589 题意可能不清,就是给出一个带权有向图,选出\(n + 1\)条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 题解 如果要问全部覆盖,就是经典的可重点的DA ...
- Win10的WSL很好用呀
WSL全名是Windows Subsystem for Linux,是win10版本号16xx之后推出的开发者功能,提供了如原生linux版的体验. 最近最新的win10春季版1803出来了,安装了看 ...
- Mysql History list length 值太大引起的问题
1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4 64bit 2. 表面现象 数据库操 ...
- webpack 配置学习笔记
最简单的 webpack 配置 const path = require('path') module.exports = { entry: './app/index.js', output: { p ...
- Shell之基本用法
一:shell简介 1.什么是shell shell的中文意思是“外壳”,通俗地讲,shell是一个交互编程接口,通过获得用户输入来驱动操作系统内核完成指定工作.shell除了作为命令解释程序以外,还 ...
- 【Foreign】旅行路线 [倍增]
旅行路线 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...
- 谈谈openstack部署规模问题
理论上,单个openstack已设计成可水平扩展的系统,只要数据库足够快,消息总线足够多资源等,一个openstack系统可管理上千台物理服务器是没有问题的. 但是单个openstack规模大了之后, ...
- Django【进阶】FBV 和 CBV
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py 1 2 3 4 5 6 7 ...
- selenium自动化添加日志
于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.py,以便于调用,直接上代码 filenam ...