进程与线程详解:区别、状态、通信、上下文切换与虚拟线程
进程更接近资源与隔离边界:它拥有虚拟地址空间、打开文件、凭据等。线程是进程内的执行流,共享这些进程资源,但各自保留栈、寄存器和程序计数器。共享降低通信成本,也让竞态和故障影响更直接。
常见状态包括就绪、运行与阻塞。就绪线程具备运行条件只差 CPU;阻塞线程在等 I/O、锁或事件。时间片耗尽可从运行回到就绪,等待事件完成则从阻塞回到就绪。进程间交换数据需管道、共享内存、Socket 等 IPC,线程间可直接访问共享内存但必须同步。
上下文切换会保存旧线程现场、选择新线程并恢复,还可能扰动缓存和 TLB。进程切换通常涉及更强的地址空间隔离,但现代实现和同进程线程切换的实际差距不能只凭一句“进程重”判断。
Linux 的 fork 创建具有写时复制地址空间的子进程,exec 用新程序替换当前进程映像,wait 回收子进程退出状态。多线程程序在 fork 后子进程只保留调用线程,继承的锁状态可能危险,通常尽快 exec。
Java 虚拟线程由运行时调度到少量平台线程,适合大量阻塞型任务;它不会让 CPU 密集计算超过核心上限,也不能取消数据库连接等外部资源容量。误区是把并发等同并行、认为线程共享栈、认为切入内核必然换线程。小结:资源归进程,执行现场归线程,性能取决于调度、共享和等待模式。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

