留神这个题目问的是过程切换与线程切换的区别,不是过程与线程的区别。当然这里的线程指的是同一个过程中的线程。
这个问题能很好的考查面试者对过程和线程的了解深度,有比拟高的区分度。
要想正确答复这个问题,面试者须要了解虚拟内存。
虚拟内存解放生产力
对于程序员来说,咱们在编程时实际上是不怎么操心内存问题的,对于应用 Java、Python、JavaScript 等类型语言的程序员来说更是如此,主动内存回收机制的引入使得应用这类语言的程序员简直齐全不必关怀内存问题;即便对于编译型语言 C /C++ 来说,程序员须要关怀的也仅仅是内存的申请和开释。
总的来说,作为程序员 (无论应用什么类型的语言) 咱们基本就不关怀数据以及程序被放在了物理内存的哪个地位上(设计实现操作系统的程序员除外),咱们能够简略的认为咱们的程序独占内存,比方在 32 位零碎下咱们的过程占用的内存空间为 4G;并且咱们能够申请超过物理内存大小的空间,比方在只有 256MB 的零碎上程序员能够申请 1G 大小的内存空间,这种假如极大的解放了程序员的生产力。
而这种假如实现的背地功臣就是虚拟内存。
什么是虚拟内存
虚拟内存是操作系统为每个过程提供的一种形象,每个过程都有属于本人的、公有的、地址间断的虚拟内存,当然咱们晓得最终过程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据被放到了哪个物理内存地址上,这就是所谓的地址空间映射,也就是虚拟内存地址与物理内存地址的映射关系,那么操作系统是如何记住这种映射关系的呢,答案就是页表,页表中记录了虚拟内存地址到物理内存地址的映射关系。有了页表就能够将虚拟地址转换为物理内存地址了,这种机制就是虚拟内存。
每个过程都有本人的虚拟地址空间,过程内的所有线程共享过程的虚拟地址空间。
当初咱们就能够来答复这个面试题了。
过程切换与线程切换的区别
过程切换与线程切换的一个最次要区别就在于过程切换波及到虚拟地址空间的切换而线程切换则不会。因为每个过程都有本人的虚拟地址空间,而线程是共享所在过程的虚拟地址空间的,因而同一个过程中的线程进行线程切换时不波及虚拟地址空间的转换。
举一个不太失当的例子,线程切换就好比你从主卧走到次卧,反正主卧和次卧都在同一个房子中(虚拟地址空间),因而你无需换鞋子、换衣服等等。然而过程切换就不一样了,过程切换就好比从你家到他人家,这是两个不同的房子(不同的虚拟地址空间),登程时要换好衣服、鞋子等等,到他人家后还要再换鞋子等等。
因而咱们能够形象的认为线程是处在同一个屋檐下的,这里的屋檐就是虚拟地址空间,因而线程间切换无需虚拟地址空间的切换;而过程则不同,两个不同过程位于不同的屋檐下,即过程位于不同的虚拟地址空间,因而过程切换波及到虚拟地址空间的切换,这也是为什么过程切换要比线程切换慢的起因。
有的同学可能还是不太明确,为什么虚拟地址空间切换会比拟耗时呢?这也是面试官紧接会问的第二个问题。对于这个问题的答案,关注公众号“码农的荒岛求生 ”并回复“ 地址切换”几个字你就能失去答案啦。
总结
虚拟内存是古代操作系统极其重要的一部分,当然在这里限于篇幅咱们只能简略介绍,对于虚拟内存的具体解说请参见这里《深刻了解操作系统》