說一說 oneway 吧,瞭解過這個修飾符作用嗎?原理是什麼?怎麼理解單向呼叫?

augfun發表於2020-11-17

面試官提了一個問題,我們來看看 A、B 和 C 三位同學的表現如何吧


A

面試官️:看你簡歷上寫熟悉 AIDL,說一說 oneway 吧

A:oneway 是什麼?跟 AIDL 沒關係吧,我熟悉 AIDL 指的是使用 AIDL 介面進行跨程式通訊。

面試官:AIDL 介面的方法可以用 oneway 修飾符來修飾,瞭解過這個修飾符的作用嗎?

A:可以提高效能嗎?我覺得沒必要使用,我從沒用過,程式也跑的好好的,沒出過什麼問題。

面試官:好的,回去等通知吧


B

面試官:看你簡歷上寫熟悉 AIDL,說一說 oneway 吧

B:用 oneway 修飾的 AIDL 介面方法,是單向呼叫,不需要等待另一個程式的返回結果,所以方法的返回型別也只允許是 void.

面試官:怎麼理解 "單向呼叫" ,有了解過它的實現原理嗎?

B:由應用程式到服務程式是通過 binder 驅動進行 IPC 通訊的,單向的意思應該是應用程式只向 binder 驅動傳送一次資料就結束返回,不再等待回覆資料;而不用 oneway 修飾的方法需要等待 binder 驅動與服務端通訊完後,再回複資料給應用端。

面試官:只向 binder 驅動傳送資料嗎?binder 驅動有沒有回覆應用?

B:嗯... 我理解的是既然不需要返回值,所以沒有回覆吧

面試官:好的,回去等通知吧


C

面試官:看你簡歷上寫熟悉 AIDL,說一說 oneway 吧

C:oneway 主要有兩個特性:非同步呼叫和序列化處理。非同步呼叫是指應用向 binder 驅動傳送資料後不需要掛起執行緒等待 binder 驅動的回覆,而是直接結束。像一些系統服務呼叫應用程式的時候就會使用 oneway,比如 AMS 呼叫應用程式啟動 Activity,這樣就算應用程式中做了耗時的任務,也不會阻塞系統服務的執行。

序列化處理是指對於一個服務端的 AIDL 介面而言,所有的 oneway 方法不會同時執行,binder 驅動會將他們序列化處理,排隊一個一個呼叫。

面試官:有了解過相關的 binder 協議嗎?

C:瞭解過,圖會更直觀一些,我來畫一下圖吧,首先是非 oneway 的情況:

如果是 oneway 的話,客戶端就不需要掛起執行緒等待:

涉及到的 binder 命令也有規律,由外部傳送給 binder 驅動的都是 BC_ 開頭,由 binder 驅動發往外部的都是 BR_開頭。

面試官:怎麼理解客戶端執行緒掛起等待呢?有沒有實際佔用 CPU 的排程?

C:這裡的掛起相當於 Thread 的 sleep,是真正的"休眠",底層呼叫的是 wait_event_interruptible() Linux 系統函式。

面試官:你是從哪裡瞭解到 wait_event_interruptible() 函式的呢?

C:在學習 Handler 機制的時候,Handler 中最關鍵的地方就是 Looper 的阻塞與喚醒,阻塞是呼叫了 nativePollOnce() 方法,當時對它的底層實現感興趣,就去了解了一下,也學習到 Linux 用來實現阻塞/喚醒的 select、poll 和 epoll 機制

面試官:可以,我們再來聊聊別的。



作者:位元組走動_Android
連結:https://www.jianshu.com/p/133def697c24
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章