1. 程式人生 > >面試題:IPC(跨程序通訊)

面試題:IPC(跨程序通訊)

Q1:IPC基礎及概念?
Q2:Android中程序和執行緒的關係?區別?
Q3:為何需要進行IPC?多程序通訊可能會出現什麼問題?
Q4:Android中IPC方式有幾種? 為何新增Binder來作為主要的IPC方式?
Q5:使用Binder進行資料傳輸的具體過程?
Q6:Binder框架中ServiceManager的作用?
Q7:Android中有哪些基於Binder的IPC方式?簡單對比下?
Q8:是否瞭解AIDL?原理是什麼?如何優化多模組都使用AIDL的情況?

Q9:什麼是序列化?Serializable介面和Parcelable介面的區別?為何推薦使用後者?

Q1:IPC基礎及概念?

IPC簡介

a.IPC(Inter-Process Communication,跨程序通訊):指兩個程序之間進行資料交換的過程。

b.任何一個作業系統都有對應的IPC機制。

  • Windows:通過剪下板、管道、油槽等進行程序間通訊。
  • Linux:通過名稱空間、共享內容、訊號量等進行程序間通訊。
  • Android:沒有完全繼承Linux,比如,其獨具特色的通訊方式有Binder、Socket等等。

c.IPC的使用場景:

  • 由於某些原因,應用自身需要採用多程序模式來實現。可能原因有:

          某些模組因特殊原因要執行在單獨程序中;
          為加大一個應用可使用的記憶體,需通過多程序來獲取多份記憶體空間。

  • 當前應用需要向其它應用獲取資料。

d.Android的程序架構:每一個Android程序都是獨立的,且都由兩部分組成,一部分是使用者空間,另一部分是核心空間,如下圖:

如此設計的優點:

  • 穩定性、安全性高:每一個Android程序都擁有自己獨立的虛擬地址空間,一方面可以限制其他程序訪問自己的虛擬地址空間;另一方面,當一個程序崩潰時不至於“火燒連營”。
  • 便於複用與管理:核心共享有助於系統維護和併發操作、節省空間。

Q2:Android中程序和執行緒的關係?區別?

程序(Process)&執行緒(Thread)

程序:一般指一個執行單元,在PC和移動裝置上指一個程式或應用。
執行緒:CPU排程的最小單元。執行緒是一種有限的系統資源。
兩者關係: 一個程序可包含多個執行緒,即一個應用程式上可以同時執行多個任務。

主執行緒(UI執行緒):UI操作
有限個子執行緒:耗時操作
注意:不可在主執行緒做大量耗時操作,會導致ANR(應用無響應)。

Q3:為何需要進行IPC?多程序通訊可能會出現什麼問題?

為什麼要用到多程序?
在Android系統中一個應用預設只有一個程序,每個程序都有自己獨立的資源和記憶體空間,其它程序不能任意訪問當前程序的記憶體和資源,系統給每個程序分配的記憶體會有限制。如果一個程序佔用記憶體超過了這個記憶體限制,就會報OOM的問題,很多涉及到大圖片的頻繁操作或者需要讀取一大段資料在記憶體中使用時,很容易報OOM的問題,為了徹底地解決應用記憶體的問題,Android引入了多程序的概念,它允許在同一個應用內,為了分擔主程序的壓力,將佔用記憶體的某些頁面單獨開一個程序,比如Flash、視訊播放頁面,頻繁繪製的頁面等。Android多程序使用很簡單,只需要在AndroidManifest.xml的宣告四大元件的標籤中增加”android:process”屬性即可,process分私有程序和全域性程序,以“:”號開頭的屬於私有程序,其他應用元件不可以和他跑在同一個程序中;不以“:”號開頭的屬於全域性程序,其他應用可以通過ShareUID的方式和他跑在同一個程序中;

既然使用到了多程序,就不可避免地需要使用程序間通訊了。

但是多程序模式出現以下問題:
1、靜態成員和單例模式完全失效
2、執行緒同步機制完全失效
3、SharedPreferences的可靠性下降
4、Application多次建立

因此為了避免這些問題Android中有多種IPC機制,如AIDL,Messenger,Socket,ContentProvider,但是這些機制底層全部都是用了Binder機制來實現的,什麼是Binder?要了解Android系統中的IPC我們首先要了解的就是Binder;

Q4:Android中IPC方式有幾種? 為何新增Binder來作為主要的IPC方式?

Binder機制原理

1、Binder機制

Binder是Android系統中的一種IPC程序間通訊結構。
Binder的整個設計是C/S結構,客戶端程序通過獲取服務端程序的代理,並通過向這個代理介面方法中讀寫資料來完成程序間的資料通訊。
Android之所以選擇Binder,有2個方面的原因。
1是安全,每個程序都會被Android系統分配UID和PID,不像傳統的在資料里加入UID,這就讓那些惡意程序無法直接和其他程序通訊,程序間通訊的安全性得到提升。
2是高效,像Socket之類的IPC每次資料拷貝都需要2次,而Binder只要1次,在手機這種資源緊張的情況下很重要。

1.客戶端獲取服務端的代理物件(proxy)。我們需要明確的是客戶端程序並不能直接操作服務端中的方法,如果要操作服務端中的方法,那麼有一個可行的解決方法就是在客戶端建立一個服務端程序的代理物件,這個代理物件具備和服務端程序一樣的功能,要訪問服務端程序中的某個方法,只需要訪問代理物件中對應的方法即可;
2.客戶端通過呼叫代理物件向服務端傳送請求。
3.代理物件將使用者請求通過Binder驅動傳送到伺服器程序;
4.服務端程序處理客戶端發過來的請求,處理完之後通過Binder驅動返回處理結果給客戶端的服務端代理物件;
5.代理物件將請求結果進一步返回給客戶端程序。
通過以上5個步驟,就完成了一次Binder通訊。

2、Binder機制的組成

Binder機制由三部分組成,即:
1.Client;
2.Server;
3.ServiceManager。

三部分元件之間的關係:
1.Client、Server、ServiceManager均在使用者空間中實現,而Binder驅動程式則是在核心空間中實現的;
2.在Binder通訊中,Server程序先註冊一些Service到ServiceManager中,ServiceManager負責管理這些Service並向Client提供相關的介面;
3.Client程序要和某一個具體的Service通訊,必須先從ServiceManager中獲取該Service的相關資訊,Client根據得到的Service資訊與Service所在的Server程序建立通訊,之後Clent就可以與Service進行互動了;
4.Binder驅動程式提供裝置檔案/dev/binder與使用者空間進行互動,Client、Server和ServiceManager通過open和ioctl檔案操作函式與Binder驅動程式進行通訊;
5.Client、Server、ServiceManager三者之間的互動都是基於Binder通訊的,所以通過任意兩者這件的關係,都可以解釋Binder的機制。