Unix編程藝術:多道程式設計

來源:互聯網
上載者:User
多道程式設計:分離進程為獨立的功能
Unix的最具特點的程式模組化技法就是將大型程式分解成多個協作進程。
Unix提倡把程式分解成更簡單的子進程,並考慮介面:
降低進程產生的開銷。提供方法簡化處理序間通訊。提倡使用能由管道和通訊端傳遞的簡單、透明的文本資料格式。

真正的挑戰不是協議文法而是協議邏輯:協議設計既要有充分的表達能力,又能防範死結。
從效能調整中分離複雜度控制
在開發出可以把全域複雜度降至最低程度的乾淨體系之前,關注效能問題便是過早最佳化。
線程提高了複雜度,應盡量少用線程。
將程式劃分為多個協作進程的另一重要原因是提高安全性:僅信任較少的代碼,而讓大部分操作都運行在使用者級。
Unix IPC方法
1 把任務轉給專門程式。
廉價的進程產生使得程式間協作變得可能,通過調用專門程式來完成專門任務;C庫popen可以用來向專門程式傳遞資料或讀取專門程式的返回結果;專門程式運行期間並不需要與父進程互動。
樣本:mutt:調用專門的編輯器。
2 管道、重新導向、過濾器
管道: |把一個程式的輸出串連到另外一個程式的輸入;單向性;管道中所有程式並發執行;匿名管道,具名管道(為命名通訊端取代)。重新導向:> <pic2graph:調用現有工具的管線。dc和bc:相互組合完成問題。fetchmail:不能使用,因為管道的單向性;不能發出反饋資訊。
3 封裝器指令碼中封裝命令的固定參數
4 安全性封裝器
安全性封裝器:調用專門程式檢查某類憑證,然後根據返回結果執行後一個程式;bernstein鏈與管道類似;只不過每個繼發階段的程式取代了前一階段的程式,而不是與之並行。
5 從進程
主從通訊很複雜,只有在協議無關輕重。
6 對等處理序間通訊
臨時檔案:簡單,靈活,但容易引起名字衝突,提前中斷會造成問題;檔案容易被修改,安全問題;訊號:非強制中斷,SIGHUP一般被用作重啟初始化,而用SIGTERM作為正常退出的訊號;pidfile:守護進程只允許一個執行個體運行,則可作為檔案鎖使用。fetchmail訊號:喚醒已經存在的進程或者建立進程來擷取郵件。
通訊端:雙向IPCPostgreSQL:用戶端和伺服器端分開。
共用記憶體:速度快,只用在同一機器上。mmap,將檔案對應到記憶體。自己處理競爭和死結;避免通過網路棧複製資料的開銷。
要避免的問題和方法
複雜的結構比文字資料流難以處理。RPC提供了豐富介面,但恰恰將問題複雜化了。文字資料流:效能損失是線程的,但可通過硬體升級來補償。XML-RPC和SOAP綜合了文字資料流和RPC方法的優點。
線程
局部變數共用全域記憶體使得需要加入競爭和臨界區的控制,同時bug也會增多。時序依賴問題儘管線程沒有進程環境切換的開銷,但鎖定共用資料結構的開銷同樣昂貴。用戶端/伺服器劃分:由伺服器集中管理所有資源爭用,降低了複雜性,也有利於適應分散式運算。把線程、遠端程序呼叫介面和重量級的物件導向設計結合使用特別危險。

真實世界裡的編程其實就是管理複雜度的問題。能夠管理複雜度的工具都是好東西。但當這些工具不是控制而是增加複雜度的時候,最好扔掉,從零開始。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.