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