1. 程式人生 > >面試必問:程序與執行緒的異同以及程序間通訊方式

面試必問:程序與執行緒的異同以及程序間通訊方式

秋招面試必問的題目,感覺今年被問了差不多10次了。

1.程序與執行緒

程序:具有獨立功能的程式關於某個資料集合上的一次執行活動。
執行緒:程序的一個實體。
比喻:一列火車是一個程序,火車的每一節車廂是執行緒。

2.程序與執行緒的聯絡

①一個執行緒只能屬於一個程序,一個程序可以有多個執行緒;
②系統資源分配給程序,同一程序的所有執行緒共享該程序的所有資源;
③真正在處理機上執行的是執行緒;
④不同程序的執行緒間利用訊息通訊的方式實現同步。

3.程序與執行緒的區別

①排程:執行緒是系統排程和分配的基本單位,程序是作為擁有系統資源的基本單位;
②併發性:程序之間可以併發執行,同一程序的多個執行緒時間亦可以併發執行;
③擁有資源:程序是擁有資源的獨立單位,執行緒不擁有資源,但可以訪問隸屬於程序的資源;
④系統開銷:建立和撤銷程序的開銷更大;程序擁有獨立的地址空間,一個程序的崩潰不會影響其他程序;執行緒擁有自己的堆疊和區域性變數,沒有獨立的地址空間,因此程序裡的一個執行緒崩潰會導致其他執行緒均崩潰。

4.程序間通訊方式

程序間通訊方式有很多,網上一說有十幾種。面試的時候說上以下幾種差不多:
①管道:半雙工的通訊方式,資料只能單向流動,且只能在有親緣關係(父子程序或兄弟程序)的程序間使用;
②命名管道:FIFO,半雙工的通訊方式,但允許在無親緣關係的程序間通訊;
③訊息佇列:訊息的連結串列,存放在核心中,並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點;
④訊號量:是一個計數器,用於控制多個程序間對共享資源的訪問;
⑤共享記憶體:對映一段能被其他程序訪問的記憶體,這段記憶體由一個程序建立,但多個程序都可以訪問;
⑥套接字

5.執行緒間通訊方式

多個執行緒在處理同一個資源,並且任務不同時,需要執行緒通訊來幫助解決執行緒之間對同一個變數的使用或操作。就是多個執行緒在操作同一份資料時, 避免對同一共享變數的爭奪。
①鎖機制:包括互斥鎖、條件變數、讀寫鎖

  • 互斥鎖提供了以排他方式防止資料結構被併發修改的方法。
  • 讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。
  • 條件變數可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。

②訊號量機制(Semaphore):包括無名執行緒訊號量和命名執行緒訊號量
③訊號機制(Signal):類似程序間的訊號處理
執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交換的通訊機制。