進程切換與線程切換的區別


一、什么是虛擬內存

虛擬內存是操作系統為每個進程提供的一種抽象,每個進程都有屬於自己的,私有的、地址連續的虛擬內存,當然我們知道最終進程的數據
及代碼必然要放到物理內存上,那么必須有某種機制能記住虛擬地址空間中的某個數據 被放到了那個物理內存地址上,這就是所謂的地址空間映射
,也就是虛擬內存地址與物理地址的映射關系,操作系統通過頁表記住這種映射關系,頁表中記錄了虛擬內存地址到物理內存地址的映射關系。有了頁表
就可以將虛擬地址轉換為物理內存地址了,這種機制就是虛擬內存。

二、進程切換和線程切換的區別

進程切換與線程切換的一個最主要區別就在於進程切換涉及到虛擬地址空間的切換而線程切換則不會。因為每個進程都有自己的虛擬地址空間,而線程是共享
所在進程的虛擬地址空間的,因此同一個進程中的線程進行線程切換時不涉及虛擬地址空間的轉換。 舉一個不太恰當的例子,線程切換就好比你從主卧走到次卧,反正主卧和次卧都在同一個房子中(虛擬地址空間),因此你無需換鞋子、換衣服等等。但是進程切
換就不一樣了,進程切換就好比從你家到別人家,這是兩個不同的房子(不同的虛擬地址空間),出發時要換好衣服、鞋子等等,到別人家后還要再換鞋子等等。 因此我們可以形象的認為線程是處在同一個屋檐下的,這里的屋檐就是虛擬地址空間,因此線程間切換無需虛擬地址空間的切換;而進程則不同,兩個不同進程
位於不同的屋檐下,即進程位於不同的虛擬地址空間,因此進程切換涉及到虛擬地址空間的切換,這也是為什么進程切換要比線程切換慢的原因。

三、為什么虛擬地址切換很慢

現在我們已經知道了進程都有自己的虛擬地址空間,把不膩地址轉化為物理地址需要查找頁表,頁表查找是一個很慢的過程,因此通常使用Cache來緩存常用
的地址映射,這樣可以加速頁表查找,這個Cache就是TLB,Translation Lookaside Buffer,我們不需要關心這個名字,只需要知道TLB本質上就是一
個cache,是用來加速頁表查找的。由於每個進程都有自己的虛擬地址空間,那么顯然每個進程都有自己的頁表,那么當進程切換后頁表也要進行切換,頁表
切換后TLB就失效了,cache失效導致命中率降低,那么虛擬地址轉換為物理地址就會變慢,表現出來的就是程序運行會變慢,而線程切換不會導致TLB失效,
因為線程無需切換地址空間,因此我們通常說線程切換比進程切換快,原因就在這里。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM