2012-09-27 34 views
2

有誰知道一種機制可以捕獲正在運行的線程的狀態並序列化以進一步恢復?
JVM有沒有可用的東西?
pthreads怎麼樣?
我的主要目標是能夠將正在運行的線程遷移到遠程機器。暫停和序列化正在運行的線程

+0

這個問題沒有任何意義,而是要求「捕獲正在運行的程序的狀態」。你不能。 –

+0

序列化執行單元?什麼?遷移..什麼?沒有。您可以將工作項目遷移到遠程機器。任何這樣的系統都必須是線程無關的。請不要嘗試你所提議的任何事情。 –

+0

@KerrekSB,每當一個進程被分頁時,一個正在運行的程序的狀態被捕獲並保存,這樣當它被重新分頁時,它就會從中斷的地方繼續。 –

回答

8

在該線程的配合下,您可以通過任何線程支持的機制來完成。沒有該線程的合作,這是不可能的。如果該線程持有您的序列化代碼需要的鎖,會發生什麼情況?

如果您遷移正在使用某些內核資源(如管道)的正在運行的線程,會發生什麼情況。你會遷移該資源嗎?

問題的正確解決方案可能是讓線程支持遷移機制。你如何做到這一點取決於該線程正在做什麼。如果你明確地解釋了什麼,你會得到更可能幫助你解決實際問題的答案。

+1

+1你可以有一個線程,它有一個Socket對象,它必須在FileInputStream的新機器上以正確的狀態重新打開到遠程機器上不存在的文件。它不可能一般地在機器之間移動線程,但可以移動線程在機器之間進行的工作。 –

0

如果您想將正在運行的JVM從一臺機器移動到另一臺機器,您很可能不會自己做,而是使用VM管理器的live migration功能。

虛擬機管理器會將整個虛擬機從一臺物理機器移動到另一臺物理機器上,而不會停止虛擬機或進程,但與序列化/反序列化線程相比,它有更高的級別。由於線程可能使用操作系統本地的資源,例如文件系統或套接字,因此整個操作系統需要將線程跟在另一臺物理機器上。

1

對此的回答實際上取決於構成正在運行的線程的狀態。

如果狀態是本地線程數據,它允許線程狀態被複制和保存,然後插回到一個新的線程中,那麼該機制基本上就是用一種可序列化的對象保存狀態然後用於創建一個保存狀態的新線程,然後開始運行。

但是,如果線程狀態依賴於外部對象或實體,問題就更加棘手。例如,如果您有一個線程充當使用TCP的服務器,並且您希望保存其狀態並稍後重新啓動,則套接字將發生更改,而訪問服務器線程的客戶端將知道服務器線程已停止通信一段時間。

這意味着對於任何取決於線程的外部實體,都需要知道該線程正在被保存和凍結,他們需要有一些東西可以讓他們選擇替代或保存並凍結自己,並且需要某種協議,以便重新啓動的線程可以讓其他實體知道它恢復了業務並瞭解其當前狀態。

此外,如果線程取決於某些外部實體,那麼這些實體必須能夠處理被凍結的線程。可能需要某種機制,以便線程可以釋放保存狀態的各種資源,然後在重新啓動時能夠回收這些資源或可比資源,然後將這些資源重置爲保存狀態。

+0

讓我們面對它,永遠不會發生。 –

+0

@Martin詹姆斯然後怎麼bit-torrentz工作?我們可以關閉機器,並再次開始在bit-torrentz開始從它離開的地方下載? – AmitG

0

我不知道你可以發送任何線程,本身。但是,可以使用諸如備忘錄模式之類的模式來保存線程的狀態。

看到這些引用你知道的術語繼續這樣前:

基本上,你有這樣的:

  1. 設計工作(線程),可以以任何起始狀態運行,包括執行中的狀態離子。
  2. 當它需要遷移時,獲取該線程的狀態。
    • 在Java中,您可以使用ThreadLocal變量來存儲線程狀態。
  3. 將該狀態序列化到另一臺機器。
  4. 使用該狀態以您反序列化的狀態啓動一個新線程。

這是一個更好的方法,然後居然遷移一個線程,它的狀態,棧,等等。因爲你可以挑選絕對需要的東西被移動,而不是不管什麼運動的一切。

+0

'遷移一個線程,它的狀態,堆棧等' - 任何人,任何地方,任何系統,出於任何理由都會接近做任何事情...... –