分類簡介
並行技術可分為三類,分別是執行緒庫、訊息傳遞庫和編譯器支持。執行緒庫(如 POSIX* 執行緒和 Windows* API 執行緒)可實現對執行緒的顯性控制;如果需要對執行緒進行精細管理,可以考慮使用這些顯性執行緒技術。藉助訊息傳遞庫(如訊息傳遞接口〔MPI〕),應用程式可同時利用多台計算機,它們彼此間不必共享同一記憶體空間。MPI 廣泛套用於科學計算領域。第三項技術是在編譯器中實現的執行緒處理支持,採用的形式自動並行化。一旦將執行緒處理引入到應用程式中,開發人員就可能要面對一系列新的編程缺陷(Bug)。其中許多缺陷是難以檢測到的,需要付出額外的時間和關注以確保程式的正確運行。一些比較常見的執行緒處理問題包括:數據爭用 ,同步,執行緒停頓 ,死鎖 ,共享錯誤.
並行技術可以分為多進程編程和多執行緒編程。人們總會用某種IPC(inter-process communication,進程間通信)的形式來實現進程間同步,如管道(pipes),信號量(semaphores),信息佇列(message queues),或者共享存儲(shared memory)。在所有的這些IPC形式中,共享存儲器是最快的(除了門(doors)之外)。在處理進程間資源管理,IPC和同步時,你可以選擇 POSIX或者System V的定義。
執行緒技術
執行緒技術早在20世紀60年代就被提出,但真正套用多執行緒到作業系統中還是在20世紀80年代中期。現在,多執行緒技術已經被許多作業系統所支持,包括Windows NT/2000和Linux。
在1999年1月發布的Linux 2.2核心中,進程是通過系統調用fork創建的,新的進程是原來進程的子進程。需要說明的是,在Linux 2.2.x中,不存在真正意義上的執行緒,Linux中常用的執行緒Pthread實際上是通過進程來模擬的。
也就是說,Linux中的執行緒也是通過fork創建的,是“輕”進程。Linux 2.2預設只允許4096個進程/執行緒同時運行,而高端系統同時要服務上千的用戶,所以這顯然是一個問題。它一度是阻礙Linux進入企業級市場的一大因素。
2001年1月發布的Linux 2.4核心消除了這個限制,並且允許在系統運行中動態調整進程數上限。因此,進程數現在只受制於物理記憶體的多少。在高端伺服器上,即使只安裝了512MB記憶體,現在也能輕而易舉地同時支持1.6萬個進程。
在Linux 2.5核心中,已經做了很多改進執行緒性能的工作。在Linux 2.6中改進的執行緒模型仍然是由Ingo Molnar 來完成的。它基於一個1:1的執行緒模型(一個核心執行緒對應一個用戶執行緒),包括核心內在的對新NPTL(Native Posix Threading Library)的支持,這個新的NPTL是由Molnar和Ulrich Drepper合作開發的。
2003年12月發布的Linux 2.6核心,對進程調度經過重新編寫,去掉了以前版本中效率不高的算法。進程標識號(PID)的數目也從3.2萬升到10億。核心內部的大改變之一就是Linux的執行緒框架被重寫,以使NPTL可以運行其上。
在現代作業系統里,同一時間可能有多個核心執行流在執行,因此核心其實象多進程多執行緒編程一樣也需要一些同步機制來同步各執行單元對共享數據的訪問。尤其是在多處理器系統上,更需要一些同步機制來同步不同處理器上的執行單元對共享的數據的訪問。在主流的Linux核心中包含了幾乎所有現代的作業系統具有的同步機制,這些同步機制包括:原子操作、信號量(semaphore)、讀寫信號量(rw_semaphore)、spinlock、BKL(Big Kernel Lock)、rwlock、brlock(只包含在2.4核心中)、RCU(只包含在2.6核心中)和seqlock(只包含在2.6核心中)。
現在的隨著現在計算機體系結構的發展,指令級的並行和執行緒級的並行都在日新月異地發展著.