自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

推測(cè)“好奇號(hào)”火星車和它搭載的軟件

開(kāi)發(fā)
我十分好奇,忍不住想推測(cè)一下“好奇號(hào)”火星車上的軟件究竟是個(gè)什么樣的構(gòu)造。我們已經(jīng)知道,好奇號(hào)上的軟件大部分都是用C語(yǔ)言寫(xiě)成的,這些代碼加起來(lái)大概有250萬(wàn)行。有人可能會(huì)感到詫異,這樣復(fù)雜的系統(tǒng)怎么能寫(xiě)出來(lái)而且能讓它好用?下面是來(lái)自Erlang程序員的觀點(diǎn)。

 首先來(lái)些基礎(chǔ)的。“好奇號(hào)”火星車使用的是核動(dòng)力,它能持續(xù)的受控的方式提供給火星車能量。這個(gè)能量源同時(shí)還要負(fù)責(zé)平時(shí)對(duì)火星車進(jìn)行加熱——這是在火星表面極端天氣環(huán)境下對(duì)火星車的必要保障。

“好 奇號(hào)”基本上是自主控制的。它發(fā)送一條信息可能要用幾分鐘到幾小時(shí)的時(shí)間,你只能在火星上一天里的有限時(shí)間段內(nèi)給它發(fā)送信息。“好奇號(hào)”自己可 以和地球通話,但這條線路速度很慢。它也可以通過(guò)圍繞火星飛行的人造衛(wèi)星進(jìn)行通信,把衛(wèi)星作為上行線路中繼,這樣更快。這種情況表明:火星車必須要能自主 行動(dòng)。我們不能讓一個(gè)人坐在地球上的某個(gè)椅子里拿著操縱桿來(lái)指導(dǎo)它。

“好奇號(hào)”火星車上安裝有兩個(gè)完全一樣的計(jì)算機(jī)。我們注意到美國(guó)宇航 局正是按照J(rèn)oe Armstrong(Erlang編程語(yǔ)言的創(chuàng)造人)的話做的:“要想獲得一個(gè)可信賴的系統(tǒng),你需要兩臺(tái)計(jì)算機(jī)”。一個(gè)一直處于休眠狀態(tài),一旦另一個(gè)由于 異常情況死機(jī),它可以隨時(shí)受命接管系統(tǒng)。這樣的做法在Erlang語(yǔ)言系統(tǒng)里、在OpenBSD PF防火墻等其它軟件里都是很典型的接管方案。“好奇號(hào)”上使用的計(jì)算機(jī)是BAE systems RAD750。處理器是PowerPC ISA,速度非常的快。200百萬(wàn)赫茲, 150或250納米 的制造工藝,它工作時(shí)對(duì)能允許的溫度范圍的表現(xiàn)非常優(yōu)秀。它是經(jīng)過(guò)抗輻射加固的,能經(jīng)受相當(dāng)強(qiáng)的輻射侵襲。內(nèi)存也是抗輻射的。“好奇號(hào)”上的計(jì)算機(jī)里的每 個(gè)硬件都不是隨隨便便一個(gè)東西能勝任的。

“好奇號(hào)”的操作系統(tǒng)使用的是VxWorks。它屬于標(biāo)準(zhǔn)的的微內(nèi)核系統(tǒng)。保守的估計(jì),它的內(nèi)核代碼應(yīng)該少于1萬(wàn)行,而且經(jīng)過(guò)了嚴(yán)格的測(cè)試。也就是說(shuō),這個(gè)內(nèi)核接近零bug。它的一個(gè)主要特征就是隔離?;鹦擒嚿系母鱾€(gè)模塊都是相互隔離的。有些子系統(tǒng)對(duì)火星車的生命起著至關(guān)重要的作用,而另外一些只是用于科學(xué)觀察的設(shè)備。所以,我們可以肯定這樣一個(gè)事實(shí),“好奇號(hào)”上的250萬(wàn)行代碼中,只有一部分代碼是深度測(cè)試杜絕了bug的。車上的有些程序并不是生命必須的。

美國(guó)宇航局使用了各種辦法來(lái)確保代碼質(zhì)量。例如,遞歸調(diào)用是要求避免的,這是這因?yàn)镃語(yǔ)言編譯器不能保證遞歸堆棧不被撐破。循環(huán)要確保有終止點(diǎn),這 通過(guò)一個(gè)靜態(tài)分析器來(lái)發(fā)現(xiàn)這些問(wèn)題。所有的內(nèi)存使用都幾乎是靜態(tài)分配的,這樣避免了突然的內(nèi)存收集產(chǎn)生的混亂和不可預(yù)知的性能問(wèn)題。我們還可以發(fā)現(xiàn)訊息傳遞(Message Passing)作為子系統(tǒng)間的消息傳遞方式在火星車是被當(dāng)作了***。不存在互斥,不存在軟件事務(wù)性內(nèi)存。同樣,隔離概念也是編碼指導(dǎo)原則上的一部分。通過(guò)對(duì)內(nèi)存進(jìn)行保護(hù)和數(shù)據(jù)的單一歸屬關(guān)系,子系統(tǒng)之間就很難影響對(duì)方。Erlang程序員都很習(xí)慣這樣的做法。

“探路者”號(hào)火星車 
“探路者”號(hào)火星車

當(dāng)年的“探路者”號(hào)火星車的架構(gòu)設(shè)計(jì)事實(shí)上也跟Erlang語(yǔ)言系統(tǒng)的理念相似。它有用于傳遞消息的“組件”。組件只在接收消息時(shí)才等待,發(fā)送消息的都是無(wú)返回值的函數(shù)。它們接受消息采用的是單事件循環(huán),這跟Erlang語(yǔ)言中的 gen_server 工作方式很相似。不同的模塊間通過(guò)某種協(xié)議傳遞消息進(jìn)行通信,你可以訪問(wèn)其它模塊使用的內(nèi)存,但按照J(rèn)PL編碼指導(dǎo)原則,這種做法是要避免的。這跟 Erlang語(yǔ)言有所不同,Erlang語(yǔ)言完全禁止這樣操作?;鹦翘綔y(cè)漫游者(勇氣號(hào)和機(jī)遇號(hào))擁有更多的組件,但軟件基礎(chǔ)上相同的。“好奇號(hào)”也不例 外。它本質(zhì)上是在老的軟件上改造出來(lái)的。系統(tǒng)中的線程數(shù)有大幾百個(gè),這***的和一個(gè)類似的如此規(guī)模的Erlang語(yǔ)言系統(tǒng)中的線程數(shù)相匹配。

機(jī)遇號(hào)火星車 
機(jī)遇號(hào)火星車

在 “好奇號(hào)”上,他們?cè)黾恿?ldquo;組件”的概念,組件由一組組的模塊構(gòu)成,以此用來(lái)控制復(fù)雜度。因?yàn)橛袃膳_(tái)計(jì)算機(jī)做冗余,很多子系統(tǒng)為了系統(tǒng)的穩(wěn)固也是 冗余的,組件的概念也是處理這些情況需要的。有趣的是,Erlang語(yǔ)言的設(shè)計(jì)者也看到了這一點(diǎn),只是在Erlang里被叫做Applictions。

對(duì) 函數(shù)恒量的校驗(yàn)。輸入?yún)?shù)必須要滿足前置條件。后置條件約束返回值。各種恒量必須滿足這些條件。Erlang程序員熟悉這種做法。有趣的是,“好 奇號(hào)”上的每個(gè)函數(shù)的長(zhǎng)度限制在60行以內(nèi),這樣它們可以被打印到單張紙上。Erlang程序員也喜歡簡(jiǎn)短的函數(shù)體,但沒(méi)有這種限制。但都是為了讓代碼簡(jiǎn) 單。讓代碼易于理解。

勇氣號(hào)火星車 
勇氣號(hào)火星車

還有另外一個(gè)有趣的事情,在過(guò)去,有個(gè)火星車發(fā)生過(guò)優(yōu)先級(jí)顛倒的問(wèn)題。他們?cè)谡{(diào)試控制臺(tái)里向火星車注入了一段糾正信息挽救了火星車。這也跟 Erlang語(yǔ)言系統(tǒng)里經(jīng)常使用的方法相似。我們可以對(duì)運(yùn)行中的系統(tǒng)進(jìn)行修改,隨時(shí)對(duì)系統(tǒng)進(jìn)行升級(jí)和改造。我們對(duì)運(yùn)行中的系統(tǒng)進(jìn)行監(jiān)控,確保它的運(yùn)行狀態(tài) 跟我們期望的一樣。這種對(duì)系統(tǒng)進(jìn)行熱修復(fù)的能力非常的有用。當(dāng)然,這種開(kāi)發(fā)是配合了大量的跟蹤和分析——例如使用Erlang QuickCheck/PropEr,錯(cuò)誤記錄以及跟蹤工具。

很明顯,Erlang語(yǔ)言系統(tǒng)的很多特征都跟火星車上的系統(tǒng)吻合。但我并不認(rèn) 為這是巧合。各種軟件有自己不同的屬性特征——火星車屬于硬實(shí)時(shí) (hard realtime)環(huán)境,Erlang語(yǔ)言系統(tǒng)是軟實(shí)時(shí)環(huán)境。但大體上,寫(xiě)出健壯系統(tǒng)的條件是你需要隔離系統(tǒng)中的各個(gè)部分。這值得思考,看起來(lái)這種方式好用。這些對(duì)于高可靠性系統(tǒng)來(lái)說(shuō)都是的重要的特征。也許比靜態(tài)類型校驗(yàn)還要重要。

總 結(jié)來(lái)看,對(duì)于火星車上的所有代碼,我們也許并不必保障所有代碼都達(dá)到***級(jí)別的安全。我們可以把不同的模塊進(jìn)行隔離測(cè)試,對(duì)它們實(shí)施不同等級(jí)的正 確性檢查。換句話說(shuō),我可以通過(guò)精心的設(shè)計(jì)來(lái)控制錯(cuò)誤和管理風(fēng)險(xiǎn)。因此,對(duì)于某些模塊,我們可以承認(rèn)它們可能存在某些錯(cuò)誤。如果上行通信中繼壞了,我們可 以重啟機(jī)器,這樣來(lái)恢復(fù)它。如果這樣不行,我們還有一個(gè)冗余的上行通信通道直接和地球通信,只是速度慢些——但可以替代另外一個(gè)通道。這種架構(gòu)意味著只有 多個(gè)組件同時(shí)失敗時(shí)才能導(dǎo)致任務(wù)無(wú)法完成。模塊出錯(cuò),重啟,恢復(fù),然后就可繼續(xù)拍攝圖片。這種設(shè)計(jì)的基本原理是非常可靠的,也許需要根據(jù)情況做一些小的調(diào) 整。畢竟它是經(jīng)過(guò)了另外3個(gè)火星車的嚴(yán)格考驗(yàn)上發(fā)展出來(lái)的。

跟Erlang語(yǔ)言理念不相同的部分跟所對(duì)應(yīng)的硬實(shí)時(shí)和軟實(shí)時(shí)環(huán)境有關(guān)。在 Erlang語(yǔ)言系統(tǒng)中我們可以暫緩服務(wù)。雖然不好,但可以這么干。在火 星車上,這會(huì)成為災(zāi)難。在飛行控制系統(tǒng)中尤其是這樣。如果火箭啟動(dòng)晚了,你的麻煩就大了。這就是為什么“好奇號(hào)”上要使用靜態(tài)分配內(nèi)存和固定堆棧大小,而 不是使用動(dòng)態(tài)分配的原因。這同樣也是他們不喜歡遞歸的原因。而在Erlang語(yǔ)言系統(tǒng)里,我們不鼓勵(lì)通過(guò)手動(dòng)管理內(nèi)存。我們對(duì)tail調(diào)用做了革命性的優(yōu) 化,所以我們可以放心的使用它。

長(zhǎng)話短說(shuō)——“好奇號(hào)”火星車的軟件在某些特征上跟Erlang語(yǔ)言系統(tǒng)在架構(gòu)上非常是相似。這些特征是一個(gè)健壯的軟件系統(tǒng)的基本特征嗎?

【編輯推薦】

  1. Erlang之父Joe Armstrong訪談:程序調(diào)試與啤酒
  2. Scala和Erlang,以及多核主導(dǎo)的未來(lái)
  3. Erlang面向分布與并發(fā)的編程語(yǔ)言
  4. 看Erlang中Actor模型的執(zhí)行方式和優(yōu)劣
  5. Erlang視點(diǎn):并行計(jì)算和云計(jì)算

責(zé)任編輯:彭凡 來(lái)源: cnbeta
相關(guān)推薦

2012-08-15 10:23:32

2012-08-16 10:16:45

2021-02-22 17:06:17

無(wú)人機(jī)NASA機(jī)智號(hào)

2021-04-25 11:06:17

數(shù)字化

2012-08-09 15:06:33

好奇號(hào)美國(guó)宇航局PowerPC 750

2012-09-03 10:05:32

好奇號(hào)美國(guó)宇航局

2016-09-27 09:59:21

2021-03-04 10:35:55

二進(jìn)制計(jì)算機(jī)NASA

2021-02-20 11:38:48

Linux 系統(tǒng) 數(shù)據(jù)

2020-08-07 16:15:41

開(kāi)源技術(shù) 趨勢(shì)

2020-07-21 10:40:05

GitHub代碼開(kāi)發(fā)者

2012-08-02 10:43:14

投影

2020-07-24 18:34:01

火星車

2013-07-11 15:57:35

探路者太空船軟件軟件開(kāi)發(fā)

2016-05-12 16:23:39

IBM

2022-03-30 14:34:28

火星探測(cè)器航天局

2021-02-25 10:23:11

人工智能毅力號(hào)深度學(xué)習(xí)

2021-05-31 10:23:10

惡意軟件攻擊網(wǎng)絡(luò)安全

2012-08-17 14:07:21

2018-03-29 15:56:58

華為
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)