前端突围:从单线程JS到多进程浏览器|进程/线程面试核心指南

44 阅读5分钟

公众号:小博的前端笔记

核心区别 (一句话概括)

  • 进程 (Process) 是操作系统资源分配的基本单位。一个程序运行起来就是一个进程,它拥有自己独立的内存空间(堆、栈、代码区等)。
  • 线程 (Thread) 是操作系统调度执行(CPU执行) 的基本单位。一个进程内可以包含多个线程,这些线程共享所属进程的内存空间(堆、全局变量)和资源(如文件句柄),但每个线程拥有自己独立的栈空间。

关键对比点 (适合面试快速回答)

特性进程 (Process)线程 (Thread)对前端的意义/例子
资源拥有独立的内存空间和系统资源 (CPU、内存、文件等)共享所属进程的内存空间和资源,拥有独立栈浏览器中每个标签页通常是独立进程(更安全、稳定)
切换开销开销大 (需要保存/恢复整个内存映像、寄存器状态等)开销小 (只需保存/恢复寄存器、栈等少量上下文)Web Worker 本质是新线程,通信开销比跨进程 (IPC) 小很多
通信方式复杂:需要进程间通信 (IPC),如管道、消息队列、共享内存简单:可直接读写共享的进程内存(需同步机制如锁)Web Workers 通过 postMessage 通信 (类似 IPC)
健壮性:一个进程崩溃通常不会影响其他进程:一个线程崩溃可能导致整个进程崩溃 (共享内存)浏览器单标签页崩溃不会导致整个浏览器关闭
并发性进程间并发线程间并发 (充分利用多核 CPU)Node.js 通过 worker_threads 利用多核;浏览器 JS 主线程是单线程
创建销毁速度慢,资源消耗大速度快,资源消耗相对小创建 Web Worker (新线程) 比创建新浏览器进程快得多

关联前端场景的补充说明 (加分项)

  1. 浏览器架构:

    • 现代浏览器(如 Chrome)采用多进程架构:通常一个浏览器主进程、一个 GPU 进程、一个网络进程、多个渲染进程(通常一个标签页对应一个渲染进程,有时同源标签页会共享)、多个插件进程等。

    • 这样做主要是为了安全(沙箱隔离)和稳定性(一个标签页崩溃不会影响其他标签页或浏览器本身)。

    • 一个渲染进程内部,通常包含以下关键线程

      • 主线程 (Main Thread / UI Thread): 负责运行 JavaScript(V8 引擎)、解析 HTML/CSS、构建 DOM/CSSOM、布局 (Layout)、绘制 (Paint 指令生成)、处理用户事件等。这是前端开发者打交道最多的线程,也是单线程的。
      • 合成线程 (Compositor Thread): 负责将图层 (Layers) 合成最终图像并交给 GPU 绘制到屏幕上。与主线程并行工作以提高流畅度。
      • 光栅化线程 (Raster Thread): 负责将绘制指令 (Paint) 转换成实际的像素位图 (通常在 GPU 上执行)。可能有多个。
      • Web Worker 线程: 开发者创建的额外线程,用于执行耗时计算而不阻塞主线程。它们不能直接操作 DOM
  2. Node.js:

    • 默认是单进程、单线程(基于事件循环)。这是其高并发 I/O 性能的基础,但也限制了 CPU 密集型任务。
    • worker_threads 模块: 允许创建真正的操作系统线程(共享内存),用于 CPU 密集型任务。这些是线程,不是进程。
    • child_process 模块: 允许创建新的进程(如 fork()),这些进程有独立内存,通过 IPC 通信。
  3. Web Workers:

    • 在浏览器中,Web Worker 运行在独立的线程中(属于其父页面所在的渲染进程)。
    • 它们与主线程不共享内存,通过 postMessage 进行异步消息传递(类似 IPC)。这保证了主线程的安全和稳定(Worker 崩溃不会导致页面崩溃)。
    • Dedicated Worker 属于创建它的页面。Shared Worker 可被同源多个页面共享。Service Worker 是一个特殊的 Worker,主要用于网络代理和离线缓存。

面试回答建议 (简洁版)

“进程和线程都是并发执行的单位。核心区别在于:

  1. 资源隔离: 进程拥有独立的内存和资源,线程共享其所属进程的内存和资源(但有独立栈)。
  2. 开销: 进程创建、切换、销毁开销大;线程开销小。
  3. 通信: 进程间通信 (IPC) 复杂且慢;线程间通信(通过共享内存)快但需要同步机制(如锁)。
  4. 健壮性: 进程崩溃互不影响;线程崩溃可能导致整个进程崩溃。

在前端领域:

  • 浏览器用多进程架构(如每个标签页一个渲染进程)来隔离页面保证安全和稳定。
  • 在一个渲染进程内,主线程执行 JS、渲染等核心任务,是单线程的。Web Workers 允许我们创建额外的线程执行后台任务,它们通过 postMessage 与主线程通信。
  • Node.js 默认单线程,但可以通过 worker_threads 创建线程利用多核 CPU,或通过 child_process 创建新进程。”

记住关键点

  • 进程 = 独立王国 (有自己土地/资源)
  • 线程 = 王国里的工人 (共享王国资源,协同工作)
  • 前端主线程是单线程 (JS/DOM 操作)
  • Web Worker = 额外工人 (不能碰 DOM,靠写信沟通)