本文写于在经历不少项目的愈来愈多发现线程和进程的重要性。「属于操作系统的知识」
在一次项目中,我使用node去编写了一个服务(server A),使用pm2去持续运行这个服务,接着我又写了一个node服务(server B),又用pm2去持续运行第二个服务,但是我的服务器CPU是单核的,所以严格来说一次只能跑一个服务(server A 或者 server B),另外一个服务必然处于就绪状态,等待进入。
这里简单分析一下:
1、Pm2 是一个node的进程管理器,这里可以忽略;
2、server A 或者server B 都是一个程序,或者说是一个进程;
3、CPU的数量决定着可运行进程的多少;
简单梳理一下知识定义:
进程
进程是正在进行的程序的实例,1个进程就是1个正在进行的程序,2个进程就是2个正在进行的程序,1个程序被运行2遍也是2个进程。
单核处理器(CPU)一次只能处理一个进程,但是它是被很多个进程一起共享的,所以在决定使用哪一个进程的时候就归调度算法来管理,其他没被进行的进程就得等待分配。
像上文的例子说到的,server A 或者server B 被运行一次就算是一个进程,但是由于我的服务器是单核的,所以server A 和server B是不可能同时都被CPU处理,只能A先B后,或者B先A后,由调度算法来管理。
线程
线程是进程的一个执行序列,「简单来说,就是程序代码的执行顺序和执行指令」,相当于在一个进程中又划分了很多个小的进程,而这些进程就被称为线程。
一个进程可以被很多个线程共享,可知犹如一个进程包含了很多线程。
像server A 是一个进程,是用js编写的,所以是一个单线程,在这个程序里,会按着server A里面的代码按照一定的执行顺序来执行代码。「nodeJs是一个单线程,虽然它的底层是由多线程组成的」。
两者的区别:
1、线程是调度的基本单位 ,进程是资源分配的基本单位
2、进程之间互相独立,通信困难而且消耗资源大,可以使用管道,信号,套接字,共享内存,消息队列等方法通信。线程由于共享同一进程,所以通信简单而且消耗资源少,可以使用读写进程数据段来通信。
3、由于进程之间互相独立,进程切换,需要保持上下文的一致,所以切换满;相比较线程由于共享同一线程的上下文,所以要快。
总结:一个处理器(CPU)有着很多进程,一个进程有着很多线程。
本文作为一个简单的讲诉,主要归纳一下进程和线程的知识点,和作为js运行机制的一个小拓展。
详细的资料请阅读《现代操作系统》。
博客原文:https://wusiqing.com/?p=306