說一說 oneway 吧,瞭解過這個修飾符作用嗎?原理是什麼?怎麼理解單向呼叫?
面試官提了一個問題,我們來看看 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
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
相關文章
- 你瞭解什麼是微前端嗎?說說你對它的理解前端
- Java中final修飾符都有什麼作用Java
- 說說你遇到過最大的bug是什麼?怎麼解決的?
- 你知道什麼是CSS-in-JS嗎?說說你對它的瞭解CSSJS
- Java中的執行緒池用過吧?來說說你是怎麼理解執行緒池吧?Java執行緒
- 1、說說你瞭解過、使用過什麼程式語言?比較小他們的優點 2、說說你瞭解過、使用過什麼程式設計工具?程式設計
- 面試官:說說React服務端渲染怎麼做?原理是什麼?面試React服務端
- 你有使用過HTML5的output嗎?說說它的作用是什麼?HTML
- 你有使用過ExtJs嗎?說說它的優缺點是什麼?JS
- 說說你對keep-alive的理解是什麼?Keep-Alive
- 說說base標籤有什麼作用?
- 說說你對iframe屬性sandbox的理解,它有什麼作用呢?
- 什麼是覆蓋?有什麼作用?請舉例說明。
- 說說html5手勢檢測原理是什麼?HTML
- 說說webpack的熱更新是如何做到的?原理是什麼?Web
- 你知道js的可選鏈是什麼嗎?說說你對它的理解,它有什麼應用場景?JS
- 說說你對css的will-change屬性的理解,它有什麼作用呢?CSS
- 你知道TCP和UTP的區別是什麼嗎?說說你對它們的理解TCP
- CRM是什麼,你有認真瞭解過CRM嗎?
- Vite為什麼快呢?快在哪?說一下我自己的理解吧Vite
- 簡單瞭解什麼是ServletServlet
- W3C是什麼?請說說你對它的理解
- 說說HTML中的`<html>`標籤有什麼作用?HTML
- 你說說RPC的一個請求的流程是怎麼樣的?RPC
- 什麼是svg?說說svg有什麼運用場景?SVG
- 你有使用過BackboneJS嗎?說說它和vue有什麼區別?JSVue
- 面試官:說說你對NoSQL的瞭解,為什麼要有NoSQL面試SQL
- 什麼是框架?為什麼說 Angular 是框架?框架Angular
- python是什麼?這些你都瞭解了嗎?Python
- DNS協議 是什麼?說說DNS 完整的查詢過程?DNS協議
- 災備是什麼意思?怎麼簡單理解?
- Python是什麼?你對Python瞭解嗎?Python
- 對laravel框架你瞭解多少,為什麼說是優雅的框架Laravel框架
- 你瞭解什麼是畫素追蹤嗎?它是用來做什麼的?它的實現原理是什麼?
- 面試官:你給我說一下什麼是時間輪吧?面試
- PHP 物件導向 (一)許可權修飾符PHP物件
- 憑什麼說這是前端最好的時代?前端
- 什麼是物件?什麼是抽象?怎麼理解物件導向的程式設計思想?物件抽象程式設計