概念:你能明白说清并行、并发、线程和进程吗?

76 阅读4分钟

我们经常听到下面这些概念:高并发的场景下...., 希望可以并行处理.... ,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 可以在单独的线程中执行,用来执行一些复杂的计算;减轻主进程的负担

处理高并发场景的一些方式:

  1. 异步编程:让耗时操作异步执行,避免阻塞
  2. 事件循环:高并发场景下合理进行任务调度,防止任务堆积
  3. 使用web workers:复杂的计算任务放在独立的线程中,减轻主线程负担,更好处理数据压力
  4. 节流和防抖 :限制执行频率
  5. 优化数据结构与算法:选择合适的数据结构和高效算法

进程和线程的区别:

对比项目进程线程
定义是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位
资源分配拥有独立的地址空间,包括内存、文件描述符等系统资源,不同进程之间资源相互隔离共享所属进程的资源,如内存空间、文件句柄等,共享资源可能导致数据一致性问题
调度和执行是系统资源分配和调度的基本单位,进程间切换复杂,需要切换整个地址空间和各种资源的上下文是 CPU 调度和执行的最小单位,线程间切换相对简单,只需保存和恢复线程私有数据,无需切换整个地址空间
系统开销创建和销毁进程系统开销大,包括分配独立内存空间、初始化系统资源等;进程间通信机制复杂,成本较高创建和销毁线程系统开销小,只需分配线程私有资源;线程间通信相对简单,通过共享变量即可,但要注意同步和互斥
独立性独立性强,一个进程崩溃一般不会影响其他进程独立性较弱,一个线程出现问题(如崩溃或死锁)可能会导致整个进程受影响