我們都知道,進程(process)和線程(thread)是操作系統(tǒng)最基本的幾個概念,也是面試官在操作系統(tǒng)部分最喜歡考察的問題之一。然而這兩個概念一直比較抽象,不太容易形象化地理解和掌握。
本文會對線程和進程進行很形象的描述,當面對面試官時,也能侃侃而談!
一:進程和線程概要
1、計算機的核心是CPU,好比一個工廠,每時每刻都在不停的運作,好比電腦開機后,每時每刻都在進行各種處理

2、假設這個工廠目前電力不夠,一次只能提供給一個生產(chǎn)車間進行使用,當這個生產(chǎn)車間開啟時,其他生產(chǎn)車間都必須停工,背后的含義就是一個CPU只能同時運行一個任務

3、那么問題來了,什么是進程呢,進程就好比上面例子中的生產(chǎn)車間,他代表了一個CPU同時處理的單個任務,請記住,任一時刻,CPU都只能運行一個進程,其他的進程都是非運行的狀態(tài)

4、進程介紹完了,那么什么是線程呢,線程就是一個車間里的一個工人,一個車間里有很多工人,他們各司其職,協(xié)同完成任務,所以,一個進程可以包含多個線程

5、一個車間的茶水室,辦公室,廁所等房間都是所有工人共享的,每個工人都可以自由出入,這象征著一個進程中,所有的線程共享同一塊內(nèi)存空間。

7但是問題來了,有的車間可能只有一間廁所,當別人占用時,其他人就只能干等著,不能進去,背后的含義就是當一個線程使用某塊共享內(nèi)存時,其他線程必須等它使用完畢,才能使用這塊內(nèi)存。

8、當上廁所時,一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,并做個上鎖的標記,后到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫“互斥鎖”( Mutex),防止多個線程同時讀寫某一塊內(nèi)存區(qū)域引起混亂

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

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

11、綜上所述,操作系統(tǒng)的設計,可以歸結(jié)為三點:
(1)以多進程形式,允許多個任務同時運行;(2)以多線程形式,允許單個任務分成不同的部分運行;(3)提供協(xié)調(diào)機制,一方面防止進程之間和線程之間產(chǎn)生沖突,另一方面允許進程之間和線程之間共享資源。
二:線程間通信,進程間通信
python 可以通過 thread 或 threading 模塊實現(xiàn)多線程,threading 相比 thread 提供了更高階、更全面的線程管理。我們下文主要以 threading 模塊介紹多線程的基本用法。
預知詳情如何請聽下回分解~