天天看點

線程通信和程序通信差別(線程程序差別)

前言:

騰訊筆試中多道選擇題考到這個問題,這裡總結一下。學習Java的童鞋可能對于線程的了解要比學php好很多。本文參考于線程通信與程序通信的差別 。

程序和線程的差別:

對于程序來說,子程序是父程序的複制品,從父程序那裡獲得父程序的資料空間,堆和棧的複制品。

而線程,相對于程序而言,是一個更加接近于執行體的概念,可以和同程序的其他線程之間直接共享資料,而且擁有自己的棧空間,擁有獨立序列。

共同點: 它們都能提高程式的并發度,提高程式運作效率和響應時間。線程和程序在使用上各有優缺點。 線程執行開銷比較小,但不利于資源的管理和保護,而程序相反。同時,線程适合在SMP機器上運作,而程序可以跨機器遷移。

他們之間根本差別在于 多程序中每個程序有自己的位址空間,線程則共享位址空間。所有其他差別都是因為這個差別産生的。比如說:

1. 速度。線程産生的速度快,通訊快,切換快,因為他們處于同一位址空間。

2. 線程的資源使用率好。

3. 線程使用公共變量或者記憶體的時候需要同步機制,但程序不用。

而他們通信方式的差異也仍然是由于這個根本原因造成的。

通信方式之間的差異

因為那個根本原因,實際上隻有程序間需要通信,同一程序的線程共享位址空間,沒有通信的必要,但要做好同步/互斥,保護共享的全局變量。

而程序間通信無論是信号,管道pipe還是共享記憶體都是由作業系統保證的,是系統調用.

一、程序間的通信方式

  1. 管道( pipe ):

    管道是一種半雙工的通信方式,資料隻能單向流動,而且隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。

  2. 有名管道 (namedpipe) :

    有名管道也是半雙工的通信方式,但是它允許無親緣關系程序間的通信。

  3. 信号量(semophore ) :

    信号量是一個計數器,可以用來控制多個程序對共享資源的通路。它常作為一種鎖機制,防止某程序正在通路共享資源時,其他程序也通路該資源。是以,主要作為程序間以及同一程序内不同線程之間的同步手段。

  4. 消息隊列( messagequeue ) :

    消息隊列是由消息的連結清單,存放在核心中并由消息隊列辨別符辨別。消息隊列克服了信号傳遞資訊少、管道隻能承載無格式位元組流以及緩沖區大小受限等缺點。

  5. 信号 (sinal ) :

    信号是一種比較複雜的通信方式,用于通知接收程序某個事件已經發生。

  6. 共享記憶體(shared memory ) :

    共享記憶體就是映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以通路。共享記憶體是最快的 IPC 方式,它是針對其他程序間通信方式運作效率低而專門設計的。它往往與其他通信機制,如信号兩,配合使用,來實作程序間的同步和通信。

  7. 套接字(socket ) :

    套接口也是一種程序間通信機制,與其他通信機制不同的是,它可用于不同裝置及其間的程序通信。

二、線程間的通信方式

  1. 鎖機制:包括互斥鎖、條件變量、讀寫鎖
    • 互斥鎖提供了以排他方式防止資料結構被并發修改的方法。
    • 讀寫鎖允許多個線程同時讀共享資料,而對寫操作是互斥的。
    • 條件變量可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
  2. 信号量機制(Semaphore):包括無名線程信号量和命名線程信号量

    信号機制(Signal):類似程序間的信号處理

線程間的通信目的主要是用于線程同步,是以線程沒有像程序通信中的用于資料交換的通信機制。