任務平行
任務平行(英語:Task parallelism),也稱為功能平行(function parallelism)或控制平行(control parallelism),是平行計算程式設計模型的一種。在這個模型中,每一個線程執行一個分配到的任務,而這些線程則被分配(通常是作業系統內核)到該平行計算體系的各個計算節點中去。
多處理器排程
一般任務在處理器上通過排程用戶線程(User Thread,相對於內核線程Kernel Thread)實現的。作業系統也可提供一個用戶模式下的排程器。排程器的任務就是儘可能合理的將任務分配和均衡到各個處理器上。
相關概念
同步是任務平行里涉及到最重要的任務之間通訊的方法,分為行程同步(或者線程同步)和數據同步。數據同步和行程同步的目的是為了使程式在多處理器執行的條件下保持一定的主記憶體模型。
- 行程同步主要研究如何確定數個行程之間的執行順序和避免數據競爭(Data race condition)的問題。避免數據競爭的常用方法是在程式中設立臨界區,即一次只允許一個線程執行的一段代碼,通常用於保護重要的公共變數。然而也有理論研究一次允許數個線程執行臨界區代碼的一般情況,稱為l-exclusion問題。
- 數據同步則是研究如何保證在一個變數的多個副本之間保持一致性的問題。數據同步通常涉及到的話題有Cache一致性(Cache Coherence),數據複製(Data replication)等等。
同步對象是用於實現同步的數據結構對象。可分為內核同步對象與用戶同步對象。用戶同步對象更有效率;內核同步對象使得線程在用戶態與內核態切換,花銷巨大。用戶態的同步對象有臨界區與原子操作等;內核態的同步對象有主記憶體屏障(Memory barrier)、互斥鎖(Mutex)、訊號量(Semaphore)和鎖(Lock)、管程(Monitor)、訊息(Message)、自動重設事件、人工重設事件、自動重設定時器、人工重設定時器、進城、線程、作業、檔案、 控制台輸入、檔案修改通知、管道(Pipe)等。
內核同步對象通常有signaled與nonsignaled兩種狀態,可分別譯作置位的(標誌的、通知的)與未置位的(未標誌的、未通知的)。當作業系統設置一個同步對象為signaled,任何等待該對象的線程被從該對象上釋放,從等待狀態變為可執行狀態。同步對象通過等待控制代碼(waitable handle)訪問。等待控制代碼處於signaled狀態,則該等待控制代碼不被任何線程擁有。[1]
Windows作業系統的API:WaitForSingleObject、WaitForMulitpleObjects、SignalObjectAndWait(通知一個內核對象並等待另一個內核對象的原子操作)、MsgWaitForMultipleObjects(等待多個內核對象阻塞時仍可以響應Windows訊息的到來)、MsgWaitForMultipleObjectsEx用來等待同步對象從nonsignaled變為signaled狀態。
參見
參考文獻
- ^ MSDN:Advanced Synchronization Techniques. [2017-02-16]. (原始內容存檔於2017-02-16).