进程
在操作系统中,对进程的解释:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
- 是应用程序的一次运行过程(动态概念)
- 是系统分配和调度资源的基本单位(进程是一般由程序、数据集合和进程控制块三部分组成)
- 每个进程有自己独立的空间地址,数据栈(各进程间数据不共享,可通过其他方式进行通信)进程一般有初始态,执行态,等待状态,就绪状态,终止状态五种状态
线程
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
- 任务调度和执行的最小单位
- 一个进程中代码单一执行路线
进程和线程区别
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线进程间相互独立,但同一进程下各线程之间共享程序的内存空间线程上下文切换比进程上下文切换要快
node中进程
node是单线程的,即一个进程只开一个线程node
真的单线程吗?
Node 虽然是单线程,但是其底层是多线程的。事件循环中,libuv库从事件队列中取出任务再分配给不同的线程进行处理。现在硬件条件没有以前那么落后,如果只使用单线程进行操作,则会浪费资源。所以,为了实现多进程处理,充分发挥多核CPU的优势,Node中提供了child_process模块和cluster模块。
- child_process模块用于开启多个子进程,子进程中运行不同的命令或执行node.js模块文件、可执行文件
- Cluster模块,集群模块,用于实现在Node.js应用程序中开启多个子进程,每个子进程中运行一个Node.js应用程序副本的处理
child_process模块
- child_process.spawn():适用于返回大量数据,例如图像处理,二进制数据处理。
- child_process.exec():适用于小量数据,maxBuffer 默认值为 200 * 1024 超出这个默认值将会导致程序崩溃,数据量过大可采用 spawn。
- child_process.execFile():类似 child_process.exec(),区别是不能通过 shell 来执行,不支持像 I/O 重定向和文件查找这样的行为
- child_process.fork(): 衍生新的进程,进程之间是相互独立的,每个进程都有自己的 V8 实例、内存,系统资源是有限的,不建议衍生太多的子进程出来,通常根据系统* CPU 核心数设置。
cluster模块
- cluster.fork([env]) 开启子进程,子进程中创建一个Node.js应用程序的实例
- isMaster属性和isWorker属性用于判断是运行在主进程中,还是运行在子进程中
- Workers属性用于获取所有子进程中运行的worker对象
扩展一下,多线程之间如何通信?
进程间的通信
四种:
- 消息传递(管道、FIFO、消息队列)
- 信号量(互斥量、条件变量、读写锁)
- 共享内存(匿名、命名)
- 远程过程调用
进程间的通信不仅在node中会遇到,其实在其他语言都会遇到的,当然在面试中也是必提问的问题吧。
很多内容都可以进行深入扩展讨论