任務平行
任務平行(英語: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).