① 並行技術的介紹
並行技術可分為三類,分別是線程庫、消息傳遞庫和編譯器支持。線程庫可實現對線程的顯性控制;如果需要對線程進行精細管理,可以考慮使用這些顯性線程技術。藉助消息傳遞庫,應用程序可同時利用多台計算機,它們彼此間不必共享同一內存空間。MPI 廣泛應用於科學計算領域。第三項技術是在編譯器中實現的線程處理支持,採用的形式自動並行化。一旦將線程處理引入到應用程序中,開發人員就可能要面對一系列新的編程缺陷(Bug)。其中許多缺陷是難以檢測到的,需要付出額外的時間和關注以確保程序的正確運行。並行技術可以分為多進程編程和多線程編程。人們總會用某種IPC(inter-process communication,進程間通信)的形式來實現進程間同步,如管道(pipes),信號量(semaphores),信息隊列(message queues),或者共享存儲(shared memory)。在所有的這些IPC形式中,共享存儲器是最快的(除了門(doors)之外)。在處理進程間資源管理,IPC和同步時,你可以選擇 POSIX或者System V的定義。
② 什麼是順序程序設計和並行程序設計
簡單的理解,順序就是依次執行工作,並行是同步執行一定量的工作
③ 並行處理技術的並行處理技術-概念
並行性是指在同一時刻或同一時間間隔內完成兩種或兩種以上性質相同或不相同的工作,只要在時間上互相重疊,都存在並行性。計算機系統中的並行性可從不同的層次上實現,從低到高大致可分為:
(1)指令內部的並行:是指指令執行中的各個微操作盡可能實現並行操作。
(2)指令間的並行:是指兩條或多條指令的執行是並行進行的。
(3)任務處理的並行:是指將程序分解成可以並行處理的多個處理任務,而使兩個或多個任務並行處理。
(4)作業處理的並行:是指並行處理兩個或多個作業。如多道程序設計、分時系統等。另外,從數據處理上,也有從低到高的並行層次。
(5)字串位並:同時對一個二進制字的所有位進行操作。
(6)字並位串:同時對多個字的同一位進行操作。
(7)全並行:同時對許多字的所有位進行操作。
④ 並行編程(Future)
說到並行,常見的幾種模式 「回調驅動(多線程環境下)」、「消息/事件驅動(Actor模型中)。
回調是最常見的非同步並發模式,它有即時性高、介面設計簡單等有點。但相對於Future,其缺點也非常明顯。
首先,多線程環境下的回調一般是在觸發回調的模塊線程中執行的,這就意味著編寫回調方法時通常必須考慮線程互斥問題
其次,回調方式介面的提供者在本模塊的線程中執行用戶應用的回調也是相對不安全的,因為你無法確定它會花費多長時間或出現什麼異常,從而可能間接導致本模塊的即時性和可靠性受影響;
再者,使用回調介面不利於順序流程的開發,因為回調方法的執行是孤立的,要與正常流程匯合是比較困難的。因此回調介面適合於在回調中只需要完成簡單任務,並且不必與其它流程匯合的場景。
Future對象本身可以看作是一個顯式的引用,一個對非同步處理結果的引用,可以通過調用Future.isDone()判斷引用的對象是否就緒,並採取不同的處理;而後一種情況則只需調用get()或
get(long timeout, TimeUnit unit)通過同步阻塞方式等待對象就緒。實際運行期是阻塞還是立即返回就取決於get()的調用時機和對象就緒的先後了.
除了上面提到的基礎形態之外,Future還有豐富的衍生變化,這里就列舉幾個常見的。
與一般的Future不同,Lazy Future在創建之初不會主動開始准備引用的對象,而是等到請求對象時才開始相應的工作。因此,Lazy Future本身並不是為了實現並發,而是以節約不必要的運算資源為出發點,效果上與Lambda/Closure類似。例如設計某些API時,你可能需要返回一組信息,而其中某些信息的計算可能會耗費可觀的資源。但調用者不一定都關心所有的這些信息,因此將那些需要耗費較多資源的對象以Lazy Future的形式提供,可以在調用者不需要用到特定的信息時節省資源。
另外Lazy Future也可以用於避免過早的獲取或鎖定資源而產生的不必要的互斥。
Promise可以看作是Future的一個特殊分支,常見的Future一般是由服務調用者直接觸發非同步處理流程,比如調用服務時立即觸發處理或 Lazy Future的取值時觸發處理。但Promise則用於顯式表示那些非同步流程並不直接由服務調用者觸發的情景。例如Future介面的定時控制,其非同步流程不是由調用者,而是由系統時鍾觸發,再比如淘寶的分布式訂閱框架提供的Future式訂閱介面,其等待數據的可用性不是由訂閱者決定,而在於發布者何時發布或更新數據。因此,相對於標準的Future,Promise介面一般會多出一個set()或fulfill()介面。
常規的Future是一次性的,也就是說當你獲得了非同步的處理結果後,Future對象本身就失去意義了。但經過特殊設計的Future也可以實現復用,這對於可多次變更的數據顯得非常有用。例如前面提到的淘寶分布式訂閱框架所提供的Future式介面,它允許多次調用waitNext()方法(相當於Future.get()),每次調用時是否阻塞取決於在上次調用後是否又有數據發布,如果尚無更新,則阻塞直到下一次的數據發布。這樣設計的好處是,介面的使用者可以在其任何合適的時機,或者直接簡單的在獨立的線程中通過一個無限循環響應訂閱數據的變化,同時還可兼顧其它定時任務,甚至同時等待多個Future。簡化的例子如下:
for (;;) {
schele = getNextScheledTaskTime();
while(schele > now()) {
try {
data = subscription.waitNext(schele - now());
processData(data);
} catch(Exception e) {...}
}
doScheledTask();
}
【原文來自: http://www.cnblogs.com/uptownBoy/articles/1772483.html 】