過(guò)關(guān)斬將】面試中不得不提的STAR原則">【過(guò)關(guān)斬將】面試中不得不提的STAR原則
776
2025-04-02
進(jìn)程與線程?(Process vs. Thread?)
面試官(正襟危坐中):給我說(shuō)說(shuō)“線程”與“進(jìn)程”吧。
我(總是不太聰明的樣子):“限乘?”、“進(jìn)什么城(程)?”
面試官:“操作系統(tǒng)中的進(jìn)程與線程,你回去了解一下。門(mén)在左邊,記得關(guān)門(mén)。”
當(dāng)翻譯過(guò)來(lái)后,這兩個(gè)概念都帶了個(gè)“程”字,但進(jìn)程的英文:Process,而線程的英文:Thread,好像并沒(méi)有什么聯(lián)系。
大多數(shù)初學(xué)者一開(kāi)始都會(huì)被這兩個(gè)概念弄的暈頭轉(zhuǎn)向,包括我本人。
當(dāng)你看完這篇文章,可能你就有了新的理解。
不信,你接著往下看看(不過(guò)在這之前,點(diǎn)個(gè)贊或關(guān)注好不好?)。
進(jìn)程和線程基礎(chǔ)(理論概念)
1. 定義
看了下面的定義,可能會(huì)有點(diǎn)暈,但我還是要把他寫(xiě)下來(lái)(為了嚴(yán)謹(jǐn))。
進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
線程是進(jìn)程的一個(gè)實(shí)體,是獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位(CPU上真正運(yùn)行的是線程)。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源。
2.區(qū)別
進(jìn)程是資源分配的基本單位;線程是程序執(zhí)行的基本單位。
進(jìn)程擁有自己的資源空間,沒(méi)啟動(dòng)一個(gè)進(jìn)程,系統(tǒng)就會(huì)為它分配地址空間;而線程與CPU資源分配無(wú)關(guān),多個(gè)線程共享同一進(jìn)程內(nèi)的資源,使用相同的地址空間。
一個(gè)進(jìn)程可以包含若干個(gè)線程。
3. 優(yōu)劣
正是因?yàn)檫@二者有區(qū)別,所以帶來(lái)的各自的優(yōu)劣
線程之間的通信更方便,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(Inter Process Communication,IPC)進(jìn)行。不過(guò)如何處理好同步與互斥是編寫(xiě)多線程程序的難點(diǎn)。
線程的調(diào)度與切換比進(jìn)程快很多,同時(shí)創(chuàng)建一個(gè)線程的開(kāi)銷(xiāo)也比進(jìn)程要小很多。
但是多進(jìn)程程序更健壯,多線程程序只要有一個(gè)線程死掉,整個(gè)進(jìn)程也死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間。
除此之外,推薦看一下阮一峰的一篇博客:進(jìn)程與線程的一個(gè)簡(jiǎn)單解釋?zhuān)脠D解釋十分生動(dòng)形象。
為什么這個(gè)問(wèn)題是面試高頻?
既然這個(gè)問(wèn)題是面試當(dāng)中會(huì)被經(jīng)常問(wèn)到的,所以我去網(wǎng)上找一個(gè)答案,背出來(lái)不就好了。
但是,真的背答案就可以了嗎?
我們來(lái)分析一下為什么眾多面試官老是問(wèn)這個(gè)問(wèn)題,他應(yīng)該并不是想聽(tīng)到一個(gè)對(duì)書(shū)本上概念的重復(fù)。
那么,他究竟想考什么?
側(cè)重點(diǎn)一:面試官想要了解面試者對(duì)這一知識(shí)點(diǎn)的理解程度(因?yàn)檫@是操作系統(tǒng)中不得不提的一個(gè)概念)。如果這個(gè)概念回答不上來(lái),意味著面試者對(duì)操作系統(tǒng)的學(xué)習(xí)并不深。
側(cè)重點(diǎn)二:面試官可以對(duì)你的回答作進(jìn)一步展開(kāi),通過(guò)你的回答某個(gè)側(cè)重點(diǎn)方向來(lái)進(jìn)一步提問(wèn)你對(duì)你自己回答的理解。(這個(gè)高頻問(wèn)題的價(jià)值所在)。
比如:
當(dāng)你回答到:進(jìn)程與線程的內(nèi)存結(jié)構(gòu)不同。進(jìn)程與進(jìn)程之間不能共享內(nèi)存,而線程可以。那么面試官就可以就內(nèi)存這一點(diǎn)深入提問(wèn)——內(nèi)存如何尋址?
當(dāng)你回答:線程之間通信很方便,進(jìn)程與進(jìn)程通信不方便。那么問(wèn)題就又來(lái)了,你給我說(shuō)一下進(jìn)程之間怎么通信?進(jìn)程之間通信方法有哪些?不同通信方法有哪些優(yōu)劣點(diǎn)?
一個(gè)更滿意的答案?
如何作答,才能展示一個(gè)讓面試官更滿意的答案?
這里就不得不用張三豐教給張無(wú)忌的太極拳的那一招——忘掉。。。
對(duì)就是把上面的概念全都忘掉。只留一個(gè)目的:“把敵人打敗”。
最后用自己的一招一式(理解)來(lái)回答。
再談“進(jìn)程”與“線程”(口語(yǔ)表述)
進(jìn)程的本質(zhì)::正在執(zhí)行的一個(gè)程序,可以進(jìn)程比作一個(gè)容器或者工廠
通過(guò)上圖,方便我們了解并記憶:
進(jìn)程與進(jìn)程之間相對(duì)獨(dú)立
進(jìn)程可以包括幾個(gè)或者上百個(gè)線程在運(yùn)行。
內(nèi)存(邏輯內(nèi)存)包括在進(jìn)程里面,每個(gè)進(jìn)程的內(nèi)存都是互相獨(dú)立的,但從一個(gè)更高的層次上看,不同的進(jìn)程也共享著一個(gè)巨大的空間,這個(gè)空間就是整個(gè)計(jì)算機(jī)。
進(jìn)程共有文件/網(wǎng)絡(luò)句柄(handle),這樣可以打開(kāi)同一個(gè)文件,搶同一個(gè)網(wǎng)絡(luò)端口。
從不同的視角來(lái)看進(jìn)程:
線程的本質(zhì):真正運(yùn)行的是一個(gè)一個(gè)的線程
同理,上圖我們知道線程包含:
棧(堆棧):主線程的main函數(shù)、進(jìn)行函數(shù)調(diào)用的參數(shù)和返回地址、局部變量等內(nèi)容都會(huì)被壓入棧內(nèi)
PC(Program Couner):程序計(jì)數(shù)器,PC的指針指向代碼所在的內(nèi)存地址。
TLS(Thread local storage):分配內(nèi)存,存放變量
當(dāng)有了上面的問(wèn)題做引子后,面試官就可以借此引出更多話題:
1. 如何通信(溝通)的內(nèi)容
通信是人的基本需求,進(jìn)程與進(jìn)程之間是相互獨(dú)立的,也有通信需求。根據(jù)這一問(wèn)題就可以展開(kāi)內(nèi)容提問(wèn):
進(jìn)程/線程如何通信
答:進(jìn)程可以通過(guò)管道、套接字、信號(hào)交互、共享內(nèi)存、消息隊(duì)列等等進(jìn)行通信;而線程本身就會(huì)共享內(nèi)存,指針指向同一個(gè)內(nèi)容,交互很容易。
通信方式的差異,比如進(jìn)程間共享內(nèi)存和消息隊(duì)列有何異同?
2. 如何同步(協(xié)調(diào))的內(nèi)容
一旦有了通信,人與人之間就會(huì)產(chǎn)生矛盾,進(jìn)程也一樣。這些矛盾就會(huì)體現(xiàn)在如何同步上。
在單個(gè)CPU下,實(shí)際上在任何時(shí)刻只能有一個(gè)進(jìn)程處于執(zhí)行狀態(tài)。而其他進(jìn)程則處于非執(zhí)行狀態(tài)。我們是如何確定在任意時(shí)刻到底由哪個(gè)進(jìn)程執(zhí)行,哪些不執(zhí)行呢?進(jìn)而又可以引出鎖的概念?(如何進(jìn)行進(jìn)程調(diào)度?)
線程之間的關(guān)系是合作關(guān)系。既然是合作,那就得有某種約定的規(guī)則,否則合作就會(huì)出問(wèn)題。(如何進(jìn)行線程同步?)
3. 關(guān)于內(nèi)存原理相關(guān)問(wèn)題
進(jìn)程要分配內(nèi)存,所以開(kāi)銷(xiāo)很大,進(jìn)程只需要分配棧,分配一個(gè)PC就好,內(nèi)存開(kāi)銷(xiāo)小。
這一塊就可以問(wèn)到了操作系統(tǒng)中的內(nèi)存原理相關(guān)的內(nèi)容。
總結(jié)
總之,如果上述內(nèi)容你都了解,那肯定是不怕被問(wèn)到(大佬,請(qǐng)收下我的膝蓋);如果看了此篇文章之后,你能答出個(gè)大概,我相信面試官也會(huì)放過(guò)你,畢竟,我們也真的不是背書(shū)機(jī)器。所以,我們?cè)诨卮疬^(guò)程中,盡量別給自己挖坑,用自己理解的知識(shí)點(diǎn)進(jìn)行回答。
切忌背書(shū)式的回答,模棱兩可,因?yàn)檫@樣面試官幾個(gè)連環(huán)炮就容易暴露問(wèn)題了。
如果你能看到這,能否給我點(diǎn)個(gè)關(guān)注,點(diǎn)個(gè)贊讓我也收到鼓勵(lì)。如果覺(jué)得我寫(xiě)的內(nèi)容有誤,也歡迎評(píng)論指出。
注意,要敲黑板啦。
進(jìn)程是什么?它指的是一個(gè)運(yùn)動(dòng)中的程序。從名字上看,進(jìn)程表示的就是進(jìn)展中的程序。一個(gè)程序一旦在計(jì)算機(jī)里運(yùn)行起來(lái),它就成為一個(gè)進(jìn)程。進(jìn)程與進(jìn)程之間可以通信、同步、競(jìng)爭(zhēng),并在一定情況下可能形成死鎖。
那么線程是什么?我們知道,進(jìn)程是運(yùn)轉(zhuǎn)的程序,是為了在CPU上實(shí)現(xiàn)多道編程而發(fā)明的一個(gè)概念。但是進(jìn)程在一個(gè)時(shí)間只能干一件事情。如果想同時(shí)干兩件事,辦法就是線程。線程是進(jìn)程里面的一個(gè)執(zhí)行上下文或者執(zhí)行序列。
最后,祝大家答的愉快!面試過(guò)!過(guò)!過(guò)!
參考資料:
《現(xiàn)代操作系統(tǒng)(第3版)》
《操作系統(tǒng)之哲學(xué)原理(第2版)》
任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。