Android Binder 機(jī)制學(xué)習(xí)2 - Linux 下傳統(tǒng)的進(jìn)程間通信基本原理

在了解 Binder 跨進(jìn)程通信原理之前, 我們先了解一下 Linux 傳統(tǒng)的進(jìn)程間通信的概念和基本原理, 這樣有助于我們更好的理解 Binder 的通信原理. 這個(gè)部分基本都是理論, 基礎(chǔ)不是很好的同學(xué), 還是要耐著性子看完. 最起碼,我看完后受益匪淺.
(如有侵權(quán), 請(qǐng)聯(lián)系刪除)

1.基本概念

Linux 中跨進(jìn)程通信有一些幾個(gè)基本的概念

  1. 進(jìn)程隔離
  2. 進(jìn)程空間劃分: 用戶空間(User Space) & 內(nèi)核空間(Kernel Space)
  3. 系統(tǒng)調(diào)用: 用戶態(tài) & 內(nèi)核態(tài)

1.1 進(jìn)程隔離

  • 簡單的說就是操作系統(tǒng)中, 進(jìn)程與進(jìn)程間的內(nèi)存是不共享的. 兩個(gè)進(jìn)程就像兩個(gè)平行的世界, A進(jìn)程沒辦法直接訪問 B 進(jìn)程的數(shù)據(jù).這就是進(jìn)程隔離的通俗解釋. A 進(jìn)程和 B 進(jìn)程之間要進(jìn)行數(shù)據(jù)交互就得采用特殊的通信機(jī)制: 進(jìn)程間通信(IPC)

1.2 進(jìn)程空間劃分

  • 現(xiàn)在操作系統(tǒng)都是采用的虛擬存儲(chǔ)器, 對(duì) 32 位系統(tǒng)而言, 它的尋址空間 (虛擬存儲(chǔ)空間) 就是 2 的 32 吃飯,也就是 4GB. 操作系統(tǒng)的核心是內(nèi)核,獨(dú)立于普通的應(yīng)用程序, 可以訪問受保護(hù)的內(nèi)存空間, 也可以訪問底層硬件設(shè)備的權(quán)限. 為了保護(hù)用戶進(jìn)程不能直接操作內(nèi)核, 保證內(nèi)核的安全, 操作系統(tǒng)從邏輯上將虛擬空間劃分為用戶空間(User Space) 和內(nèi)核空間(Kernel). 針對(duì) Linux 操作系統(tǒng)而言, 將最高的 1GB 直接供內(nèi)核使用. 稱為內(nèi)核空間. 較低的 3GB 直接供各進(jìn)程使用,稱為用戶空間. 簡單來說就是, 內(nèi)核空間是系統(tǒng)內(nèi)核運(yùn)行的空間, 用戶空間是用戶程序運(yùn)行的空間. 為了保證安全性, 他們之間是隔離的.

1.3 系統(tǒng)調(diào)用: 用戶態(tài) & 內(nèi)核態(tài)

Linux 使用兩級(jí)保護(hù)機(jī)制: 0 級(jí)供系統(tǒng)內(nèi)核使用, 3 級(jí)供用戶程序使用

  • 當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí), 稱進(jìn)程處于內(nèi)核運(yùn)行態(tài)(內(nèi)核態(tài)). 此時(shí)處理器處于特權(quán)級(jí)最高的(0 級(jí))內(nèi)核代碼中執(zhí)行. 當(dāng)進(jìn)程處于內(nèi)核態(tài)時(shí), 執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧. 每個(gè)進(jìn)程都有自己的內(nèi)核棧.
  • 當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼的時(shí)候, 我們稱其處于用戶運(yùn)行態(tài)(用戶態(tài)). 此時(shí)處理器在特權(quán)級(jí)最低的(3 級(jí)) 用戶代碼中運(yùn)行.
  • 系統(tǒng)調(diào)用, 主要通過如下兩個(gè)函數(shù)來實(shí)現(xiàn).
    • copy_from_user() //將數(shù)據(jù)從用戶空間 copy 到內(nèi)核空間
    • copy_to_user() //將數(shù)據(jù)從內(nèi)核空間 copy 到用戶空間

2. 傳統(tǒng) IPC 通信的基本原理.

通常做法是將消息發(fā)送方要發(fā)送的數(shù)據(jù)放在內(nèi)存緩存區(qū)中, 通過系統(tǒng)圖調(diào)用進(jìn)入內(nèi)核態(tài), 然后內(nèi)核程序在內(nèi)核空間分配內(nèi)存, 開辟一塊內(nèi)核緩存區(qū), 調(diào)用 copy_from_user() 函數(shù)將數(shù)據(jù)從用戶空間的內(nèi)存緩存區(qū) copy 到內(nèi)核空間的內(nèi)核緩存區(qū)中. 同樣的接收方進(jìn)程在接收數(shù)據(jù)時(shí)在自己的用戶空間開辟一塊內(nèi)存緩存去, 然后內(nèi)核程序調(diào)用 copy_to_user() 函數(shù)將數(shù)據(jù)從內(nèi)核緩存區(qū) copy 到接收進(jìn)程的內(nèi)存緩存區(qū). 這樣數(shù)據(jù)發(fā)送方進(jìn)程和數(shù)據(jù)接收方進(jìn)程就完成了一次數(shù)據(jù)傳輸. 也就是完成了一次進(jìn)程間通信.

傳統(tǒng) IPC 通信的基本流程

傳統(tǒng)的 IPC 通信方式有兩個(gè)問題

  • 性能低下, 一次數(shù)據(jù)傳遞需要經(jīng)歷: 內(nèi)存緩存區(qū)(發(fā)送方) -> 內(nèi)核緩存區(qū) -> 內(nèi)存緩存區(qū)(接收方). 兩次的數(shù)據(jù) copy
  • 接收數(shù)據(jù)的緩存區(qū)由數(shù)據(jù)接收進(jìn)程提供, 但是接收進(jìn)程并不知道需要多大的空間來存放將要傳遞過來的數(shù)據(jù), 因此只能開辟盡可能大的內(nèi)存控件或者先調(diào)用 API 接收消息頭來獲取消息體的大小, 但是這兩種做法不是浪費(fèi)空間就是浪費(fèi)時(shí)間.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耍属,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灾挨,更是在濱河造成了極大的恐慌摔刁,老刑警劉巖讼积,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡恼琼,警方通過查閱死者的電腦和手機(jī)屈暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門拆讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人养叛,你說我怎么就攤上這事种呐。” “怎么了弃甥?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵爽室,是天一觀的道長。 經(jīng)常有香客問我淆攻,道長阔墩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任瓶珊,我火速辦了婚禮啸箫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伞芹。我一直安慰自己忘苛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布唱较。 她就那樣靜靜地躺著扎唾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪南缓。 梳的紋絲不亂的頭發(fā)上稽屏,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音西乖,去河邊找鬼狐榔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛获雕,可吹牛的內(nèi)容都是我干的薄腻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼届案,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼庵楷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤尽纽,失蹤者是張志新(化名)和其女友劉穎咐蚯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄贿,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡春锋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了差凹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片期奔。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖危尿,靈堂內(nèi)的尸體忽然破棺而出呐萌,到底是詐尸還是另有隱情,我是刑警寧澤谊娇,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布肺孤,位于F島的核電站,受9級(jí)特大地震影響济欢,放射性物質(zhì)發(fā)生泄漏渠旁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一船逮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粤铭,春花似錦挖胃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垛吗,卻和暖如春凹髓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怯屉。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工蔚舀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锨络。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓赌躺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡儿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子礼患,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容