进程切换VS线程切换

结论:进程切换比线程切换慢。

每个进程都拥有一个自己的虚拟地址空间,并且独立于其他进程的地址空间。进程切换会涉及到虚拟地址空间的切换,而这正是导致进程切换比线程切换慢的原因所在!

虚拟地址转换为物理地址需要两个东西:CPU 上的 MMU 和内存中的页表。每次访问内存,都需要进行虚拟地址到物理地址的转换,对吧,因此,每条指令进行一两次或更多地去访问页表是必要的,而页表又是存在于内存中的。显然,访问页表(内存)次数太多导致其成为了操作系统地一个性能瓶颈,于是,转换检测缓冲区(Translation Lookaside Buffer,TLB)应运而生,也称为快表。简单理解,TLB 就相当于一个缓存。为啥称呼快表呢?因为 TLB 内置在 CPU 的 MMU 中,访问速度跟内存不是一个档次的。内存中的页表一般被称为慢表。

 
事实上,TLB 的出现是基于这样一种现象的:大多数程序总是对少量的页面进行多次的访问。因此,只有很少的页表项会被反复读取,而其他的页表项很少被访问。TLB 中存放的就是那些会被反复读取的页表项。换句话说,TLB 中存放的就是页表中的一部分副本。若 TLB 命中,就不需要再访问内存了;若 TLB 中没有目标页表项,则还需要去查询内存中的页表(慢表),从页表中得到物理页框地址,同时将页表中的该表项添加到 TLB 中。
 
由于进程切换会涉及到虚拟地址空间的切换,这就导致内存中的页表也需要进行切换,一个进程对应一个页表是不假,但是 CPU 中的 TLB 只有一个,页表切换后这个 TLB 就失效了。这样,TLB 在一段时间内肯定是无法被命中的,操作系统就必须去访问内存,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢。而线程切换呢,由于不涉及虚拟地址空间的切换,也就不存在这个问题了。
posted @ 2022-09-15 23:10  jrliu  阅读(334)  评论(0编辑  收藏  举报