通过页表理解进程切换和线程切换开销上的区别

时间:2025-05-12 08:40:33

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

前言

为什么用多线程或多进程?

  1. 程序的大部分耗时在等待IO上,瓶颈不在CPU上时,可以提高CPU利用率
  2. 需要集中快速处理大量数据,并且不受先后顺序影响
  3. 评论区还可补充ing

线程和线程

线程的实现可以分为两类:

  • 用户级线程:不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,在语言层面利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快,操作系统内核不知道多线程的存在,因此一个线 程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少
  • 内核线线程:又称为内核支持的线程或轻量级进程,所以需要切换到内核态。

进程切换都需要内核态转换

为什么进程切换比线程切换开销大?

       逻辑地址:操作系统在页表中记录了逻辑地址到物理内存地址的映射关系,有了页表就可以将逻辑地址转换为物理内存地址了。每个进程都有自己的逻辑地址,进程内的所有线程共享进程的逻辑地址。

       进程切换与线程切换的最主要区别:进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用TLB(Translation Lookaside Buffer)来缓存页地址,用来加速页表查找。当进程切换后页表也要进行切换,页表切换后TLB就失效了,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。