C++多核高級編程 在線電子書 圖書標籤: C++ 多核編程 並發編程 多綫程 計算機 C/C++ 操作係統 並行
發表於2024-11-22
C++多核高級編程 在線電子書 pdf 下載 txt下載 epub 下載 mobi 下載 2024
沒怎麼看
評分組織散亂,不夠深入
評分沒怎麼看,條例不清晰,例子不完整
評分沒多少有含量的內容。。一半的內容基本是對man的翻譯
評分沒怎麼看
關 於 作 者
Cameron Hughes是一名專業的軟件開發人員。他是CTEST實驗室的軟件工程師,同時還是Youngstown州立大學的編程人員/分析師。Cameron Hughes有著超過15年的軟件開發經驗,參與過各種規模的軟件開發工作,從商業和工業應用到航空設計和開發項目。Cameron是Cognopaedia的設計者,目前是運行在CTEST實驗室的Pantheon上的GRIOT項目的領導者。Pantheon是具有24個節點的多核集群,用於多綫程搜索引擎和文本提取程序的開發。
Tracey Hughes是CTEST實驗室的高級圖像程序員,負責開發知識和信息的可視化軟件。Tracey Hughes是利用CTEST實驗室的知識可視化的M.I.N.D、C.R.A.I.G、NOFAQS等項目的主要設計人員。她經常緻力於Linux開發軟件。她還是GRIOT項目的小組成員。
Cameron和Tracey Hughes還是關於軟件開發、多綫程和並行編程方麵的6本著作的作者,這6本著作是:Parallel and Distributed Programming Using C++、Linux Rapid Application Development、Mastering the Standard C++ Classes、Object - Oriented Multithreading Using C++、Collection and Container Classes in C++和Object-Oriented I/O Using C++ Iostreams。
譯 者 序
隨著多核時代的到來,原本隻屬於高端應用的並行化編程也隨之變得越來越普及。可以說,在處理器平颱多核的大潮中,單純的芯片製造工藝和技術已經不足以體現和發揮齣多核所帶來的更高處理能力以及性能優勢,具備在多核環境中多綫程工作的軟件將會成為發揮多核高效率的保證。
多核技術在單個封裝內集成瞭更多的核,為實現真正並行提供瞭物質基礎。那麼究竟如何設計和編寫並行應用程序纔能充分發揮多核架構的資源優勢?這正是軟件開發人員所要解決的問題。本書從這一需求齣發,期望為麵嚮多核架構設計和編寫並行應用程序的開發人員提供一些力所能及的幫助。
在翻譯本書的過程中,我們的切身體會就是本書並不僅僅是簡單地介紹如何編寫多核程序,更重要的是為程序開發人員提供瞭如何順利從命令式順序編程遷移到聲明式並行編程的方法。作者以多個應用實例貫穿本書,一步步引導讀者領會如何從問題陳述逐步精化,最終實現並行程序。
本書由齊寜和董澤惠翻譯完成,Be Flying工作室(http://blog.csdn.net/be_flying)負責人肖國尊負責翻譯質量和進度的控製管理。書中文字和內容力求忠實原著,但限於譯者水平和時間緊迫,翻譯過程中難免齣現不妥之處和錯誤,敬請廣大讀者批評指正。
前 言
多核革命即將到來。並行處理不再是超級計算機或集群的專屬領域,入門級服務器乃至基本的開發工作站都擁有硬件級和軟件級並行處理的能力。問題是這對於軟件開發人員意味著什麼?對軟件開發過程會有怎樣的影響?在誰擁有速度最快的計算機的競爭中,芯片生産商更傾嚮於在單獨的芯片上放置多個處理器,而不是提高處理器的速度。迄今為止,軟件開發人員尚能依賴於新的處理器,在不對軟件做齣任何實際改進的情況下提高軟件的速度,但是這樣的情況將成為過去。為瞭提高總體係統性能,計算機供應商已經決定增加更多的處理器,而不是提高時鍾頻率。這意味著如果軟件開發人員希望應用程序從下一個新的處理器受益,就必須對應用程序進行修改以利用多處理器計算機。
盡管順序編程和單核應用程序開發仍會有一席之地,但軟件開發將嚮多綫程和多進程轉變。曾經僅被理論計算機科學傢和大學學術界所關注的並行編程技術,現在正處於為大多數人所接受的過程中。多核應用程序設計和開發的思想如今成為人們關注的主流。
學習多核編程
本書使用一般軟件開發人員能夠理解的術語介紹多核編程的基本知識。為讀者介紹瞭為多處理器和多綫程體係結構進行編程的基礎知識,對並行處理和軟件並發的概念進行瞭實用的介紹。本書介紹的是深奧的、不易理解的並行編程技術,但將使用一種簡單、可理解的方式來介紹它們。我們介紹瞭並發編程和同步的缺陷與陷阱以及應對之策,對多處理和多綫程模型進行瞭直截瞭當的討論。本書提供瞭大量的編程實例,示範瞭如何實現成功的多核編程。本書還包含瞭調試及測試多核編程的方法與技術。最後,我們示範瞭如何使用跨平颱技術來利用處理器的具體特性。
不同的視角
本書的內容是為對多核編程和應用程序開發有著不同切入點的廣大讀者設計的。本書的讀者包含但不限於:
● 庫及工具製作人員
● 操作係統程序員
● 內核開發人員
● 數據庫服務器及應用服務器的設計人員及實現人員
● 科學應用程序員以及使用計算密集型應用程序的用戶
● 應用程序開發人員
● 係統程序員
每組人員都會從不同的視角來瞭解多核計算機。有些人關心的是使用自底嚮上的方法,需要開發利用特定硬件和特定供應商的特性的軟件。對於上述人員而言,他們希望更加詳盡地介紹多綫程處理的知識。其他人員可能對自頂嚮下的方法感興趣,他們不希望為並發任務同步或綫程安全的細節費心,而是傾嚮於使用高級庫和工具來完成工作。還有一些人需要混閤使用自底嚮上和自頂嚮下的方法。本書提供瞭對多核編程的多種視角的介紹,涵蓋瞭自底嚮上和自頂嚮下的方法。
解決方案是多範型方法
首先,我們承認不是每個軟件解決方案都需要多處理或多綫程。有些軟件解決方案通過使用順序編程技術能夠更好地實現(即使目標平颱是多核的)。我們的方法是以解決方案和模型作為驅動。首先,針對問題開發齣模型或解決方案。如果解決方案要求某些指令、過程或任務並發地執行,那麼就決定瞭最好使用哪組技術。這個方法同強迫解決方案或模型去適閤一些預先選擇的庫或開發工具的方法相反。技術應當遵從解決方案。盡管本書討論庫和開發工具,但並不偏嚮任何具體生産商庫或工具集。盡管書中包含瞭利用特定硬件平颱的實例,但我們依賴跨平颱方法,使用POSIX標準操作係統調用和庫,並且僅使用國際化C++標準所支持的C++特性。
麵對多處理和多綫程中的挑戰和障礙,我們倡導組件方法。主要的目的是利用框架類作為並發的構建塊。框架類被麵嚮對象互斥量(mutex)、信號量(semaphore)、管道(pipe)、隊列(queue)和套接字(socket)所支持。通過使用接口類,顯著降低瞭任務同步和通信的復雜度。在我們的多綫程和多處理應用程序中,控製機製主要是agent驅動。這意味著在本書中,您將看到應用程序架構支持軟件開發的多範型(multiple-paradigm)方法。
我們對組件實現使用麵嚮對象編程技術,對控製機製主要使用麵嚮agent編程技術。麵嚮agent編程的思想有時被邏輯編程技術支持。隨著處理器上可用內核數目的增加,軟件開發模型將會越發地依賴麵嚮agent編程和邏輯編程。本書包含瞭對軟件開發的這種多範型方法的簡介。
為何使用C++
事實上,每個平颱和操作環境中均有可用的C++編譯器。ANSI(American National Standards Institute,美國國傢標準協會)和ISO(International Organization for Standardization,國際標準化組織)已經為C++語言和它的庫定義瞭標準。C++語言具有可靠的開源實現以及商業實現,並且已經被全世界的研究人員、設計人員和專業開發人員所廣泛接受。C++語言被用於解決各種各樣的問題,從設備驅動到大規模的工業應用。C++語言支持軟件開發的多範型方法。在C++中,我們可以無縫地實現麵嚮對象設計、邏輯編程設計和麵嚮agent設計。我們還可以在必要時使用結構化編程技術或低級編程技術。這種靈活性正是新的多核技術所需要加以利用的。此外,C++編譯器為軟件開發人員提供瞭多核處理器的新特性的直接接口。
UML圖
本書中的很多圖使用瞭UML(Unified Modeling Language,統一建模語言)標準。特彆是使用活動圖、部署圖、類圖和狀態圖來描述重要的並發架構和類關係。盡管UML的知識不是必需的,但熟悉它會對工作和學習有所幫助。
支持的開發環境
本書中的實例均使用ISO標準C/C++開發。這意味著實例和程序能夠在所有主要環境中進行編譯。完整程序中僅使用POSIX兼容的操作係統調用或庫,因此,這些程序能夠移植到所有兼容POSIX的操作係統環境中。本書中的實例和程序在配有UltraSparc T1 multiprocessor、Intel Core 2 Duo、IBM Cell Broadband Engine和AMD Dual Core Opteron處理器的SunFire 2000上都進行瞭測試。
程序概要
本書中的多數完整程序均伴有一個程序概要(program profile)。概要包含實現細節,如必需的頭文件、必需的庫、編譯指令和鏈接指令。概要還包括一個注釋部分,包含執行程序時需要注意的任何特殊考慮。所有的代碼僅用於說明目的。
測試及代碼可靠性
盡管本書中的所有實例和應用程序均為瞭確保正確性而經過瞭測試,但我們並不保證書中包含的程序沒有缺陷或錯誤,或者同任何特定標準或適銷性相一緻,或滿足您的任何特定應用的要求。您不應依賴於它們來解決這樣的問題,即問題的不正確的解決方案可能會導緻人員傷害或財産損失。作者和齣版商不對使用本書中的實例、程序或應用程序所導緻的直接或間接損害承擔任何責任。
約定
為瞭幫助您更好地瞭解本書的內容,我們在書中使用瞭如下的約定。
對於正文中的樣式:
● 我們對新的術語和重要的詞在引入它們時進行瞭強調。
● 我們采用類似如下的方式顯示組閤鍵:Ctrl+A。
● 我們以兩種不同的方式顯示代碼:
We use a monofont type with no highlighting for most code examples.
We use gray highlighting to emphasize code that s particularly important
in the present context.
本書中既包含程序清單(code listing),又包含代碼示例(code example)。
● 程序清單是完整的、可執行的程序。如前所述,多數情況下,它們會伴有一個程序概要,它會告訴您程序編寫時的環境,並給齣編譯指令和鏈接指令的描述,等等。
● 代碼示例是一些片斷,不加修改是不能夠運行的。它們用來集中展示某些內容如何被調用或使用。
源代碼
在您完成本書中的例子時,您可以選擇手工輸入所有代碼或使用伴隨本書的源代碼文件。本書中所使用的所有源代碼可以從http://www.tupwk.com.cn/downpage下載,也可以從http://www.wrox.com下載。訪問到該網站之後,隻要找到本書的書名(使用Search輸入框或使用一個書名列錶),然後在本書的詳情頁麵上單擊Download Code鏈接來得到本書的所有源代碼。
注意:
由於很多書的書名很類似,最簡單的查找方式是通過ISBN,本書的ISBN為978-0-470-28962-4。
一旦下載瞭代碼,隻需要使用您最喜歡的壓縮工具對它進行解壓。或者,您可以轉到Wrox的代碼下載主頁麵,網址為http://www.wrox.com/dynamic/books/download.aspx,查看本書及所有Wrox書籍的可用代碼。
勘誤錶
我們盡全力確保正文或代碼中沒有錯誤。然而人無完人,錯誤總會發生。如果您在我們的書中發現瞭錯誤,例如拼寫錯誤或錯誤的代碼段,我們將會非常感激您的反饋。通過遞交勘誤,您可能會幫助另一名讀者避免數小時的受挫,同時,也能幫我們提供質量更高的書籍。
為瞭找到本書的勘誤頁麵,請訪問http://www.wrox.com並通過Search輸入框或根據書名列錶找到本書的書名。然後,在本書的詳情頁麵上,單擊Book Errata鏈接。在這個頁麵上您可以看到所有已經為本書提交的並由Wrox編輯發布的勘誤。
如果在Book Errata頁上沒有找到您所發現的錯誤,請將錯誤發送至wkservice@vip.163.com。我們將會查看信息,如果情況屬實,則會發布消息到本書的勘誤頁,並在本書的後續版本中做齣修訂。
p2p.wrox.com
如果您希望同作者和本書其他讀者進行討論,可以加入到http://p2p.wrox.com上的P2P論壇。該論壇是一個基於Web的係統,您可以在論壇中發布同Wrox書籍及相關技術有關的消息,並且可以同其他讀者和技術用戶交流。論壇提供瞭訂閱特性,可以將論壇上發布的您所感興趣的話題通過E-mail發送給您。論壇中有Wrox作者、編輯、其他行業專傢以及讀者。
在http://p2p.wrox.com上,您不僅可以找到許多幫助您閱讀本書的不同的論壇,而且還可以開發自己的應用程序。要想加入論壇,應執行下列步驟:
(1) 進入http://p2p.wrox.com並單擊Register鏈接。
(2) 閱讀使用條款並單擊Agree按鈕。
(3) 填寫加入論壇所要求的信息以及您希望提供的其他可選信息,然後單擊Submit按鈕。
(4) 您將會收到一封電子郵件,其中的內容描述瞭如何驗證您的賬號並完成加入過程。
注意:
即使不加入P2P,您也可以閱讀論壇中的消息,但是如果您希望發布自己的消息,則必須加入P2P。
一旦加入P2P之後,您可以發布新的消息並迴復其他用戶發布的消息。您可以在任何時候閱讀Web上的消息。如果您希望特定論壇的新的消息以電子郵件的形式發送給您,可單擊論壇列錶中論壇名字旁邊的Subscribe to this Forum按鈕。
要想知道更多關於如何使用Wrox P2P的信息,可以閱讀P2P FAQ中關於論壇軟件如何工作以及很多關於P2P和Wrox書籍的其他常見問題的答案。要想閱讀FAQ,可單擊P2P頁麵中的FAQ鏈接。
第1章 新的體係結構 1
1.1 什麼是多核 1
1.2 多核體係結構 2
1.3 軟件開發人員眼中的
多核體係結構 3
1.3.1 基本的處理器體係結構 4
1.3.2 CPU(指令集) 6
1.3.3 內存是關鍵 8
1.3.4 寄存器 10
1.3.5 cache 11
1.3.6 主存 12
1.4 總綫連接 13
1.5 從單核到多核 13
1.5.1 多道程序設計和多處理 14
1.5.2 並行編程 14
1.5.3 多核應用程序的設計與實現 15
1.6 小結 15
第2章 4種有影響的多核設計 17
2.1 AMD Multicore Opteron 19
2.1.1 Opteron的直連
和HyperTransport 19
2.1.2 係統請求接口和交叉開關 20
2.1.3 Opteron使用NUMA結構 21
2.1.4 cache以及多處理器Opteron 22
2.2 Sun UltraSparc T1 多處理器 22
2.2.1 UltraSparc T1內核 24
2.2.2 Cross Talk與Crossbar 25
2.2.3 DDRAM控製器和L2 cache 25
2.2.4 UltraSparc T1、Sun和
GNU gcc編譯器 25
2.3 IBM Cell Broadband Engine 25
2.3.1 CBE與Linux 26
2.3.2 CBE內存模型 27
2.3.3 對操作係統隱藏 27
2.3.4 協處理器部件 28
2.4 Intel Core 2 Duo處理器 28
2.4.1 北橋和南橋 29
2.4.2 Intel的PCI Express 29
2.4.3 Core 2 Duo的指令集 29
2.5 小結 30
第3章 多核編程的挑戰 33
3.1 什麼是順序模型 33
3.2 什麼是並發 34
3.3 軟件開發 35
3.3.1 挑戰1:軟件分解 38
3.3.2 挑戰2:任務間通信 43
3.3.3 挑戰3:多個任務或agent
對數據或資源的並發訪問 47
3.3.4 挑戰4:識彆並發執行的
任務之間的關係 51
3.3.5 挑戰5:控製任務之間的
資源爭奪 53
3.3.6 挑戰6:需要多少個進程
或綫程 53
3.3.7 挑戰7和挑戰8:尋找可靠
的、可重現的調試和測試 54
3.3.8 挑戰9:與擁有多進程組件的
設計的相關人員進行溝通 55
3.3.9 挑戰10:在C++中實現
多處理和多綫程 56
3.4 C++開發人員必須學習新的庫 56
3.5 處理器架構的挑戰 57
3.6 小結 57
第4章 操作係統的任務 59
4.1 操作係統扮演什麼角色 59
4.1.1 提供一緻的接口 59
4.1.2 管理硬件資源和其他
應用軟件 60
4.1.3 開發人員與操作係統
的交互 60
4.1.4 操作係統的核心服務 63
4.1.5 應用程序員的接口 66
程序概要4-1 70
程序概要4-2 74
4.2 分解以及操作係統的任務 75
4.3 隱藏操作係統的任務 77
4.3.1 利用C++抽象和封裝的能力 77
4.3.2 POSIX API的接口類 78
4.4 小結 85
第5章 進程、C++接口類和謂詞 87
5.1 多核是指多處理器 87
5.2 什麼是進程 88
5.3 為什麼是進程而不是綫程 88
5.4 使用posix_spawn( ) 90
5.4.1 file_actions參數 91
5.4.2 attrp參數 92
5.4.3 簡單的posix_spawn( )示例 94
5.4.4 使用posix_spawn的guess_it 95
5.5 哪個是父進程,哪個是
子進程 99
5.6 對進程的詳細討論 99
5.6.1 進程控製塊 100
5.6.2 進程的剖析 101
5.6.3 進程狀態 103
5.6.4 進程是如何被調度的 105
5.7 使用ps實用工具監視進程 107
5.8 設置和獲得進程優先級 110
5.9 什麼是上下文切換 112
5.10 進程創建中的活動 112
5.10.1 使用fork( )函數調用 113
5.10.2 使用exec( )係統
調用係列 113
5.11 進程環境變量的使用 116
5.12 使用system( )生成
新的進程 117
5.13 刪除進程 118
5.13.1 調用exit( )和abort( ) 118
5.13.2 kill( )函數 119
5.14 進程資源 119
5.14.1 資源的類型 120
5.14.2 設置資源限製的POSIX
函數 121
5.15 異步進程和同步進程 124
5.16 wait( )函數調用 125
5.17 謂詞、進程和接口類 127
5.18 小結 131
第6章 多綫程 133
6.1 什麼是綫程 133
6.1.1 用戶級綫程和內核級綫程 134
6.1.2 綫程上下文 136
6.1.3 硬件綫程和軟件綫程 138
6.1.4 綫程資源 138
6.2 綫程和進程的比較 139
6.2.1 上下文切換 139
6.2.2 吞吐量 139
6.2.3 實體間的通信 139
6.2.4 破壞進程數據 140
6.2.5 刪除整個進程 140
6.2.6 被其他程序重用 140
6.2.7 綫程與進程的關鍵類似
和差彆 140
6.3 設置綫程屬性 142
6.4 綫程的結構 143
6.4.1 綫程狀態 144
6.4.2 調度和綫程競爭範圍 145
6.4.3 調度策略和優先級 147
6.4.4 調度分配域 148
6.5 簡單的綫程程序 148
6.6 創建綫程 150
6.6.1 嚮綫程傳遞參數 151
6.6.2 結閤綫程 153
6.6.3 獲得綫程id 154
6.6.4 使用pthread屬性對象 155
6.7 管理綫程 159
6.7.1 終止綫程 159
6.7.2 管理綫程的棧 168
6.7.3 設置綫程調度和優先級 171
6.7.4 設置綫程的競爭範圍 175
6.7.5 使用sysconf( ) 175
6.7.6 綫程安全和庫 177
6.8 擴展綫程接口類 179
6.9 小結 187
第7章 並發任務的通信和同步 189
7.1 通信和同步 189
7.1.1 依賴關係 190
7.1.2 對任務依賴進行計數 193
7.1.3 什麼是進程間通信 195
7.1.4 什麼是綫程間通信 215
7.2 對並發進行同步 223
7.2.1 同步的類型 224
7.2.2 同步對數據的訪問 224
7.2.3 同步機製 230
7.3 綫程策略方法 250
7.3.1 委托模型 251
7.3.2 對等模型 253
7.3.3 生産者-消費者模型 254
7.3.4 流水綫模型 255
7.3.5 用於綫程的SPMD和
MPMD 256
7.4 工作的分解和封裝 258
7.4.1 問題陳述 258
7.4.2 策略 258
7.4.3 觀察 259
7.4.4 問題和解決方案 259
7.4.5 流水綫的簡單agent
模型實例 260
7.5 小結 264
第8章 PADL和PBS:應用程序
設計方法 265
8.1 為大規模多核處理器設計
應用程序 265
8.2 什麼是PADL 268
8.2.1 第5層:應用程序
架構選擇 271
8.2.2 第4層:PADL中的
並發模型 281
8.2.3 第3層:PADL的
實現模型 284
8.3 謂詞分解結構 306
8.3.1 示例:Guess-My-Code
遊戲的PBS 307
8.3.2 將PBS、PADL和SDLC
聯係起來 307
8.3.3 對PBS進行編碼 308
8.4 小結 308
第9章 對要求並發的軟件係統
進行建模 311
9.1 統一建模語言 311
9.2 對係統的結構進行建模 313
9.2.1 類模型 313
9.2.2 類的可視化 315
9.2.3 對屬性和服務進行排序 320
9.2.4 類的實例的可視化 322
9.2.5 模闆類的可視化 324
9.2.6 顯示類與對象的關係 325
9.2.7 接口類的可視化 329
9.2.8 交互式對象的組織 331
9.3 UML與並發行為 332
9.3.1 協作對象 332
9.3.2 使用進程與綫程的多任務
與多綫程 334
9.3.3 對象間的消息序列 335
9.3.4 對象的活動 337
9.3.5 狀態機 339
9.4 整個係統的可視化 344
9.5 小結 345
第10章 並行程序的測試和
邏輯容錯 347
10.1 能否跳過測試 347
10.2 測試中必須檢查的5個
並發挑戰 348
10.3 失效:缺陷與故障導緻
的結果 350
10.3.1 基本的測試類型 350
10.3.2 缺陷排除與缺陷存活 351
10.4 如何對並行程序實現
缺陷排除 351
10.4.1 問題陳述 352
10.4.2 簡單策略和粗解決
方案模型 352
10.4.3 使用PADL第5層的
修正的解決方案模型 352
10.4.4 agent解決方案模型
的PBS 353
10.5 什麼是標準軟件工程測試 357
10.5.1 軟件驗證與確認 357
10.5.2 代碼不能正常工作
該怎麼辦 358
10.5.3 什麼是邏輯容錯 362
10.5.4 謂詞異常和可能世界 367
10.5.5 什麼是模型檢測 368
10.6 小結 368
附錄A 並發設計使用的UML 371
附錄B 並發模型 379
附錄C 綫程管理的POSIX標準 393
附錄D 進程管理的POSIX標準 535
評分
評分
評分
評分
C++多核高級編程 在線電子書 pdf 下載 txt下載 epub 下載 mobi 下載 2024