當前位置:編程學習大全網 - 源碼下載 - Android跨進程通信-共享內存

Android跨進程通信-共享內存

我們先來看看* * *內存的使用情況。我主要介紹兩個功能:

通過shmget()函數申請* * *享受內存,其參數如下

通過shmat()函數,我們將申請的* * *內存映射到自己的用戶空間。如果映射成功,我們將返回地址。有了這個地址,我們就可以隨意讀寫數據了。我們繼續來看看這個函數的參數。

* * *內存共享的原理是在內存中單獨打開壹段內存空間,實際上是壹個臨時虛擬文件(tempfs)。tempfs是VFS的文件系統,掛載在/dev/shm上,前面提到的pipeline pipefs也是VFS的文件系統。

因為* * *所享有的內存空間對使用和接收過程完全不敏感,就像在自己的內存中讀寫數據壹樣,也是最高效的IPC方法。

上面提到的IPC方法都是在內核空間中開辟內存來存儲數據。寫數據的時候需要把數據從用戶空間拷貝到內核空間,讀數據的時候需要把數據從內核空間拷貝到自己的用戶空間。

* * *內存共享只需要壹個副本,* * *內存共享在內核中不產生空間,所以可以傳輸的數據量大。

但是* * *共享內存最大的缺點就是沒有並發控制。壹般我們用信號量配合* * *共享內存來控制同步和並發。

Android系統中的* * *內存共享主要用於傳輸大數據,Android並沒有直接使用Linux的原生* * *內存共享模式,而是設計了Ashmem匿名* * *內存共享。

如前所述,著名管道和匿名管道的區別在於,著名管道可以在vfs目錄樹中查看該管道的文件,而匿名管道則不能,所以匿名* * *共享內存也不能在vfs目錄中查看。我覺得Android之所以要設計匿名* * *共享內存,主要是出於安全考慮。

我們來看* * *共享內存的壹個使用場景。在Android中,如果要顯示當前界面,需要將當前界面的圖形元數據傳遞給Surfaceflinger進行圖層混合,圖層混合後的數據會直接發送到幀緩沖區。送到幀緩沖區後,顯卡會直接取出幀緩沖區中的圖形元數據並顯示出來。

那麽我們如何將應用活動的圖形元數據傳遞給SurfaceFlinger呢?如果要跨進程傳輸圖像數據這樣的大數據,不能依靠binder,所以這裏使用匿名內存共享。

從Google官方提供的架構圖可以看出,圖元數據是通過BufferQueue傳遞給SurfaceFlinger的。當我們要繪制壹幅圖像時,需要從BufferQueue申請壹個緩沖區,緩沖區會調用Gralloc模塊分配* * *內存作為圖元緩沖區來存儲我們的圖形元數據。

可以看到Android的匿名* * *共享內存是通過ashmem_create_region()函數申請的,會在/dev/ashmem下創建壹個虛擬文件,Linux的原生* * *共享內存是通過shmget()函數,在/dev/shm下創建壹個虛擬文件。

匿名* * *內存共享是通過mmap()函數將申請的內存映射到自己的進程空間,而Linux使用的是*shmat()函數。

雖然功能不同,但是Android的匿名* * *共享內存和Linux的* * *共享內存本質上是壹樣的。

使用* * *共享內存。

  • 上一篇:SpringBoot之@Async異步調用
  • 下一篇:宏觀分析 指標分析的主要內容
  • copyright 2024編程學習大全網