进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
比如我们听音乐,上网,对应的音乐播放器、浏览器都是一个程序。
当我们双击图标运行这个程序的时候实际上就是把它们加载到内存中去执行
我们就把这个执行中的程序叫作进程。
所谓关于某数据集合,我们不论听音乐还是上网都是有很多数据的嘛
执行程序的时候相应的底层系统是需要给它分配资源才能执行的,然后我们的资源分配和调度的基本单位就是进程
通俗的解释就是,正在进行中的程序就叫进程
多进程
那是怎么实现同时听音乐又同时上网的呢?
实际上它俩并不是同时执行的。CPU是在飞快地切换进程中执行的。CPU会通过一些调度算法保证程序正常运行。
这样在人看起来就是同时运行的了
每来一个任务请求,服务器就开一个进程来处理这个任务请求,一般Web任务都是IO密集的,如果是阻塞型IO的话这个进程就不能关掉,就等一直等IO完成以后才能返回。
这里就有两个问题,
第一个就是CPU可以分配的最大进程数是有限的,不能没完没了的分配进程,用户并发到一定程度就必须排队。比如我这个CPU就只能分配5000个进程,那我同时有5001个请求,最后那个请求就必须等待一个进程完事儿才能处理。
第二个就是CPU的利用率很低,因为CPU一直在等IO的活干完才执行下一步动作,而IO是很慢的
线程
线程是进程内一个独立的、可调度的执行单元,与同属一个进程的线程共享进程的资源
前面不是说了嘛,进程是资源分配和调度的基本单位,计算机给这个进程分配了比如说200MB的内存,那么这个进程中的所有线程都可以访问这200MB的内存。就跟吃大锅饭似的,一个单位一个锅,单位就类比进程,完了大家都在这一个锅里吃饭,每个人就相当于线程
多线程
如果一个进程只有一个线程,就是单线程,一个单位就你一个人
一个进程不止一个线程,就是多线程
多线程同样可以用来处理多任务。
NodeJS的单线程
单线程只针对主进程,而IO是操作系统底层多进程多线程调度的
然后NodeJS的cluster模块会进行多核处理,尽管每个核都只开一个进程