我们经常听到下面这些概念:高并发的场景下...., 希望可以并行处理.... ,js 是个单线程....,nodejs是个单线程..., 不要阻塞渲染进程..., 处理高并发提高性能的方法之一:使用web worker 在独立的线程运行..., 基于promise.all 并行发起多个网络请求,浏览器一个tab就是一个进程...., 那你明白进程和线程的关系吗?明白什么是并行什么是并发吗?
概念:
并行:同一时刻,多个任务同时处理(多核cpu同时处理 )
- 例如,一个具有 4 核 CPU 的计算机,可以同时运行 4 个任务,每个核心处理一个任务,这些任务是真正意义上的同时执行。
并发:一段时间内, 多个任务交替执行
- 例如,同时运行一个 Web 服务器和一个数据库服务器。操作系统会在这两个服务程序之间快速切换 CPU 时间片,使得两个服务看起来像是同时在运行。当有用户请求访问 Web 页面时,CPU 会暂停数据库服务程序的执行,转而去处理 Web 服务器的请求,处理完后再切换回数据库服务程序。
- 我们常说的,
promise.all多个请求同时发起,就是发起并发请求
进程: 是系统进行资源分配和调度的最小单位
- 简单来说, 一个进程就是一个正在执行的程序。
有独立的内存空间、代码段、数据段等系统资源,- 例如,当你打开一个文本编辑器,操作系统就会为这个文本编辑器创建一个进程
- 例如:当使用node xxx.js 的时候就是启动了一个进程
- 例如:打开一个浏览器的tab就是一个进程
- 例如:开发的时候可以为图片预览器单独开启一个进程,给予他独立的内存空间;这样的话就不会影响主进程;
线程(Thread):是操作系统能够进行运算调度的最小单位
- 被包含在进程中, 是 进程中的实际运作单位, 一个进程可以有多个线程
- 线程可以共享进程的资源:如内存空间、文件句柄,他们可以并发(单核cpu)或者并行(多核cpu上)地执行任务
- 比如,在一个文本编辑器进程中,可能有一个线程负责接收用户输入,另一个线程负责将输入的内容保存到文件中。
Web Workers可以在单独的线程中执行,用来执行一些复杂的计算;减轻主进程的负担
处理高并发场景的一些方式:
- 异步编程:让耗时操作异步执行,避免阻塞
- 事件循环:高并发场景下合理进行任务调度,防止任务堆积
- 使用web workers:复杂的计算任务放在独立的线程中,减轻主线程负担,更好处理数据压力
- 节流和防抖 :限制执行频率
- 优化数据结构与算法:选择合适的数据结构和高效算法
进程和线程的区别:
| 对比项目 | 进程 | 线程 |
|---|---|---|
| 定义 | 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位 | 是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位 |
| 资源分配 | 拥有独立的地址空间,包括内存、文件描述符等系统资源,不同进程之间资源相互隔离 | 共享所属进程的资源,如内存空间、文件句柄等,共享资源可能导致数据一致性问题 |
| 调度和执行 | 是系统资源分配和调度的基本单位,进程间切换复杂,需要切换整个地址空间和各种资源的上下文 | 是 CPU 调度和执行的最小单位,线程间切换相对简单,只需保存和恢复线程私有数据,无需切换整个地址空间 |
| 系统开销 | 创建和销毁进程系统开销大,包括分配独立内存空间、初始化系统资源等;进程间通信机制复杂,成本较高 | 创建和销毁线程系统开销小,只需分配线程私有资源;线程间通信相对简单,通过共享变量即可,但要注意同步和互斥 |
| 独立性 | 独立性强,一个进程崩溃一般不会影响其他进程 | 独立性较弱,一个线程出现问题(如崩溃或死锁)可能会导致整个进程受影响 |