面試官:兄弟,說說進程和線程的區(qū)別吧?
大家好,我是心里一直裝著大家的二哥呀。
進程(process)和線程(thread)不僅是操作系統(tǒng)中的兩個基本概念,也是面試官最喜歡考察的問題之一,很有必要來搞清楚。
開門見山地說吧。
進程就是應用程序在內存中分配的空間,也就是正在運行的程序,各個進程之間互不干擾。同時進程保存著程序每一個時刻運行的狀態(tài)。
此時,CPU采用時間片輪轉的方式運行進程:CPU為每個進程分配一個時間段,稱作它的時間片。如果在時間片結束時進程還在運行,則暫停這個進程的運行,并且CPU分配給另一個進程(這個過程叫做上下文切換)。如果進程在時間片結束前阻塞或結束,則CPU立即進行切換,不用等待時間片用完。
使用進程+CPU時間片輪轉方式的操作系統(tǒng),在宏觀上看起來同一時間段執(zhí)行多個任務,換句話說,進程讓操作系統(tǒng)的并發(fā)成為了可能。雖然并發(fā)從宏觀上看有多個任務在執(zhí)行,但在事實上,對于單核CPU來說,任意具體時刻都只有一個任務在占用CPU資源。
雖然進程的出現,使得操作系統(tǒng)的性能大大提升,但是隨著時間的推移,人們并不滿足一個進程在一段時間只能做一件事情,如果一個進程有多個子任務時,只能逐個地執(zhí)行這些子任務,很影響效率。
那么能不能讓這些子任務同時執(zhí)行呢?于是人們又提出了線程的概念,讓一個線程執(zhí)行一個子任務,這樣一個進程就包含了多個線程,每個線程負責一個單獨的子任務。
總之,進程和線程的提出極大地提高了操作系統(tǒng)的性能。進程讓操作系統(tǒng)的并發(fā)性成為了可能,而線程讓進程的內部并發(fā)成為了可能。
這下能理解了吧?
如果還不理解的話,可以看一下阮一峰老師的解釋。
原文鏈接:https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在運行。

假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背后的含義就是,單個CPU一次只能運行一個任務。

進程就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態(tài)。

一個車間里,可以有很多工人。他們協(xié)同完成一個任務。

線程就好比車間里的工人。一個進程可以包括多個線程。

車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象征一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。

可是,每間房間的大小不同,有些房間最多只能容納一個人,比如廁所。里面有人的時候,其他人就不能進去了。這代表一個線程使用某些共享內存時,其他線程必須等它結束,才能使用這一塊內存。

一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,后到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區(qū)域。

還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大于n,多出來的人只能在外面等著。這好比某些內存區(qū)域,只能供給固定數目的線程使用。

這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。后到的人發(fā)現鑰匙架空了,就知道必須在門口排隊等著了。這種做法叫做"信號量"(Semaphore),用來保證多個線程不會互相沖突。
不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用后者替代前者。但是,因為mutex較為簡單,且效率高,所以在必須保證資源獨占的情況下,還是采用這種設計。

操作系統(tǒng)的設計,因此可以歸結為三點:
以多進程形式,允許多個任務同時運行; 以多線程形式,允許單個任務分成不同的部分運行; 提供協(xié)調機制,一方面防止進程之間和線程之間產生沖突,另一方面允許進程之間和線程之間共享資源。
怎么樣,進程和線程的概念就徹底搞懂了吧?再遇到面試官問這個問題,就直接吊打他吧。
我是二哥呀,點贊 + 在看只要來一個,我這張帥臉就泛起了笑容。
送大家一句我最喜歡的短詩:沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。
推薦閱讀:
