system column十三Tech
← 返回技术专栏
TECH

操作系统线程机制深度解读:轻量级进程与上下文切换优化

深入对比线程与进程的本质区别,解析线程的优劣势、上下文切换机制,以及同一进程内线程切换的性能优势来源。

操作系统

线程被称为"轻量级进程",但你知道它究竟轻在哪里吗?在现代高并发编程中,线程是不可或缺的核心概念。作为十三Tech操作系统深度系列的一篇,本文将从线程的本质定义出发,对比线程与进程的差异,分析线程上下文切换的优化原理,帮助你理解为什么多线程能成为提升程序并发性能的利器。

什么是线程

线程是进程当中的一条执行流程

同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的

线程的优点:

  • 一个进程中可以同时存在多个线程;
  • 各个线程之间可以并发执行;
  • 各个线程之间可以共享地址空间和文件等资源

线程的缺点:

  • 当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃(部分语言会出现此情况)

线程与进程的比较

线程与进程的比较如下:

  • 进程是资源(包括内存、打开的文件等)分配的单位,线程是 CPU 调度的单位;
  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;
  • 线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;
  • 线程能减少并发执行的时间和空间开销;

对于,线程相比进程能减少开销,体现在:

  • 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
  • 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
  • 同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的;
  • 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

所以,不管是时间效率,还是空间效率线程比进程都要高

线程的上下文切换

对于线程和进程,我们可以这么理解:

  • 当进程只有一个线程时,可以认为进程就等于线程;
  • 当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源,这些资源在上下文切换时是不需要修改的;

线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的

  • 当两个线程不是属于同一个进程,则切换的过程就跟进程上下文切换一样;
  • 当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据

总结

线程作为CPU调度的基本单位,以轻量级的资源占用和高效的上下文切换,成为现代并发编程的基石。相比进程,线程共享地址空间省去了页表切换的开销,而独立的寄存器和栈又保证了控制流的隔离性。理解线程与进程的本质差异,是进行高效并发编程和系统设计的必要前提。更多操作系统与并发编程深度内容,欢迎关注十三Tech。