(2)Node.js的两个特性使得在处理高并发,I/O密集场景性能优势明显
1、这里有个概念,什么是I/O密集和CPU密集,CPU密集:压缩,解压,加密,解密,I/O密集:文件操作,网络操作,数据库
2、为什么Web中存在这么多I/O密集,因为有静态资源的读取,数据库操作,渲染页面,所以到现在你就明白了为什么Node.js这么擅长在Web的领域了。
4、高并发应对之道
(1)什么高并发:在单位时间里的访问量特别多,就是高并发
(2)应对之道:增加机器数,增加每台机器的CPU-多核
5、进程
(1)进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基础单位。
(2)比如说我们在电脑中使用的浏览器,又打开了音乐播放器,它们都是一个个程序,需要系统分配给内存才能执行,简单的说进程就是进行中的程序。
(3)单核的CPU又为什么能一遍停音乐一遍上网,不是说底层的指令是一条一条执行的么,这里和口技一样,听着貌似是人能同时发出很多声音,但其实是间隔发音,ABABABA,在速度极快的时候A和B听起来就是同时发出的。所以计算机也是在极短的时间内切换不同的指令,使得单核CPU看起来能处理多个任务
(4)多进程:启动多个进程,多个进程可以一块执行多个任务
6、Node.Js工作模型
(1)传统的java Server是怎么处理Web请求的?比如在一个饭店里,每个厨师(I/O操作)配一个服务员(CPU),面对一个Web请求,CPU一运算(服务员点完菜)就交给I/O操作(大厨做饭),面对Web的高并发,这种方式就只能继续多招聘服务员和大厨,面对每个请求,服务器都要开一个进程,CPU就简单计算一下(10%不到的工作量)后给I/O操作,但是I/O操作是阻塞型的,面对更多的请求,服务器就进入多进程。但是面对更多更多的请求问题就来了,CPU(服务员)太闲了,每个服务员配一个厨师,在自己的厨师做饭时没事干,CPU利用率低,在空转,所以加上CPU分配最大的进程数有限,并发数到了一定上限就要排队了。
(2)Node.js模型就很好的解决了这个问题,Node.js模型就相当与只有一个服务员,服务员接待一个顾客后没有闲着,继续接待下一个顾客。下图中Client就是成千上万的Web请求,都给Event loop这一个服务员,服务员也不会给你真的回应(饭),统统交给后台多线程(很多大厨)处理,后台处理完就告诉服务员,服务员就给顾客(web回应),但不一定是按照顺序,谁的先好了就先回应谁。这里好处就是服务器只开一个进程,即CPU占用率很低,留着其他那么多CPU还能干其他事。
那么可以看到Event loop是CPU开一个进程,该进程里只包含一个线程。所以我们常说的Node.JS是单线程的,是因为单线程只针对主进程,它只负责听,而很多操作是交给操作系统,交给I/O操作系统进行多进程多线程的调度。
7、线程
(1)线程:进程内一个相对独立的,可调度的执行单元,于同属一个进程的线程共享进程资源
(2)单线程:一个进程里只有一个线程,进程的所有资源归这一个线程用
(3)多线程:一个进程里有多个线程,这样多个线程也可以一块执行多个任务
8、所以说我们说Node.js性能好一定是有前提的:web场景,高并发,I/O密集(CUP密集就相当于每个顾客都点了1000个菜,服务员点菜都点晕了)
9、Node.js常用场景:Web Server ,本地代码构建,实用工具(爬虫)