![](/img/trans.png)
[英]The difference between Thread.currentThread().getId() and Process.myTid() in Android
[英]Difference between process and thread
我今天在采訪中被問了一個問題。 首先,他們詢問如何在線程之間提供同步。 然后他們詢問如何在進程之間提供同步,因為我告訴他們,每個進程內的變量都不能與其他進程共享,所以他們讓我解釋兩個進程如何相互通信以及如何在它們之間提供同步,以及在哪里聲明共享變量? 現在面試結束了,但我想知道答案,有人能解釋一下嗎?謝謝。
我認為面試官可能沒有使用正確的術語。 進程在自己的空間中運行,並且在單獨的答案中提到過,您必須使用特定於操作系統的機制來在進程之間進行通信。 這稱為進程間通信的IPC。
使用套接字是一種常見的做法,但根據您的應用程序而言可能非常低效。 但是如果使用純Java,這可能是唯一的選擇,因為套接字是普遍支持的。
共享內存是另一種技術,但這是特定於操作系統的,需要特定於操作系統的調用。 您必須使用類似JNI的東西來訪問Java應用程序以訪問共享內存服務。 共享內存訪問不同步,因此您可能必須使用信號量來同步多個進程之間的訪問。
類Unix系統提供多個IPC機制,使用哪個機制取決於應用程序的性質。 共享內存可能是有限的資源,因此它可能不是最好的方法。 谷歌搜索這個主題提供了大量的點擊,提供有關技術細節的有用信息。
進程是虛擬內存空間,代碼,數據和系統資源的集合。 線程是要在進程內串行執行的代碼。 處理器執行線程而不是進程,因此每個應用程序至少有一個進程,並且進程始終至少有一個執行線程,稱為主線程。 除主線程外,進程可以有多個線程。 在引入多個執行線程之前,應用程序都設計為在單個執行線程上運行。
當一個線程開始執行時,它會繼續執行,直到它被終止或被一個具有更高優先級的線程(通過用戶操作或內核的線程調度程序)中斷。 每個線程可以運行單獨的代碼段,或者多個線程可以執行相同的代碼段。 執行相同代碼塊的線程維護單獨的堆棧。 進程中的每個線程共享該進程的全局變量和資源。
為了在兩個進程之間進行通信,我認為您可以使用ServerSocket和Socket來管理進程同步。 您將綁定到特定端口(獲取鎖定),如果已綁定進程,則可以連接到套接字(塊)並等待服務器套接字關閉。
private static int KNOWN_PORT = 11000;//arbitrary valid port
private ServerSocket socket;
public void acquireProcessLock(){
socket = new ServetSocket(KNOWN_PORT);
INetAddress localhostInetAddres = ...
try{
socket.bind(localhostInetAddres );
}catch(IOException failed){
try{
Socket socket = new Socket(localhostInetAddres ,KNOWN_PORT);
socket.getInputStream().read();//block
}catch(IOException ex){ acquireProcessLock(); } //other process invoked releaseProcessLock()
}
}
public void releaseProcessLock(){
socket.close();
}
不確定這是否是實際的最佳方法,但我認為值得考慮。
同步僅適用於線程,它不適用於Java中的進程。 它們之間沒有用於跨進程的實用程序,因為進程不共享任何需要同步的狀態。 一個進程中的變量與另一個進程中的變量不具有相同的數據
從系統的角度來看,線程由他的“ 狀態 ”和“ 指令指針 ”定義。
指令指針( eip )包含要執行的下一條指令的地址。
線程“ 狀態 ”可以是: 寄存器 (eax,ebx等), 信號 , 打開文件 , 代碼 , 堆棧 ,由此線程管理的數據 (變量,數組等)以及堆 。
進程是一組共享其“ 狀態 ”的一部分的線程:它可能是代碼 , 數據 , 堆 。 希望我回答你的問題;)
編輯:進程可以通過IPC進行通信(進程間通信)。 共有3種機制: 共享內存 , 消息隊列 。 我可以使用Semaphors進行進程之間的同步
可以使用互斥鎖進行線程同步( pthread_mutex_lock,pthread_mutex_unlock等 )
最簡單的答案是進程意味着正在執行的程序,程序只是函數集合。 其中thread是proccess的一部分,因為所有的線程都是函數。 換句話說,我們可以說一個進程可能有多個線程。 OS總是為進程分配內存,並且該進程的線程之間會分配內存.OS不為線程分配內存。
在一句話中,流程的設計比線程更獨立。
他們的主要差異可以在記憶層面描述。 不同的進程彼此之間沒有任何共享,從寄存器,庫存到堆內存,這使它們在自己的軌道上安全。 但是,通常線程被設計為共享公共堆內存,這為多個進程計算任務提供了更緊密連接的方式。 創建一種更有效的方式來占用計算資源。
例如,如果我使用3個進程進行計算,我必須讓它們各自完成它們的工作並在系統級別等待它們的結果,同時,總是占用寄存器和堆棧存儲器。 但是,如果我使用3個線程,那么如果線程2幸運地完成了它的工作,因為它計算的結果已經存儲到公共堆內存池,我們可以直接殺死它而無需等待其他人傳遞結果,這個已發布的寄存器和庫存內存資源可用於其他目的。
檢查Terracotta Cluster或Terracotta的DSO Clustering文檔,了解如何解決此問題(字節碼操作,維護putfield / getfield級別的Java語言規范的語義等)
處理:
主題:
注意:每個線程至少需要一個進程。
我想這些進程可以通過第三方進行通信:文件或數據庫......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.