自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Zygote進(jìn)程通信為什么用Socket而不是Binder?

移動(dòng)開發(fā) Android
Zygote進(jìn)程是Android系統(tǒng)中的一個(gè)特殊進(jìn)程,它在系統(tǒng)啟動(dòng)時(shí)被創(chuàng)建,并負(fù)責(zé)孵化其他應(yīng)用進(jìn)程。它的主要作用是預(yù)加載和共享應(yīng)用進(jìn)程的資源,以提高應(yīng)用啟動(dòng)的速度。

在Android系統(tǒng)中,常用的進(jìn)程通信方式有以下幾種:

  1. Intents:Intents是Android系統(tǒng)中用于在不同組件之間傳遞消息的一種機(jī)制。通過發(fā)送和接收Intents,不同進(jìn)程之間可以進(jìn)行簡單的通信。
  2. Binder:Binder是Android系統(tǒng)中的一種進(jìn)程間通信(IPC)機(jī)制,它基于C/S(Client/Server)模型。Binder提供了一種高效的跨進(jìn)程通信方式,可以在不同進(jìn)程之間傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  3. ContentProvider:ContentProvider是Android系統(tǒng)中用于實(shí)現(xiàn)進(jìn)程間數(shù)據(jù)共享的一種機(jī)制。通過ContentProvider,一個(gè)進(jìn)程可以將自己的數(shù)據(jù)暴露給其他進(jìn)程,其他進(jìn)程可以通過ContentResolver來訪問這些數(shù)據(jù)。
  4. Socket:Socket是一種基于網(wǎng)絡(luò)的進(jìn)程間通信方式,它可以在不同設(shè)備之間進(jìn)行通信。通過Socket,不同進(jìn)程可以通過網(wǎng)絡(luò)傳輸數(shù)據(jù)。

Zygote進(jìn)程介紹

Zygote進(jìn)程是Android系統(tǒng)中的一個(gè)特殊進(jìn)程,它在系統(tǒng)啟動(dòng)時(shí)被創(chuàng)建,并負(fù)責(zé)孵化其他應(yīng)用進(jìn)程。它的主要作用是預(yù)加載常用的系統(tǒng)類和資源,以提高應(yīng)用啟動(dòng)的速度。

在Android系統(tǒng)中,每個(gè)應(yīng)用都運(yùn)行在獨(dú)立的進(jìn)程中,這樣可以保證應(yīng)用之間的隔離性。然而,創(chuàng)建新進(jìn)程需要消耗一定的時(shí)間和資源。為了減少應(yīng)用啟動(dòng)的時(shí)間,Android引入了Zygote進(jìn)程。

Zygote進(jìn)程在系統(tǒng)啟動(dòng)時(shí)會(huì)先加載一些常用的系統(tǒng)類和資源,然后通過fork()系統(tǒng)調(diào)用創(chuàng)建新的應(yīng)用進(jìn)程。新的應(yīng)用進(jìn)程會(huì)繼承Zygote進(jìn)程的內(nèi)存空間,從而避免了重新加載系統(tǒng)類和資源的開銷。這樣,應(yīng)用進(jìn)程的啟動(dòng)速度就會(huì)大大提高。

Zygote的創(chuàng)建和啟動(dòng)過程:

  1. 系統(tǒng)啟動(dòng)時(shí),Linux內(nèi)核會(huì)加載init進(jìn)程,init進(jìn)程是Android系統(tǒng)的第一個(gè)用戶空間進(jìn)程。
  2. init進(jìn)程會(huì)讀取init.rc文件,該文件定義了系統(tǒng)啟動(dòng)時(shí)需要執(zhí)行的一系列操作。
  3. 在init.rc文件中,會(huì)有一條類似于"service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server"的命令。
  4. 這條命令會(huì)啟動(dòng)一個(gè)名為zygote的進(jìn)程,該進(jìn)程的可執(zhí)行文件是app_process,位于/system/bin目錄下。同時(shí),命令中的參數(shù)"-Xzygote"表示以zygote作為進(jìn)程名,"--zygote"表示以zygote的方式啟動(dòng)進(jìn)程,"--start-system-server"表示啟動(dòng)系統(tǒng)服務(wù)。
  5. Zygote進(jìn)程啟動(dòng)后,會(huì)先執(zhí)行一些初始化操作,然后進(jìn)入主循環(huán)等待創(chuàng)建其他應(yīng)用進(jìn)程的請(qǐng)求。
  6. 當(dāng)有應(yīng)用進(jìn)程需要?jiǎng)?chuàng)建時(shí),Zygote會(huì)fork出一個(gè)子進(jìn)程,并通過socket與子進(jìn)程進(jìn)行通信。
  7. 子進(jìn)程會(huì)繼承Zygote進(jìn)程的資源,包括虛擬機(jī)、類加載器等,從而加快應(yīng)用進(jìn)程的啟動(dòng)速度。
  8. 子進(jìn)程會(huì)加載應(yīng)用的主類,并調(diào)用其main方法,從而啟動(dòng)應(yīng)用。


Socket通信介紹

Socket通信是一種常見的進(jìn)程間通信方式,它基于網(wǎng)絡(luò)套接字(Socket)來實(shí)現(xiàn)進(jìn)程之間的數(shù)據(jù)傳輸。Socket通信可以在同一臺(tái)計(jì)算機(jī)上的不同進(jìn)程之間進(jìn)行通信,也可以在不同計(jì)算機(jī)上的進(jìn)程之間進(jìn)行通信。

在Socket通信中,一個(gè)進(jìn)程可以充當(dāng)服務(wù)器(Server),另一個(gè)進(jìn)程可以充當(dāng)客戶端(Client)。服務(wù)器進(jìn)程通過創(chuàng)建一個(gè)Socket,并綁定到一個(gè)特定的網(wǎng)絡(luò)地址和端口上,等待客戶端的連接請(qǐng)求。客戶端進(jìn)程通過創(chuàng)建一個(gè)Socket,并指定服務(wù)器的地址和端口,向服務(wù)器發(fā)起連接請(qǐng)求。

一旦建立了連接,服務(wù)器和客戶端之間就可以通過Socket進(jìn)行數(shù)據(jù)的發(fā)送和接收。服務(wù)器可以同時(shí)處理多個(gè)客戶端的請(qǐng)求,每個(gè)客戶端都會(huì)被分配一個(gè)獨(dú)立的Socket連接。

Socket通信可以使用不同的協(xié)議,如TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP是一種可靠的、面向連接的協(xié)議,它提供了數(shù)據(jù)的可靠傳輸和流式傳輸。UDP是一種無連接的協(xié)議,它提供了數(shù)據(jù)的不可靠傳輸和數(shù)據(jù)報(bào)傳輸。

Binder機(jī)制介紹

Binder是Android操作系統(tǒng)中的一種進(jìn)程間通信(IPC)機(jī)制。它是一種高效的、基于消息傳遞的IPC機(jī)制,用于在Android系統(tǒng)中不同進(jìn)程之間進(jìn)行通信。

Binder的核心是一個(gè)驅(qū)動(dòng)程序,它負(fù)責(zé)在不同進(jìn)程之間傳遞消息。在Android系統(tǒng)中,每個(gè)應(yīng)用程序運(yùn)行在獨(dú)立的進(jìn)程中,而Binder機(jī)制允許這些進(jìn)程之間進(jìn)行通信,以實(shí)現(xiàn)數(shù)據(jù)共享和功能調(diào)用。

Binder機(jī)制的基本原理是通過Binder驅(qū)動(dòng)程序提供的接口,將消息從一個(gè)進(jìn)程發(fā)送到另一個(gè)進(jìn)程。每個(gè)進(jìn)程都有一個(gè)Binder對(duì)象,用于接收和處理來自其他進(jìn)程的消息。當(dāng)一個(gè)進(jìn)程想要與另一個(gè)進(jìn)程通信時(shí),它可以通過Binder對(duì)象發(fā)送消息,并等待接收方的響應(yīng)。

在Android系統(tǒng)中,Binder機(jī)制被廣泛應(yīng)用于各種場(chǎng)景,例如Activity與Service之間的通信、進(jìn)程間共享數(shù)據(jù)等。它提供了一種安全可靠的IPC機(jī)制,能夠有效地解決進(jìn)程間通信的問題。

Socket與Binder對(duì)比

Socket和Binder是Android系統(tǒng)中常用的通信機(jī)制,它們?cè)趯?shí)現(xiàn)方式和使用場(chǎng)景上有一些區(qū)別。

  1. 實(shí)現(xiàn)方式:
  • Socket是一種基于網(wǎng)絡(luò)協(xié)議的通信機(jī)制,通過網(wǎng)絡(luò)套接字實(shí)現(xiàn)進(jìn)程間通信。它使用TCP或UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸,可以在不同設(shè)備或同一設(shè)備的不同進(jìn)程之間進(jìn)行通信。
  • Binder是一種基于內(nèi)核驅(qū)動(dòng)的進(jìn)程間通信機(jī)制,它通過驅(qū)動(dòng)程序?qū)崿F(xiàn)進(jìn)程間的數(shù)據(jù)傳輸。Binder使用C/S架構(gòu),包括服務(wù)端和客戶端,通過Binder驅(qū)動(dòng)在內(nèi)核空間中進(jìn)行通信。
  1. 使用場(chǎng)景:
  • Socket適用于網(wǎng)絡(luò)通信場(chǎng)景,可以在不同設(shè)備或同一設(shè)備的不同進(jìn)程之間進(jìn)行通信。常見的應(yīng)用包括網(wǎng)絡(luò)傳輸、遠(yuǎn)程過程調(diào)用(RPC)等。

  • Binder適用于Android系統(tǒng)內(nèi)部的進(jìn)程間通信場(chǎng)景,主要用于應(yīng)用程序組件之間的通信,如Activity與Service之間的通信、跨進(jìn)程的數(shù)據(jù)共享等。


  1. 性能和安全性:


  • Socket通信的性能相對(duì)較高,但在跨設(shè)備通信時(shí)需要考慮網(wǎng)絡(luò)延遲和帶寬等因素。同時(shí),Socket通信需要進(jìn)行網(wǎng)絡(luò)權(quán)限的申請(qǐng)和管理,可能存在一定的安全風(fēng)險(xiǎn)。

  • Binder通信的性能相對(duì)較低,但在同一設(shè)備內(nèi)部的進(jìn)程間通信時(shí)具有較高的效率。同時(shí),Binder通信在Android系統(tǒng)中有較好的安全性,可以通過權(quán)限控制和進(jìn)程隔離來保護(hù)系統(tǒng)的安全性。

綜上所述,Socket適用于網(wǎng)絡(luò)通信場(chǎng)景,而Binder適用于Android系統(tǒng)內(nèi)部的進(jìn)程間通信場(chǎng)景。在選擇通信機(jī)制時(shí),需要根據(jù)具體的應(yīng)用場(chǎng)景和需求進(jìn)行選擇。

Zygote進(jìn)程為什么用Socket而不是Binder?

  1. 先后時(shí)序問題:Binder驅(qū)動(dòng)是早于init進(jìn)程加載的。而init進(jìn)程是安卓系統(tǒng)啟動(dòng)的第一個(gè)進(jìn)程。安卓中一般使用的Binder引用,都是保存在ServiceManager進(jìn)程中的,而如果想從ServiceManager中獲取到對(duì)應(yīng)的Binder引用,前提是需要注冊(cè)。init進(jìn)程是先創(chuàng)建ServiceManager,后創(chuàng)建Zygote進(jìn)程的。雖然Zygote更晚創(chuàng)建,但是也不能保證Zygote進(jìn)程去注冊(cè)binder的時(shí)候,ServiceManager已經(jīng)初始化好了。注冊(cè)時(shí)間點(diǎn)無法保證,AMS無法獲取到Zygote的binder引用。
  2. 多線程問題:Linux中fork進(jìn)程是不推薦fork一個(gè)多線程的進(jìn)程的,因?yàn)槿绻嬖阪i的情況下,會(huì)導(dǎo)致鎖異常。而如果自身作為Binder機(jī)制的接收者,就會(huì)創(chuàng)建一個(gè)額外的線程來進(jìn)行處理(發(fā)送者進(jìn)程是無影響的)。所以,如果使用Binder機(jī)制,就會(huì)導(dǎo)致去fork一個(gè)多線程的進(jìn)程。
  3. 效率問題:AMS和Zygote之間使用的LocalSocket,相對(duì)于網(wǎng)絡(luò)Socket,減少了數(shù)據(jù)驗(yàn)證等環(huán)節(jié),所以其實(shí)效率相對(duì)于正常的網(wǎng)絡(luò)Socket會(huì)大幅的提升。雖然還是要經(jīng)過兩次拷貝,但是由于數(shù)據(jù)量并不大,所以其實(shí)影響并不明顯。
  4. Binder拷貝問題:如果使用Binder機(jī)制的話,從Zygote中fork出子進(jìn)程會(huì)拷貝Zygote中Binder對(duì)象。從而多占用了一塊無用的內(nèi)存區(qū)域。而Binder對(duì)象不能釋放。Binder的特殊性在于其是成對(duì)存在的,其分為Client端對(duì)象和Server端對(duì)象。假設(shè)我們使用Binder,如果要釋放掉Server端Binder引用對(duì)象,就必須釋放掉AMS中的Client端Binder對(duì)象,那這樣就會(huì)導(dǎo)致AMS失去Binder從而無法正常向Zygote發(fā)送消息。而使用Socket通訊的話,fork出APP進(jìn)程之后,APP進(jìn)程會(huì)去主動(dòng)的關(guān)閉掉這個(gè)Socket,從而釋放這塊區(qū)域。使用Binder會(huì)造成額外的內(nèi)存占用。

Zygote處理Socket消息

當(dāng)一個(gè)應(yīng)用程序需要?jiǎng)?chuàng)建一個(gè)新的進(jìn)程時(shí),它會(huì)通過Socket與Zygote進(jìn)程進(jìn)行通信。具體來說,應(yīng)用程序會(huì)向Zygote進(jìn)程發(fā)送一個(gè)包含應(yīng)用程序的包名、進(jìn)程名和其他參數(shù)的消息。Zygote進(jìn)程接收到這個(gè)消息后,會(huì)根據(jù)這些參數(shù)創(chuàng)建一個(gè)新的進(jìn)程,并執(zhí)行應(yīng)用程序的入口函數(shù)。

Zygote進(jìn)程處理socket消息的過程可以簡單描述如下:

  1. Zygote進(jìn)程創(chuàng)建一個(gè)Socket,并綁定到一個(gè)特定的端口上,等待應(yīng)用程序的連接請(qǐng)求。
  2. 當(dāng)一個(gè)應(yīng)用程序需要?jiǎng)?chuàng)建新進(jìn)程時(shí),它會(huì)通過Socket連接到Zygote進(jìn)程,并發(fā)送一個(gè)包含應(yīng)用程序參數(shù)的消息。
  3. Zygote進(jìn)程接收到消息后,解析參數(shù),并根據(jù)參數(shù)創(chuàng)建一個(gè)新的進(jìn)程。
  4. Zygote進(jìn)程將新進(jìn)程的PID返回給應(yīng)用程序,以便應(yīng)用程序可以與新進(jìn)程進(jìn)行通信。

需要注意的是,Zygote進(jìn)程并不直接處理Socket消息的具體內(nèi)容,而是將消息傳遞給相應(yīng)的處理函數(shù)來完成進(jìn)程創(chuàng)建的工作。這些處理函數(shù)會(huì)根據(jù)消息中的參數(shù)來執(zhí)行相應(yīng)的操作,例如加載應(yīng)用程序的代碼、創(chuàng)建進(jìn)程的環(huán)境等。

Zygote進(jìn)程通過Socket與應(yīng)用程序進(jìn)行通信,接收應(yīng)用程序的參數(shù),并根據(jù)這些參數(shù)創(chuàng)建新的進(jìn)程。這種機(jī)制使得Android系統(tǒng)能夠高效地創(chuàng)建和管理大量的應(yīng)用程序進(jìn)程。

責(zé)任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2020-02-14 15:22:58

編寫基礎(chǔ)架構(gòu)Python

2020-02-14 13:13:04

Go機(jī)器學(xué)習(xí)Python

2019-04-19 11:56:48

框架AI開發(fā)

2013-03-25 10:14:18

NginxApache

2018-02-09 09:36:25

DubboSpring Clou支付

2012-05-18 10:21:30

程序員CC++

2012-10-10 16:52:21

CentOSDebianUbuntu

2021-08-14 09:04:58

TypeScriptJavaScript開發(fā)

2021-10-30 19:57:00

HTTP2 HTTP

2021-12-30 19:36:48

GoDubboJava

2022-01-07 14:05:33

DubboGoJava

2020-09-15 09:23:19

C++WindowsC#

2017-09-11 19:58:06

PostgreSQLMySQL數(shù)據(jù)庫

2020-06-02 14:17:55

QWER排列鍵盤打印機(jī)

2012-04-06 10:35:30

SpringJavaHibernate

2021-08-10 18:54:48

射頻系統(tǒng)SMA

2022-07-13 07:06:47

HTTPSHTTP協(xié)議

2021-02-26 05:30:25

元素For-Each代碼

2021-06-30 12:47:12

標(biāo)簽HTML分辨率

2023-03-01 10:42:58

gRPC服務(wù)端設(shè)置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)