当前位置: 首页 > Linux

进程切换和线程切换有什么区别?

时间:2023-04-06 22:54:53 Linux

注意,本题问的是进程切换和线程切换的区别,不是进程和线程的区别。当然,这里的线程指的是同一个进程中的线程。这道题可以考考面试官对进程和线程的理解深度,区分度比较高。要正确回答这个问题,面试官需要了解虚拟内存。虚拟内存解放生产力对于程序员来说,我们在编程的时候其实并不担心内存问题,尤其是使用Java、Python、JavaScript等动态类型语言的程序员。内存自动回收机制的引入使用这类语言的程序员根本不需要关心内存问题;即使是编译型语言C/C++,程序员也只需要关心内存的申请和释放。一般来说,作为程序员(无论我们使用什么类型的语言),我们并不关心数据和程序在物理内存中的位置(设计和实现操作系统的程序员除外),我们可以简单地认为我们的程序占用独家记忆。比如在32位系统中,我们进程占用的内存空间是4G;并且我们可以申请一个超过物理内存大小的空间。比如在只有256MB的系统上,程序员可以申请1G的内存空间。这种假设极大地解放了程序员的生产力。实现这一假设背后的功臣是虚拟内存。什么是虚拟内存?虚拟内存是操作系统为每个进程提供的抽象。每个进程都有自己的、私有的、具有连续地址的虚拟内存。当然,我们知道最终进程的数据和代码肯定是放在物理内存中的,必须有某种机制来记住虚拟地址空间中某个数据是放在哪个物理内存地址上的。这就是所谓的地址空间映射,也就是虚拟内存地址和物理内存地址之间的映射关系,那么操作系统是如何记住这个映射关系的呢?答案就是页表,它记录了虚拟内存地址和物理内存地址的映射关系。有了页表,就可以将虚拟地址转换成物理内存地址。这种机制就是虚拟内存。每个进程都有自己的虚拟地址空间,进程中的所有线程共享进程的虚拟地址空间。现在我们可以回答这个面试问题了。进程切换和线程切换的区别进程切换和线程切换的主要区别之一是进程切换涉及到虚拟地址空间的切换,而线程切换则没有。因为每个进程都有自己的虚拟地址空间,而线程共享进程的虚拟地址空间,所以同一个进程中的线程在切换线程时不涉及虚拟地址空间的转换。举个不恰当的例子,线程切换就像是从主卧走到次卧。反正主卧和次卧在一个屋子里(虚拟地址空间),不用换鞋、换衣服等。但是进程切换不一样。进程切换就像从你家到别人家一样。这是两个不同的房子(不同的虚拟地址空间)。需要换鞋等等。因此,我们可以直观地认为线程在同一个屋檐下,这里的屋檐就是虚拟地址空间,所以线程之间的切换不需要虚拟地址空间的切换;但是进程不同,两个不同的进程位于不同的屋檐下,即进程位于不同的虚拟地址空间,所以进程切换涉及到虚拟地址空间的切换,这也是进程切换比线程切换慢的原因。可能有的同学还不明白,为什么切换虚拟地址空间很费时间呢?为什么虚拟地址切换慢现在我们知道了一个进程有自己的虚拟地址空间。要将虚拟地址转换为物理地址,需要查找页表。页表查找是一个很慢的过程,所以通常使用Cache来缓存常用的Address映射,可以加快页表查找的速度,这个缓存就是TLB,TranslationLookasideBuffer,我们不需要关心这个名字,我们只需要知道TLB本质上就是一个缓存,用来加速页表查找。由于每个进程都有自己的虚拟地址空间,显然每个进程都有自己的页表,所以切换进程??时,页表也必须切换。页表切换后,TLB会失效,缓存失效会导致命中率下降。如果降低虚拟地址,虚拟地址到物理地址的转换会变慢,也就是说程序运行会变慢,线程切换不会导致TLB失败,因为thread线程不需要切换地址空间,所以我们平时说的线程切换应该比作进程切换块,就是这个道理。综上所述,虚拟内存是现代操作系统极其重要的组成部分。当然,限于篇幅,我们这里只能简单介绍一下。关于虚拟内存的详细解释请参考后续操作系统教程。账号:码农荒岛求生。计算机内功决定程序员的职业高度