歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下分布式編譯工具distcc源碼研究

Linux下分布式編譯工具distcc源碼研究

日期:2017/2/28 15:59:37   编辑:Linux教程

distcc是Linux環境下的著名的開源分布式編譯工具,最近決心研究一下其實現。

首先用svn下載其源碼,命令為:

# Non-members may check out a read-onlyworking copy anonymously over HTTP.

svn checkout http://distcc.googlecode.com/svn/trunk/distcc-read-only

首先找到其main函數。找了一會,找到了,在distcc.c。大致看了下main函數的作用是:檢查輸入參數,然後調用dcc_build_somewhere()函數。build_somewhere這個函數名有意思——在你不知道的某處進行編譯。

為了便於研究distcc,需要學習一些分布式編譯原理以及distcc的簡單用法。

分布式編譯的原理很簡單, 就是將編譯的整個工作量通過分布計算的方法分配到多個計算機上執行, 這樣可以獲得極大的效率提升. 由於分布式計算的技術相對成熟, 現在可以見到的分布式編譯軟件也較多. 一般來說, 一個分布式編譯軟件不是一個編譯器, 而是附著在某個編譯器上的分布計算管理軟件, 使得對於特定的編譯器可以實現分布式編譯。

IncrediBuild想必大家都經常使用吧?IncrediBuild需要一個特定的計算機做仲裁者, 其他的所有計算機作為客戶, 有了仲裁者的好處是, 可以有它來統一安排所有客戶端所發起的編譯請求, 一旦某個客戶發起編譯請求, 則仲裁者會根據其他客戶的CPU空閒情況而安排分布式編譯, 當多個客戶同時發起編譯請求時, 仲裁者會自動平衡分布計算負擔,使得編譯參與者不會占用過多的CPU。distcc和IncrediBuild的差別在與distcc不使用仲裁者, 直接由客戶端對其他客戶端發起編譯請求. 所以每個客戶端都需要知道其他客戶端的位置, 並且當多個客戶發起編譯請求時不易做平衡處理。

下面是關於distcc快速安裝和配置的說明:

下載 distcc(請參閱 參考資料 部分)。

通過執行 ./configure; make &&make install 在所有機器上編譯distcc 源。

編譯過程先在某台機器上開始,然後分布所有其他機器(服務器)。在所有服務器中,啟動 distccd 守護程序(您必須具有執行操作的根特權)。distccd 位於 /etc/init.d 文件夾。在根模式下啟動 distccd 的語法是

tcsh-arpan# /etc/init.d/distccd start

在用戶模式下啟動它的語法是

tcsh-arpan$ sudo /etc/init.d/distccd

還可以通過運行 distccd –daemon –j N 在用戶模式下運行distcc 守護進程,其中 N 是您要在給定機器上運行的作業數。

本地機器需要知道應該將編譯過程分布到哪些服務器。根據您的 shell,發出與下面命令相似的命令:

export DISTCC_HOSTS='localhost tintin asterix pogo'

tintin、asterix 和 pogo 是網絡中可以駐留編譯過程的其他主機;localhost 是本地計算機。

也可以不使用導出指令。您可以創建一個名為 hosts 的文件,將服務器的名稱放在該文件中,各個名稱使用空格分隔。將該文件復制到$HOME/.distcc 文件夾。

distcc 的工作原理

distcc 將預處理代碼發送給網絡中的其他指定機器。distccd 守護進程確保編譯在遠程機器上發生。distcc 的設計目的是與 GNU make 的並行編譯(-j)選項一起使用。distcc本身不是一個編譯器;它只是用作 g++ 的一個前端。幾乎 g++ 的所有選項都可以按原樣傳遞給 distcc。

安裝 distcc 之後,惟一需要做的就是觸發編譯。下面是調用方法:

make –j4 CC=distcc –f makefile.x86_linux

以上的信息來自我的搜索。這裡稍微解釋下,linux的守護進程大致相當於windows下的服務進程。看到這裡我產生一個疑問是:看樣子distccd 守護程序大致相當於分布式編譯工具中的服務器端,那麼它起的作用是什麼?我猜測它應該起一個捕捉消息、傳遞消息和遠程調用的作用,具體是:

這個猜測還有待驗證。開始還不知道服務器端程序的入口函數在哪裡,找了一下,服務器端(即distccd 守護進程)的main函數在daemon.c。

Copyright © Linux教程網 All Rights Reserved