要看的书太多,时间太紧看不完,挑核心的部分记录一下。
一、单线程最大好处是不用像多线程编程那样处处在意状态同步问题,没有死锁,没有线程上下文交换所带来的性能上的开销
缺点:
1.无法利用多核CPU
2.错误会引起整个应用退出,应用健壮性值得考验
3.大量计算占用CPU导致无法继续调用异步I/O(解决:适当调整和分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起,这样既可同时享受到并行异步I/O的好处,又能充分利用CPU)
二、node采用webworker相同思路解决单线程大量计算问题:child_process(子进程)
三、问题:进程和线程区别?
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内部调度实体,是处理器调度的基本单位,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程。
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:1.同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。2.进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
四、node 应用场景:擅长I/O密集型应用场景
I/O密集优势主要在于node利用事件循环的处理能力,而不是启用每一个线程为每个请求服务,占用资源极少
五、node单线程仅仅是js执行在单线程,在node中无论是*nix还是windows平台,内部完成I/O任务另有线程池
六、node中定时器精确度不够,改用process.nextTick()方法更高效,每次调用process.nextTick()方法,只会将回调函数放入队列中,在下一轮Tick时取出执行。
process.Tick()和setImmediate()有细微差别,差别在于process的回调函数优先级要高于setImmediate(也就是执行console.log会先输出)
七、异步实现的核心:事件循环
进程启动时,node会创建一个类似于while(true)的循环,每次执行一次循环体的过程称为Tick,每个Tick的过程就是查看是否有事件待处理,如果有,就取出事件及其相关的回调函数。如果存在关联的回调函数,就执行他们。然后进入下个循环,如果不再有事件处理,就退出进程。
八、事件驱动的实质:通过主循环加事件触发的方式来运行程序
九、node高性能的一个原因:通过事件驱动的方式处理请求,无须为每个请求创建额外对应线程,可以省掉创建线程和销毁线程的开销,同时操作系统在调度任务时因为线程较少,上下文切换的代价很低。