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标准。
最新文章
- opencv中的视频的读入
- ssm框架web.xml中filter配置问题
- C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码
- 伪多项式时间算法Pseudo-polynomial Algorithms-----geeksforGeek 翻译
- 用JSON-server模拟REST API(三) 进阶使用
- HttpClient -- 血的教训
- java 访问权限控制
- DB Error: 1 &;quot;unrecognized token: &;quot;:&;quot;&;quot;
- Android---控制设备照相机
- 华为路由器AR1220F-S的端口映射NAT配置(拨号光纤上网)
- hive: join 遇到问题
- leetcode 第4题 Median of Two Sorted Arrays
- sap gui 配置
- centos6.5环境通过rpm包安装mysql5.5.51数据库
- [Learn AF3]第六章 App Framework 3.0中的内置矢量图标
- IE屏蔽鼠标右键、禁止复制粘贴等功能
- Java 8 字符串日期排序
- 存储系统的基本数据结构之一: 跳表 (SkipList)
- 【leetcode 简单】第四十一题 Excel表列序号
- js如何判断Object是否为空?(属性是否为空)
热门文章
- 【题解】HNOI2018寻宝游戏
- [bzoj] 2038 小Z的袜子(hose) || 莫队
- 2017 湖南省赛 K Football Training Camp
- vue的nextTick的实现
- 【ZJ选讲·;BZOJ 5071】
- POJ2240:Arbitrage(最长路+正环)
- Planning your upgrade with Upgrade Advisor
- idea控制台中文乱码问题解决办法
- bzoj 1798 维护序列seq 线段树
- wget.vbs &; wget.ps1