這本經(jīng)過課堂檢驗的教材講述分布式實時系統(tǒng)軟件的設計和實現(xiàn),使用了自底向上的方法。本書討論了涉及實時系統(tǒng)的軟件項目中面臨的常見挑戰(zhàn),并提出了一種簡單而有效地執(zhí)行所有軟件工程步驟的新方法。每一章都以對核心概念的討論開始,并回顧了相關的方法和可用的軟件。接下來是對示例內(nèi)核中概念實現(xiàn)的描述,以及可執(zhí)行代碼。
從工廠、現(xiàn)代汽車到航空電子設備,分布式和嵌入式實時系統(tǒng)無處不在。分布式實時系統(tǒng)的特點是由許多通過實時網(wǎng)絡連接起來的計算節(jié)點協(xié)同完成實時任務。實時任務有一個截止期限,很多應用要求實時任務必須在其截止期限之前完成。近年來的技術進步使這種分布式實時系統(tǒng)的節(jié)點數(shù)量大幅增加,從而使相應的系統(tǒng)軟件設計面臨巨大的挑戰(zhàn)。分布式實時系統(tǒng)的節(jié)點具有一定的計算能力,它通常通過傳感器和作動器與外部世界連接。并非所有的嵌入式系統(tǒng)都是實時的,我們將使用分布式實時系統(tǒng)這個術語描述那些具有實時特性的分布式嵌入式系統(tǒng)。
本書討論設計和實現(xiàn)分布式實時系統(tǒng)軟件的自底向上方法。我教授了幾十年本科和研究生階段的相關課程,并且參與了與實時系統(tǒng)相關的一些大型軟件項目,因此了解人們在系統(tǒng)設計和實現(xiàn)過程中所遇到的主要瓶頸。首先,設計師或程序員經(jīng)常面臨將應用程序與一些商業(yè)化實時操作系統(tǒng)(或者中間件)進行結合的挑戰(zhàn),有時候甚至需要為這些系統(tǒng)編寫補丁。這就要求我們深入了解與實時處理相關的硬件和操作系統(tǒng)概念。本書部分(第1~3章)介紹了一些入門知識。第二部分(第4~6章)的內(nèi)容與系統(tǒng)軟件相關,其中第4章回顧了實時操作系統(tǒng)的基本概念,第5章詳細介紹了從頭開始構建實驗性的分布式實時操作系統(tǒng)內(nèi)核的過程,第6章回顧了分布式實時操作系統(tǒng)和中間件的概念,描述了如何設計網(wǎng)絡通信部分,以使實時內(nèi)核能夠相互協(xié)作,形成分布式實時系統(tǒng)的軟件框架。本書的后續(xù)部分展示了把實驗性內(nèi)核逐漸轉化為帶有相應中間件的分布式實時操作系統(tǒng)內(nèi)核的所有實現(xiàn)細節(jié)。
其次,設計師面臨的挑戰(zhàn)是任務調(diào)度,實時系統(tǒng)需要讓所有任務都能夠在截止期限前完成。實時系統(tǒng)中的任務可以大致分為硬實時任務、軟實時任務和嚴格實時任務。它們可以是周期性的,也可以是非周期性的,分別需要不同的調(diào)度策略。不同任務之間既可能相互獨立,也可能相互依賴,在相互依賴的情況下需要實現(xiàn)任務間同步。我們還需要提供端到端的任務調(diào)度,在滿足任務截止期限要求的同時,將負載均勻地分布到分布式實時系統(tǒng)的節(jié)點上。另一個相關的問題是網(wǎng)絡資源管理。所有這些都將在本書的第三部分(第7~9章)進行討論并加以實現(xiàn)。
后,設計師面臨的任務是完成從需求說明開始到高層設計、詳細設計和編碼的所有軟件工程步驟,在這個過程中會遇到很多困難。我們提供了一種執(zhí)行所有步驟的簡單而有效的方法。本書第四部分(第10~13章)對此進行了介紹。第10章介紹利用有限狀態(tài)機進行高層設計和詳細設計的方法,其中有限狀態(tài)機通過操作系統(tǒng)線程實現(xiàn)。第11章介紹一些實時編程語言,包括C/POSIX、Ada和Java。為了預防災難性事件,容錯能力在實時系統(tǒng)中必不可少,第12章專門討論了這個主題。第13章按照高層設計、詳細設計和編碼的順序,結合我們已經(jīng)開發(fā)的方法,實現(xiàn)了一個實時案例。
本書大致這樣安排每一章的內(nèi)容。首先,回顧相關概念,簡要介紹一些商業(yè)軟件,描述設計和實現(xiàn)我們需要的軟件的方法。其次,給出應用,其可執(zhí)行代碼展示了如何在實驗性示例內(nèi)核中實現(xiàn)相關概念,該部分叫作DRTK的實現(xiàn)。如果課程僅涉及有限的實時系統(tǒng)知識,可以跳過這一部分以及描述DRTK的第5章。后,會在章末提供一些復習題,總結本章重點,并給出近期參考文獻。此外,每一章的本章提要部分還指出了一些可能的開放研究領域。
關于DRTK
本書第5章詳細介紹的分布式實時內(nèi)核(Distributed Real-Time Kernel,DRTK)的主要模塊在與實時處理相關的各門課程的教學過程中進行了測試。但是,此章之后的各章中,與分布式處理部分相關的程序沒有經(jīng)過充分測試,這意味著它們可能(甚至很可能)有一些語法或者其他實現(xiàn)錯誤。本書的網(wǎng)站為http://akademik.ube.ege.edu.tr/~erciyes/DRTS,里面包含DRTK代碼、教學幻燈片和勘誤表。我希望DRTK成為一個實用的、實驗性的分布式實時內(nèi)核,能夠用于相關課程的教學,因此歡迎對DRTK代碼進行有益的修改。
本書的目標讀者是電子與計算機工程、計算機科學和一般工程專業(yè)的高年級本科生、研究生和研究人員,以及任何有計算機體系結構和操作系統(tǒng)基礎的人。書中包含了大量用于DRTK實現(xiàn)的樣例和各種示例的C代碼。感謝在各所大學選修我的實時系統(tǒng)、嵌入式系統(tǒng)、高級操作系統(tǒng)等課程的本科生和研究生,按照時間順序排列,這些學校包括愛琴海大學、俄勒岡州立大學、加州大學戴維斯分校、加州州立大學圣馬科斯分校、伊茲密爾理工學院、伊茲密爾大學和于斯屈達爾大學。針對我在課堂講述的本書各個部分的內(nèi)容以及在實驗室測試的內(nèi)核樣例,這些學生提供了寶貴的反饋意見。感謝Springer資深編輯Wayne Wheeler和助理編輯Simon Rees在本書的撰寫過程中提供的支持。
K. Erciyes
土耳其伊斯坦布爾
譯者序
前言
部分 入門知識
第1章 實時系統(tǒng)入門2
1.1 引言2
1.2 什么是實時系統(tǒng)2
1.3 基本體系結構3
1.4 實時系統(tǒng)的特點3
1.5 實時系統(tǒng)的分類4
1.6 示例系統(tǒng):牛奶灌裝廠5
1.7 本書大綱6
1.8 復習題6
1.9 本章提要6
參考文獻7
第2章 硬件8
2.1 引言8
2.2 處理器體系結構8
2.2.1 單周期數(shù)據(jù)通路9
2.2.2 多周期數(shù)據(jù)通路13
2.2.3 流水線13
2.2.4 微控制器18
2.3 存儲器19
2.3.1 與處理器的接口19
2.3.2 緩存19
2.4 輸入/輸出訪問21
2.4.1 輸入設備接口22
2.4.2 輸出設備接口22
2.4.3 內(nèi)存映射I/O和隔離I/O23
2.4.4 軟件與I/O的接口23
2.5 多核處理器26
2.6 多處理器27
2.7 復習題27
2.8 本章提要28
2.9 練習題28
參考文獻29
第3章 分布式實時系統(tǒng)30
3.1 引言30
3.2 模型30
3.2.1 時間觸發(fā)和事件觸發(fā)分布式系統(tǒng)30
3.2.2 有限狀態(tài)機31
3.3 分布式實時操作系統(tǒng)和中間件33
3.3.1 中間件33
3.3.2 分布式調(diào)度34
3.3.3 動態(tài)負載均衡35
3.4 實時通信35
3.4.1 實時流量35
3.4.2 開放系統(tǒng)互連模型36
3.4.3 拓撲結構37
3.4.4 實時數(shù)據(jù)鏈路層38
3.4.5 控制器局域網(wǎng)協(xié)議38
3.4.6 時間觸發(fā)協(xié)議39
3.4.7 實時以太網(wǎng)40
3.4.8 實時IEEE 802.1140
3.5 分布式實時嵌入式系統(tǒng)面臨的挑戰(zhàn)41
3.6 分布式實時系統(tǒng)示例41
3.6.1 現(xiàn)代化轎車41
3.6.2 移動無線傳感器網(wǎng)絡42
3.7 復習題43
3.8 本章提要43
3.9 練習題43
參考文獻44
第二部分 系統(tǒng)軟件
第4章 實時操作系統(tǒng)46
4.1 引言46
4.2 普通操作系統(tǒng)與實時操作系統(tǒng)46
4.3 任務管理47
4.3.1 UNIX中的任務管理48
4.3.2 任務間同步49
4.3.3 任務間通信51
4.3.4 UNIX進程間通信53
4.4 線程53
4.4.1 線程管理53
4.4.2 POSIX 線程54
4.5 內(nèi)存管理57
4.5.1 靜態(tài)內(nèi)存分配57
4.5.2 動態(tài)內(nèi)存分配57
4.5.3 虛擬內(nèi)存57
4.5.4 實時內(nèi)存管理58
4.6 輸入/輸出管理59
4.6.1 中斷驅(qū)動I/O59
4.6.2 設備驅(qū)動程序59
4.7 實時操作系統(tǒng)綜述60
4.7.1 FreeRTOS60
4.7.2 VxWorks60
4.7.3 實時Linux60
4.8 復習題61
4.9 本章提要61
4.10 編程練習題61
參考文獻62
第5章 實驗性的分布式實時系統(tǒng)內(nèi)核的設計63
5.1 引言63
5.2 設計策略63
5.3 低層內(nèi)核功能64
5.3.1 數(shù)據(jù)結構和隊列操作64
5.3.2 多隊列調(diào)度程序67
5.3.3 中斷處理和時間管理69
5.3.4 任務狀態(tài)管理70
5.3.5 輸入/輸出管理72
5.4 高層內(nèi)核功能74
5.4.1 任務同步74
5.4.2 任務通信76
5.4.3 使用緩沖池的高級內(nèi)存管理79
5.4.4 任務管理80
5.5 初始化81
5.6 測試DRTK83
5.7 復習題84
5.8 本章提要84
5.9 編程練習題85
參考文獻85
第6章 分布式實時操作系統(tǒng)和中間件86
6.1 引言86
6.2 分布式實時操作系統(tǒng)86
6.2.1 傳輸層接口87
6.2.2 數(shù)據(jù)鏈路層接口87
6.3 實時中間件88
6.3.1 實時任務組89
6.3.2 時鐘同步90
6.3.3 選舉算法94
6.4 DRTK的實現(xiàn)96
6.4.1 初始化網(wǎng)絡96
6.4.2 傳輸層接口97
6.4.3 數(shù)據(jù)鏈路層接口任務100
6.4.4 組管理102
6.4.5 時鐘同步算法103
6.4.6 環(huán)形結構的領導者選舉104
6.5 復習題105
6.6 本章提要105
6.7 編程練習題106
參考文獻106
第三部分 調(diào)度和資源共享
第7章 單處理器獨立任務調(diào)度108
7.1 引言108
7.2 背景知識108
7.2.1 可調(diào)度性測試109
7.2.2 利用率109
7.3 調(diào)度策略109
7.3.1 搶占式調(diào)度與非搶占式調(diào)度110
7.3.2 靜態(tài)調(diào)度與動態(tài)調(diào)度111
7.3.3 獨立任務與非獨立任務111
7.4 實時調(diào)度算法分類112
7.5 時鐘驅(qū)動調(diào)度113
7.5.1 表驅(qū)動調(diào)度113
7.5.2 循環(huán)執(zhí)行調(diào)度114
7.6 基于優(yōu)先級的調(diào)度116
7.6.1 單調(diào)速率調(diào)度116
7.6.2 早截止期限優(yōu)先調(diào)度118
7.6.3 松弛度優(yōu)先調(diào)度120
7.6.4 響應時間分析120
7.7 非周期性任務調(diào)度122
7.7.1 基本方法122
7.7.2 周期性服務器123
7.8 偶發(fā)任務調(diào)度125
7.9 DRTK的實現(xiàn)125
7.9.1 單調(diào)速率調(diào)度程序126
7.9.2 早截止期限優(yōu)先調(diào)度程序127
7.9.3 松弛度優(yōu)先調(diào)度程序128
7.9.4 輪詢服務器129
7.10 復習題129
7.11 本章提要130
7.12 練習題131
參考文獻131
第8章 單處理器非獨立任務調(diào)度132
8.1 引言132
8.2 非獨立任務調(diào)度132
8.2.1 遲截止期限優(yōu)先算法132
8.2.2 改進的早截止期限優(yōu)先算法134
8.3 共享資源任務的調(diào)度135
8.3.1 火星探路者案例136
8.3.2 基本優(yōu)先級繼承協(xié)議137
8.3.3 優(yōu)先級置頂協(xié)議140
8.4 DRTK的實現(xiàn)141
8.4.1 LDF非獨立任務調(diào)度141
8.4.2 優(yōu)先級繼承協(xié)議142
8.5 復習題144
8.6 本章提要144
8.7 練習題145
參考文獻146
第9章 多處理器與分布式實時調(diào)度147
9.1 引言147
9.2 多處理器調(diào)度147
9.2.1 分區(qū)調(diào)度148
9.2.2 全局調(diào)度152
9.3 分布式調(diào)度154
9.3.1 負載均衡154
9.3.2 聚焦尋址與投標方案156
9.3.3 伙伴算法157
9.3.4 消息調(diào)度157
9.4 DRTK的實現(xiàn)158
9.4.1 中心負載均衡任務158
9.4.2 分布式負載均衡任務160
9.5 復習題161
9.6 本章提要162
9.7 練習題162
參考文獻162
第四部分 應用程序設計
第10章 實時系統(tǒng)的軟件工程166
10.1 引言166
10.2 軟件開發(fā)生命周期166
10.2.1 增量瀑布模型167
10.2.2 V模型167
10.2.3 螺旋模型167
10.3 實時系統(tǒng)的軟件設計168
10.4 需求分析與規(guī)格說明168
10.5 時序分析169
10.6 帶數(shù)據(jù)流圖的結構化設計169
10.7 面向?qū)ο笤O計170
10.8 實時的實現(xiàn)方法171
10.8.1 再次討論有限狀態(tài)機171
10.8.2 時間自動機173
10.8.3 Petri網(wǎng)173
10.9 實時UML176
10.9.1 UML圖解176
10.9.2 實時特性177
10.10 實用的設計和實現(xiàn)方法178
10.11 復習題178
10.12 本章提要179
10.13 編程練習題179
參考文獻180
第11章 實時編程語言181
11.1 引言181
11.2 需求181
11.3 一個實時應用程序182
11.4 C/Real-time POSIX182
11.4.1 數(shù)據(jù)封裝和模塊管理182
11.4.2 POSIX線程管理184
11.4.3 異常處理和底層編程187
11.4.4 C/Real-time POSIX過程控制的實現(xiàn)187
11.5 Ada189
11.5.1 并發(fā)190
11.5.2 異常處理192
11.5.3 Ada過程控制的實現(xiàn)193
11.6 Java194
11.6.1 Java線程194
11.6.2 線程同步195
11.6.3 異常處理196
11.7 復習題196
11.8 本章提要197
11.9 編程練習題197
參考文獻197
第12章 容錯198
12.1 引言198
12.2 概念和術語198
12.3 故障分類199
12.4 冗余199
12.4.1 硬件冗余200
12.4.2 信息冗余200
12.4.3 時間冗余202
12.4.4 軟件冗余202
12.5 容錯實時系統(tǒng)204
12.5.1 靜態(tài)調(diào)度204
12.5.2 動態(tài)調(diào)度204
12.6 分布式實時系統(tǒng)中的容錯205
12.6.1 失效分類205
12.6.2 再次討論任務組206
12.7 DRTK的實現(xiàn)208
12.8 復習題210
12.9 本章提要211
12.10 練習題211
參考文獻212
第13章 案例研究:無線傳感器網(wǎng)絡實現(xiàn)的環(huán)境監(jiān)控213
13.1 引言213
13.2 基本思想213
13.3 需求規(guī)格說明213
13.4 時序分析和功能規(guī)格說明214
13.5 生成樹和簇214
13.6 設計思路217
13.7 葉子節(jié)點218
13.7.1 高層設計218
13.7.2 詳細設計和實現(xiàn)219
13.8 中間節(jié)點224
13.8.1 高層設計224
13.8.2 詳細設計和實現(xiàn)226
13.9 簇頭節(jié)點228
13.9.1 高層設計228
13.9.2 詳細設計和實現(xiàn)229
13.10 匯聚節(jié)點230
13.11 測試231
13.12 使用POSIX線程的替代實現(xiàn)233
13.13 本章提要233
13.14 編程練習題233
參考文獻233
附錄A 使用偽代碼的一些約定234
附錄B 低層內(nèi)核函數(shù)238