面试知识库
极高 基础

进程与线程区别#

一句话答案#

进程是资源分配单位(独立地址空间),线程是 CPU 调度单位(共享进程资源),线程切换开销更小。

核心要点
维度进程线程
资源独立地址空间共享堆/方法区
切换大(TLB失效)小(不切地址空间)
通信IPC(管道/共享内存)直接共享内存
崩溃影响不影响其他进程可能导致整个进程崩溃
面试回答(2分钟版)

进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。进程拥有独立的地址空间,包括代码段、数据段、堆和栈,进程间互相隔离,一个进程崩溃不影响其他进程。线程存在于进程内部,同一进程的多个线程共享堆和方法区,但各自拥有独立的栈和程序计数器。这导致几个关键差异:第一,上下文切换开销不同,进程切换需要切换地址空间导致TLB全部失效,线程切换不需要切换地址空间所以开销小得多;第二,通信方式不同,进程间通信需要IPC机制如管道、共享内存、消息队列,线程间可以直接通过共享内存通信但需要注意同步问题;第三,稳定性不同,多进程隔离性强但资源消耗大,多线程效率高但一个线程的异常可能导致整个进程崩溃。在Java中,一个线程默认栈大小1MB,JVM进程内可以创建数百到数千个线程。实际选型上,Nginx用多进程模型保证稳定性,而Java后端通常用多线程模型提高并发效率。

追问与易错

追问方向:

  • “线程和协程区别?”→ 线程是 OS 内核调度(MB 级栈、切换涉及内核态),协程是用户态调度(KB 级栈、切换不进内核),协程可创建百万级而线程通常数千
  • “一个 Java 线程占多少内存?”→ 默认栈大小 1MB(-Xss 可调),加上线程元数据约 1.5MB;创建几千个线程就会消耗 GB 级内存,高并发场景需要线程池或虚拟线程
  • “进程崩溃一定不影响其他进程吗?”→ 通常不影响(地址空间独立),但共享资源场景例外:如崩溃进程持有文件锁未释放、共享内存被破坏、子进程变僵尸消耗 PID

易错点:

  • ❌ 线程就是轻量级进程——实现不同
  • ❌ 多线程就比多进程好——多进程隔离性更强