併發編程模型

併發編程模型

一.分類程序員

按照線程通訊機制能夠分爲共享內存模型消息傳遞模型編程

1.共享內存模型:線程之間共享程序的公共狀態,編程之間經過讀寫內存中的公共狀態來隱式進行通訊。相互通訊的進程共享某些數據結構或共享存儲區,進程經過這些空間進行通訊,所以又能夠分爲兩種類型:安全

1).基於共享數據結構的通訊方式。在這種通訊方式中要求各進程公用某些數據結構來實現進程間的信息交換。好比用有界緩衝區這種數據結構實現生產者-消費者問題。在這裏公用數據結構的設置和進程間同步的處理,會增長負擔,因此這種通訊方式是低微的,只適用於傳遞相對少許的數據。數據結構

2).基於共享存儲區的通訊方式。爲了大量傳輸數據,在存儲器中劃分出了一塊共享存儲區;各個進程能夠經過對數據的讀或寫來實現通訊。這種方式下,進程在通訊前,先向系統申請得到共享存儲區的一個分區並指定該分區的關鍵字;若系統已經給其餘進程分配了這樣的分區,則返回該分區的描述符,申請者將得到的共享存儲分區鏈接到本進程上,而後就能夠像讀寫普通存儲器同樣地讀寫公共存儲分區。多線程

2.消息傳遞模型:線程之間沒有公共狀態,線程之間必須經過明確的發送消息來顯示進行通訊,當任務在不一樣的計算機上運行時一般使用。 當任務須要與另外一個進行通訊時,它會發送遵循預約義協議的消息。 若是發送方在發送消息後繼續執行,發送方被阻塞等待響應或異步,則該通訊能夠是同步的。消息系統的功能是容許進程與其它的進程進行通訊。咱們已經看到了消息傳遞在微內核中的應用。在這種方案下,服務做爲普通的用戶進程提供,服務在內核以外。用戶進程之間的通訊經過傳遞消息完成。IPC 至少提供了兩種操做:send和receive。 進程發送的消息能夠是定長的也能夠是變長的。若是隻能夠發送定長的消息,那麼系統層的實現就很簡單。然而,這種限制增長了 程序設計的難度。另外一方面,變長的消息須要更復雜的系統層實現,可是 程序設計工做更簡單併發

若是進程P 和Q要進行通訊,那麼它們必須可以互相發送和接收消息;兩者之間必需要創建一條通訊鏈路。有多種方法能夠實現這條鏈路。在這兒,咱們並不關心鏈路的物理實現,而是要考慮它的邏輯實現。有以下幾種用於邏輯實現send/receive 操做的方法:異步

  1. 直接或間接通訊操作系統

  2. 對稱或不對稱通訊線程

  3. 自動或手動緩衝設計

  4. 發送拷貝或引用

  5. 定長消息或變長消息

同步是指程序用於控制不一樣線程之間操做發生相對順序的機制。在共享內存併發模 型裏,同步是顯式進行的。程序員必須顯式指定某個方法或某段代碼須要在線程之 間互斥執行。在消息傳遞的併發模型裏,因爲消息的發送必須在消息的接收以前, 所以同步是隱式進行的。

實現同步的機制主要有臨界區、互斥、信號量和事件

臨界區:經過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只容許一個線程對共享資源進行訪問,若是有多個線程試圖訪問公共資 源,那麼在有一個線程進入後,其餘試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放後,其餘線程才能夠搶佔。

互斥量:採用互斥對象機制。 只有擁有互斥對象的線程纔有訪問公共資源的權限,由於互斥對象只有一個,因此能保證公共資源不會同時被多個線程訪問。互斥不只能實現同一應用程序的公共資源安全共享,還能實現不一樣應用程序的公共資源安全共享 .互斥量比臨界區複雜。由於使用互斥不只僅可以在同一應用程序不一樣線程中實現資源的安全共享,並且能夠在不一樣應用程序的線程之間實現對資源的安全共享。

信號量:它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目 。信號量對象對線程的同步方式與前面幾種方法不一樣,信號容許多個線程同時使用共享資源,這與操做系統中的PV操做相同。它指出了同時訪問共享資源的線程最大數目。它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目。

事件:經過通知操做的方式來保持線程的同步,還能夠方便實現對多個線程的優先級比較的操做 。

:Java 的併發採用的是共享內存模型,Java 線程之間的通訊老是隱式進行,整個通 信過程對程序員徹底透明。

相關文章
相關標籤/搜索