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