1. Node

   JavaScript web服务器框架,主要特点:事件驱动,异步 I/O,强制不共享任何资源的单线程,单进程系统。

  每一个node进程都构成网络应用中的一个节点。

           

左图是Chrome浏览器的大体框架,右图是Node大体框架。补充说明webkit是用c语言开发的浏览器内核。

  浏览器的主要组件有:

  1. HTML,XML,CSS,JavaScript 解析器
  2. LayOut
  3. 文字和图形渲染
  4. 图像解码
  5. GPU交互
  6. 网络访问
  7. 硬件加速

  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标准。

  

最新文章

  1. opencv中的视频的读入
  2. ssm框架web.xml中filter配置问题
  3. C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码
  4. 伪多项式时间算法Pseudo-polynomial Algorithms-----geeksforGeek 翻译
  5. 用JSON-server模拟REST API(三) 进阶使用
  6. HttpClient -- 血的教训
  7. java 访问权限控制
  8. DB Error: 1 &amp;quot;unrecognized token: &amp;quot;:&amp;quot;&amp;quot;
  9. Android---控制设备照相机
  10. 华为路由器AR1220F-S的端口映射NAT配置(拨号光纤上网)
  11. hive: join 遇到问题
  12. leetcode 第4题 Median of Two Sorted Arrays
  13. sap gui 配置
  14. centos6.5环境通过rpm包安装mysql5.5.51数据库
  15. [Learn AF3]第六章 App Framework 3.0中的内置矢量图标
  16. IE屏蔽鼠标右键、禁止复制粘贴等功能
  17. Java 8 字符串日期排序
  18. 存储系统的基本数据结构之一: 跳表 (SkipList)
  19. 【leetcode 简单】第四十一题 Excel表列序号
  20. js如何判断Object是否为空?(属性是否为空)

热门文章

  1. 【题解】HNOI2018寻宝游戏
  2. [bzoj] 2038 小Z的袜子(hose) || 莫队
  3. 2017 湖南省赛 K Football Training Camp
  4. vue的nextTick的实现
  5. 【ZJ选讲&middot;BZOJ 5071】
  6. POJ2240:Arbitrage(最长路+正环)
  7. Planning your upgrade with Upgrade Advisor
  8. idea控制台中文乱码问题解决办法
  9. bzoj 1798 维护序列seq 线段树
  10. wget.vbs &amp; wget.ps1