這本經(jīng)過課堂檢驗的教材講述分布式實時系統(tǒng)軟件的設(shè)計和實現(xiàn),使用了自底向上的方法。本書討論了涉及實時系統(tǒng)的軟件項目中面臨的常見挑戰(zhàn),并提出了一種簡單而有效地執(zhí)行所有軟件工程步驟的新方法。每一章都以對核心概念的討論開始,并回顧了相關(guān)的方法和可用的軟件。接下來是對示例內(nèi)核中概念實現(xiàn)的描述,以及可執(zhí)行代碼。
從工廠、現(xiàn)代汽車到航空電子設(shè)備,分布式和嵌入式實時系統(tǒng)無處不在。分布式實時系統(tǒng)的特點是由許多通過實時網(wǎng)絡(luò)連接起來的計算節(jié)點協(xié)同完成實時任務(wù)。實時任務(wù)有一個截止期限,很多應(yīng)用要求實時任務(wù)必須在其截止期限之前完成。近年來的技術(shù)進步使這種分布式實時系統(tǒng)的節(jié)點數(shù)量大幅增加,從而使相應(yīng)的系統(tǒng)軟件設(shè)計面臨巨大的挑戰(zhàn)。分布式實時系統(tǒng)的節(jié)點具有一定的計算能力,它通常通過傳感器和作動器與外部世界連接。并非所有的嵌入式系統(tǒng)都是實時的,我們將使用分布式實時系統(tǒng)這個術(shù)語描述那些具有實時特性的分布式嵌入式系統(tǒng)。
本書討論設(shè)計和實現(xiàn)分布式實時系統(tǒng)軟件的自底向上方法。我教授了幾十年本科和研究生階段的相關(guān)課程,并且參與了與實時系統(tǒng)相關(guān)的一些大型軟件項目,因此了解人們在系統(tǒng)設(shè)計和實現(xiàn)過程中所遇到的主要瓶頸。首先,設(shè)計師或程序員經(jīng)常面臨將應(yīng)用程序與一些商業(yè)化實時操作系統(tǒng)(或者中間件)進行結(jié)合的挑戰(zhàn),有時候甚至需要為這些系統(tǒng)編寫補丁。這就要求我們深入了解與實時處理相關(guān)的硬件和操作系統(tǒng)概念。本書部分(第1~3章)介紹了一些入門知識。第二部分(第4~6章)的內(nèi)容與系統(tǒng)軟件相關(guān),其中第4章回顧了實時操作系統(tǒng)的基本概念,第5章詳細介紹了從頭開始構(gòu)建實驗性的分布式實時操作系統(tǒng)內(nèi)核的過程,第6章回顧了分布式實時操作系統(tǒng)和中間件的概念,描述了如何設(shè)計網(wǎng)絡(luò)通信部分,以使實時內(nèi)核能夠相互協(xié)作,形成分布式實時系統(tǒng)的軟件框架。本書的后續(xù)部分展示了把實驗性內(nèi)核逐漸轉(zhuǎn)化為帶有相應(yīng)中間件的分布式實時操作系統(tǒng)內(nèi)核的所有實現(xiàn)細節(jié)。
其次,設(shè)計師面臨的挑戰(zhàn)是任務(wù)調(diào)度,實時系統(tǒng)需要讓所有任務(wù)都能夠在截止期限前完成。實時系統(tǒng)中的任務(wù)可以大致分為硬實時任務(wù)、軟實時任務(wù)和嚴格實時任務(wù)。它們可以是周期性的,也可以是非周期性的,分別需要不同的調(diào)度策略。不同任務(wù)之間既可能相互獨立,也可能相互依賴,在相互依賴的情況下需要實現(xiàn)任務(wù)間同步。我們還需要提供端到端的任務(wù)調(diào)度,在滿足任務(wù)截止期限要求的同時,將負載均勻地分布到分布式實時系統(tǒng)的節(jié)點上。另一個相關(guān)的問題是網(wǎng)絡(luò)資源管理。所有這些都將在本書的第三部分(第7~9章)進行討論并加以實現(xiàn)。
后,設(shè)計師面臨的任務(wù)是完成從需求說明開始到高層設(shè)計、詳細設(shè)計和編碼的所有軟件工程步驟,在這個過程中會遇到很多困難。我們提供了一種執(zhí)行所有步驟的簡單而有效的方法。本書第四部分(第10~13章)對此進行了介紹。第10章介紹利用有限狀態(tài)機進行高層設(shè)計和詳細設(shè)計的方法,其中有限狀態(tài)機通過操作系統(tǒng)線程實現(xiàn)。第11章介紹一些實時編程語言,包括C/POSIX、Ada和Java。為了預(yù)防災(zāi)難性事件,容錯能力在實時系統(tǒng)中必不可少,第12章專門討論了這個主題。第13章按照高層設(shè)計、詳細設(shè)計和編碼的順序,結(jié)合我們已經(jīng)開發(fā)的方法,實現(xiàn)了一個實時案例。
本書大致這樣安排每一章的內(nèi)容。首先,回顧相關(guān)概念,簡要介紹一些商業(yè)軟件,描述設(shè)計和實現(xiàn)我們需要的軟件的方法。其次,給出應(yīng)用,其可執(zhí)行代碼展示了如何在實驗性示例內(nèi)核中實現(xiàn)相關(guān)概念,該部分叫作DRTK的實現(xiàn)。如果課程僅涉及有限的實時系統(tǒng)知識,可以跳過這一部分以及描述DRTK的第5章。后,會在章末提供一些復(fù)習(xí)題,總結(jié)本章重點,并給出近期參考文獻。此外,每一章的本章提要部分還指出了一些可能的開放研究領(lǐng)域。
關(guān)于DRTK
本書第5章詳細介紹的分布式實時內(nèi)核(Distributed Real-Time Kernel,DRTK)的主要模塊在與實時處理相關(guān)的各門課程的教學(xué)過程中進行了測試。但是,此章之后的各章中,與分布式處理部分相關(guān)的程序沒有經(jīng)過充分測試,這意味著它們可能(甚至很可能)有一些語法或者其他實現(xiàn)錯誤。本書的網(wǎng)站為http://akademik.ube.ege.edu.tr/~erciyes/DRTS,里面包含DRTK代碼、教學(xué)幻燈片和勘誤表。我希望DRTK成為一個實用的、實驗性的分布式實時內(nèi)核,能夠用于相關(guān)課程的教學(xué),因此歡迎對DRTK代碼進行有益的修改。
本書的目標讀者是電子與計算機工程、計算機科學(xué)和一般工程專業(yè)的高年級本科生、研究生和研究人員,以及任何有計算機體系結(jié)構(gòu)和操作系統(tǒng)基礎(chǔ)的人。書中包含了大量用于DRTK實現(xiàn)的樣例和各種示例的C代碼。感謝在各所大學(xué)選修我的實時系統(tǒng)、嵌入式系統(tǒng)、高級操作系統(tǒng)等課程的本科生和研究生,按照時間順序排列,這些學(xué)校包括愛琴海大學(xué)、俄勒岡州立大學(xué)、加州大學(xué)戴維斯分校、加州州立大學(xué)圣馬科斯分校、伊茲密爾理工學(xué)院、伊茲密爾大學(xué)和于斯屈達爾大學(xué)。針對我在課堂講述的本書各個部分的內(nèi)容以及在實驗室測試的內(nèi)核樣例,這些學(xué)生提供了寶貴的反饋意見。感謝Springer資深編輯Wayne Wheeler和助理編輯Simon Rees在本書的撰寫過程中提供的支持。
K. Erciyes
土耳其伊斯坦布爾
譯者序
前言
部分 入門知識
第1章 實時系統(tǒng)入門2
1.1 引言2
1.2 什么是實時系統(tǒng)2
1.3 基本體系結(jié)構(gòu)3
1.4 實時系統(tǒng)的特點3
1.5 實時系統(tǒng)的分類4
1.6 示例系統(tǒng):牛奶灌裝廠5
1.7 本書大綱6
1.8 復(fù)習(xí)題6
1.9 本章提要6
參考文獻7
第2章 硬件8
2.1 引言8
2.2 處理器體系結(jié)構(gòu)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 輸入設(shè)備接口22
2.4.2 輸出設(shè)備接口22
2.4.3 內(nèi)存映射I/O和隔離I/O23
2.4.4 軟件與I/O的接口23
2.5 多核處理器26
2.6 多處理器27
2.7 復(fù)習(xí)題27
2.8 本章提要28
2.9 練習(xí)題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 拓撲結(jié)構(gòu)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)絡(luò)42
3.7 復(fù)習(xí)題43
3.8 本章提要43
3.9 練習(xí)題43
參考文獻44
第二部分 系統(tǒng)軟件
第4章 實時操作系統(tǒng)46
4.1 引言46
4.2 普通操作系統(tǒng)與實時操作系統(tǒng)46
4.3 任務(wù)管理47
4.3.1 UNIX中的任務(wù)管理48
4.3.2 任務(wù)間同步49
4.3.3 任務(wù)間通信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 設(shè)備驅(qū)動程序59
4.7 實時操作系統(tǒng)綜述60
4.7.1 FreeRTOS60
4.7.2 VxWorks60
4.7.3 實時Linux60
4.8 復(fù)習(xí)題61
4.9 本章提要61
4.10 編程練習(xí)題61
參考文獻62
第5章 實驗性的分布式實時系統(tǒng)內(nèi)核的設(shè)計63
5.1 引言63
5.2 設(shè)計策略63
5.3 低層內(nèi)核功能64
5.3.1 數(shù)據(jù)結(jié)構(gòu)和隊列操作64
5.3.2 多隊列調(diào)度程序67
5.3.3 中斷處理和時間管理69
5.3.4 任務(wù)狀態(tài)管理70
5.3.5 輸入/輸出管理72
5.4 高層內(nèi)核功能74
5.4.1 任務(wù)同步74
5.4.2 任務(wù)通信76
5.4.3 使用緩沖池的高級內(nèi)存管理79
5.4.4 任務(wù)管理80
5.5 初始化81
5.6 測試DRTK83
5.7 復(fù)習(xí)題84
5.8 本章提要84
5.9 編程練習(xí)題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 實時任務(wù)組89
6.3.2 時鐘同步90
6.3.3 選舉算法94
6.4 DRTK的實現(xiàn)96
6.4.1 初始化網(wǎng)絡(luò)96
6.4.2 傳輸層接口97
6.4.3 數(shù)據(jù)鏈路層接口任務(wù)100
6.4.4 組管理102
6.4.5 時鐘同步算法103
6.4.6 環(huán)形結(jié)構(gòu)的領(lǐng)導(dǎo)者選舉104
6.5 復(fù)習(xí)題105
6.6 本章提要105
6.7 編程練習(xí)題106
參考文獻106
第三部分 調(diào)度和資源共享
第7章 單處理器獨立任務(wù)調(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 獨立任務(wù)與非獨立任務(wù)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 響應(yīng)時間分析120
7.7 非周期性任務(wù)調(diào)度122
7.7.1 基本方法122
7.7.2 周期性服務(wù)器123
7.8 偶發(fā)任務(wù)調(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 輪詢服務(wù)器129
7.10 復(fù)習(xí)題129
7.11 本章提要130
7.12 練習(xí)題131
參考文獻131
第8章 單處理器非獨立任務(wù)調(diào)度132
8.1 引言132
8.2 非獨立任務(wù)調(diào)度132
8.2.1 遲截止期限優(yōu)先算法132
8.2.2 改進的早截止期限優(yōu)先算法134
8.3 共享資源任務(wù)的調(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非獨立任務(wù)調(diào)度141
8.4.2 優(yōu)先級繼承協(xié)議142
8.5 復(fù)習(xí)題144
8.6 本章提要144
8.7 練習(xí)題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 中心負載均衡任務(wù)158
9.4.2 分布式負載均衡任務(wù)160
9.5 復(fù)習(xí)題161
9.6 本章提要162
9.7 練習(xí)題162
參考文獻162
第四部分 應(yīng)用程序設(shè)計
第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)的軟件設(shè)計168
10.4 需求分析與規(guī)格說明168
10.5 時序分析169
10.6 帶數(shù)據(jù)流圖的結(jié)構(gòu)化設(shè)計169
10.7 面向?qū)ο笤O(shè)計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 實用的設(shè)計和實現(xiàn)方法178
10.11 復(fù)習(xí)題178
10.12 本章提要179
10.13 編程練習(xí)題179
參考文獻180
第11章 實時編程語言181
11.1 引言181
11.2 需求181
11.3 一個實時應(yīng)用程序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 復(fù)習(xí)題196
11.8 本章提要197
11.9 編程練習(xí)題197
參考文獻197
第12章 容錯198
12.1 引言198
12.2 概念和術(shù)語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 再次討論任務(wù)組206
12.7 DRTK的實現(xiàn)208
12.8 復(fù)習(xí)題210
12.9 本章提要211
12.10 練習(xí)題211
參考文獻212
第13章 案例研究:無線傳感器網(wǎng)絡(luò)實現(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 設(shè)計思路217
13.7 葉子節(jié)點218
13.7.1 高層設(shè)計218
13.7.2 詳細設(shè)計和實現(xiàn)219
13.8 中間節(jié)點224
13.8.1 高層設(shè)計224
13.8.2 詳細設(shè)計和實現(xiàn)226
13.9 簇頭節(jié)點228
13.9.1 高層設(shè)計228
13.9.2 詳細設(shè)計和實現(xiàn)229
13.10 匯聚節(jié)點230
13.11 測試231
13.12 使用POSIX線程的替代實現(xiàn)233
13.13 本章提要233
13.14 編程練習(xí)題233
參考文獻233
附錄A 使用偽代碼的一些約定234
附錄B 低層內(nèi)核函數(shù)238