注意這個題目問的是進程切換與線程切換的區別,不是進程與線程的區別。當然這里的 線程指的是同一個進程中的線程 。
這個問題能很好的考察面試者對進程和線程的理解深度,有比較高的區分度。
要想正確回答這個問題,面試者需要理解虛擬內存。
虛擬內存解放生產力
對于程序員來說,我們在編程時實際上是不怎么操心內存問題的,對于使用Java、Python、JavaScript等動態類型語言的程序員來說更是如此,自動內存回收機制的引入使得使用這類語言的程序員幾乎完全不用關心內存問題;即使對于編譯型語言C/C++來說,程序員需要關心的也僅僅是內存的申請和釋放。
總的來說,作為程序員(無論使用什么類型的語言)我們根本就不關心數據以及程序被放在了 物理內存的哪個位置上 (設計實現操作系統的程序員除外),我們可以簡單的認為我們的程序 獨占內存 ,比如在32位系統下我們的進程占用的內存空間為4G;并且我們可以申請超過物理內存大小的空間,比如在只有256MB的系統上程序員可以申請1G大小的內存空間,這種假設極大的解放了程序員的生產力。
而這種假設實現的背后功臣就是虛擬內存。
什么是虛擬內存
虛擬內存是操作系統為每個進程提供的一種抽象,每個進程都有屬于自己的、私有的、地址連續的虛擬內存,當然我們知道 最終進程的數據及代碼必然要放到物理內存上 ,那么必須有某種機制能記住虛擬地址空間中的某個數據被放到了哪個物理內存地址上,這就是所謂的地址空間映射,也就是虛擬內存地址與物理內存地址的映射關系,那么操作系統是如何記住這種映射關系的呢,答案就是頁表,頁表中記錄了虛擬內存地址到物理內存地址的映射關系。有了頁表就可以將虛擬地址轉換為物理內存地址了,這種機制就是虛擬內存。
每個進程都有自己的虛擬地址空間,進程內的所有線程共享進程的虛擬地址空間。
現在我們就可以來回答這個面試題了。
進程切換與線程切換的區別
進程切換與線程切換的一個最主要區別就在于進程切換涉及到虛擬地址空間的切換而線程切換則不會。因為每個進程都有自己的虛擬地址空間,而線程是共享所在進程的虛擬地址空間的,因此同一個進程中的線程進行線程切換時不涉及虛擬地址空間的轉換。
舉一個不太恰當的例子,線程切換就好比你從主臥走到次臥,反正主臥和次臥都在同一個房子中(虛擬地址空間),因此你無需換鞋子、換衣服等等。但是進程切換就不一樣了,進程切換就好比從你家到別人家,這是兩個不同的房子(不同的虛擬地址空間),出發時要換好衣服、鞋子等等,到別人家后還要再換鞋子等等。
因此我們可以形象的認為線程是處在同一個屋檐下的,這里的屋檐就是虛擬地址空間,因此線程間切換無需虛擬地址空間的切換;而進程則不同,兩個不同進程位于不同的屋檐下,即進程位于不同的虛擬地址空間,因此進程切換涉及到虛擬地址空間的切換,這也是為什么進程切換要比線程切換慢的原因。
有的同學可能還是不太明白,為什么虛擬地址空間切換會比較耗時呢?
為什么虛擬地址切換很慢
現在我們已經知道了進程都有自己的虛擬地址空間,把虛擬地址轉換為物理地址需要查找頁表,頁表查找是一個很慢的過程,因此通常使用Cache來緩存常用的地址映射,這樣可以加速頁表查找,這個cache就是TLB,Translation Lookaside Buffer,我們不需要關心這個名字只需要知道TLB本質上就是一個cache,是用來加速頁表查找的。由于每個進程都有自己的虛擬地址空間,那么顯然每個進程都有自己的頁表,那么當進程切換后頁表也要進行切換,頁表切換后TLB就失效了,cache失效導致命中率降低,那么虛擬地址轉換為物理地址就會變慢,表現出來的就是程序運行會變慢,而線程切換則不會導致TLB失效,因為線程線程無需切換地址空間,因此我們通常說線程切換要比較進程切換塊,原因就在這里。
總結
虛擬內存是現代操作系統極其重要的一部分,當然在這里限于篇幅我們只能簡單介紹,關于虛擬內存的詳細講解見后續操作系統教程,敬請期待
-
代碼
+關注
關注
30文章
4779瀏覽量
68524 -
線程
+關注
關注
0文章
504瀏覽量
19675 -
進程
+關注
關注
0文章
203瀏覽量
13960
發布評論請先 登錄
相關推薦
評論