理解Erlang進程

對於一種編程語言,除去具體的語法部分(在寫程序是可以參考手冊),在頭腦中形成它運行時的數據對象描述方式和交互方式,是真正理解它的關鍵所在。Erlang Process正如在教程和文檔中描述的,是erlang語言非常重要的對象,本文將從各個方面描述一下對於erlang進程的理解。

主動對象

“主動對象”這種設計模式我最早是在ACE中接觸到的,在ACE中通過ACE_Task實現。ACE_Task本身運行於一個OS線程上,通過自己的消息隊列與外部對象進行交互。雖然C++在內存訪問上沒有限制,但是一般ACE_Task內部所管理的數據都不會允許外部直接訪問,所以也就成爲了本線程私有的數據。ACE_Task會阻塞到消息隊列的接受,等待外部的消息,對數據進行處理。

Erlang process基本上與ACE_Task一樣,只不過不是運行於線程,而是運行於由erlang VM在用戶態調度的虛擬進程。由於erlang process比線程輕量很多,所以可以同時創建出成千上萬的erlang process,每個都主動的進行運算,從而形成erlang並行計算的基礎。一般會把一個erlang process需要處理的數據當作這個process function的參數傳遞給這個process,當作個process私有數據處理。

容錯單位

實現可容錯系統也是使用erlang的一個重要目的。其實整體來看,實現容錯處理的基礎也是erlang process。拿C++舉例,由於一個OS進程中數據訪問時沒有限制的,各個模塊的依賴性很強,所以如果程序運行時出現了致命錯誤(比如非法指針訪問)一般來說很難進行恢復,會導致整個進程掛掉。而erlang process是erlang運行的基本單位,所有的運行錯誤都會發生在一個具體的erlang process中。由於Erlang process相互之間沒有數據共享或直接的數據引用,所以一個erlang process掛掉,不會影響到其他的erlang process。Mnesia可以被實現爲一個高效的本地數據庫的原因也在於此:Mnesia雖然與其他的erlang process在一個OS進程中,但是不用擔心其他erlang process的掛掉會影響到Mnesia。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章