Node.js入门

296 阅读4分钟

基础概念和知识

1. Node.js

Node.js是js的运行时runtime,直译过来就是运行时组件,底层使用c++实现,语法遵循ECMAScript规范,如果作者开发一个ruby、python的运行时,也可以叫Node.rb,Node.py

2. runtime和vm

  1. 最出名的是VC++用来开发window程序 如MFC
  2. vm是认为是硬件和二进制文件的中间层
  3. c++编译好的二进制文件可以直接被操作系统调用,java编写好的字节码文件交给虚拟机运行

3.Node的内部机制

前提要点:
  1. 在任务完成之前,cpu在任何情况下都不会暂停和停止执行,cpu如何执行和 同步、异步、阻塞。非阻塞都没有必然的联系

  2. 操作系统始终保证cpu处在运行状态。是通过系统调度来实现的。具体一点就在不同的进程和线程之间切换实现的

回调

将一个函数作为另一个函数的参数,并且该参数可以被执行,本质上是一个高阶函数

高阶函数必须满足的条件:
	- 接受一个函数或者多个函数作为输入
	- 输出一个函数
如map函数
	[1,2,3,4].map(function(item){
		console.log(item)
	})
如下图描述回调的过程
	主程序 			     回调函数
	|				|
	|				|
	-->--底层调用-->->->->->->->->->--

 回调函数和主程序处同一个层级上,假设主线程发起了一个底层的系统调用,那么操作系统转而去执行这个系统调用,当调用结束后,又回到主程序调用其他的方法,这就成为回调的原因
异步过程的回调
比如在node中,io操作时,代码会在发起一个调用后继续向下执行,io操作完成后再执行相应的回调函数(异步)虽然代码运行在单线程环境下,但是依靠异步+回调的方式也能实现对高并发的支持
同步和异步
  1. 同步和异步描述的是进程或线程的调用方式
  2. 浏览器提供的支持让js看起来像是一个异步语言
阻塞和非阻塞
  1. 阻塞和非阻塞是针对IO状态而言的,关注程序在等待IO调用返回这段时间的状态
  2. 上面两个概念没有任何联系。 阻塞!=同步,非阻塞!=异步
  3. IO操作概念:
    node中IO特值Node程序在Libuv支持下与系统磁盘和网络交互的过程
    
  4. 四个常用IO编程模型:
    -阻塞IO
    -非阻塞IO
    -事件驱动IO
    -异步IO ,Node官网显示自己是 非阻塞IO,原因是异步IO是靠Libuv模拟出来的
    
单线程和多线程
  1. java等语言中有多线程特性,开发时我们可以自己定义多个线程来协同工作,这个时候,我们的代码就是运行在多线程环境下

  2. Node没有提供多线程的支持,但是可以派生多个进程来达到完成工作的目的,另一方面,Node的底层不是单线程,Libuv会通过类似线程池的实现来模拟操作系统下的异步调用,对于我们开发者是不可见的(Libuv是一个跨平台的异步IO库

并行和并发
  1. 排队买票时,两队开头的人交替上前到一个窗口取票,这是并发
  2. 排队买票时,两队的人同时上前到两个各自的窗口取票,这是并行,速度是一个窗口的两倍以上,这就避免了一个窗口在两队人之间的队列切换 并发是希望计算机做更多的事情,处理更多的队列,并行是希望计算机能够快速完成任务
  3. Node中的单线程支持高并发,通常是依靠异步和事件驱动(循环)来实现的,异步使得代码在面临多个请求时不会发生阻塞,事件循环提供了IO调用结束后调用回调函数的能力

4.事件循环-Event Loop (更新中)

最近在阅读李锴著作的《新时期的Node.js入门》一书,所以将自己在学习中的点点滴滴一一整理了出来,希望日后能够慢慢回顾这些知识点,此书挺不错的,笔者还在学习中,入门的同学可以入手一本。挺听书名就知道了(#^.^#),持续学习更新中...