Android Ashmem共享記憶體使用

2021-09-20 10:32:53 字數 2252 閱讀 9809

android中設計的ashmem使用起來非常方便,但是很多封裝使用,卻讓其看起來複雜了。

下面通過乙個例子來檢視其使用

服務端建立共享記憶體fd,並通過binder通訊把fd提供給客戶端

#define log_tag "bindertest"

#include #include #include #include #include #include #include #include #include #include #include #include #include //for alogd

#include using namespace android;

using namespace std;

//int32_t* pdata = null;

int fd = -1;

class mybinder : public bbinder

status_t ontransact(

uint32_t code, const parcel& data, parcel* reply, uint32_t flags)

case 2:

case 3:

}return bbinder::ontransact(code, data, reply, flags);

}};int main(int argc, char** ar**)

} fd = heap->getheapid();

}printf("add myservice\n");

processstate::self()->startthreadpool();

ipcthreadstate::self()->jointhreadpool();

return 0;

}

服務端建立了共享記憶體,並且向裡面寫入了資料

再來測試下客戶端使用這個共享記憶體

#include #include #include #include #include #include #include #include #include #include #include //for lseek

#include //for mmap

#include using namespace android;

using namespace std;

class observer : public ibinder::deathrecipient

};int main(int argc, char* const ar**)

else

return 0;

}

客戶端對接收到的fd進行mmap操作後,獲取到了對映的記憶體位址,就可以進行讀寫操作了,

客戶端也可以使用read(fd)的方式去讀取資料,但是需要注意的是,這會導致檔案偏移,一般還是使用記憶體操作比較方便

相應的mk檔案

local_path := $(call my-dir)

#for service

include $(clear_vars)

local_src_files:= \

service.cpp 

local_shared_libraries := \

libbase \

libutils \

liblog \

libbinder

ifeq ($(target_os),linux)

local_cflags += -dxp_unix

#local_shared_libraries += librt

endif

local_module:= binderserver

include $(build_executable)

#for client

include $(clear_vars)

local_src_files:= \

client.cpp 

local_shared_libraries := \

libbase \

libutils \

liblog \

libbinder

ifeq ($(target_os),linux)

local_cflags += -dxp_unix

#local_shared_libraries += librt

endif

local_module:= binderclient

include $(build_executable)

共享與偽共享

共享就是乙個記憶體區域的資料被多個處理器訪問,偽共享就是不是真的共享。這裡的共享這個概念是基於邏輯層面的。實際上偽共享與共享在cache line 上實際都是共享的。cpu訪問的資料都是從cache line 中讀取的。如果cpu 在cache 中找不到需要的變數,則稱快取未命中。未命中時,需要通過...

mysql 共享nfs nfs共享

nfs共享 實驗環境 服務端 192.168.36.158 客戶端 192.168.36.159 iptables and selinux disabled 一.nfs net file system 簡介 nfs分為伺服器和客戶機兩部分,每個主機都有自己的核心級服務 外部資料表示 xdr,exte...

linux 實現共享檔案共享

linux和winxp資訊共享 samba伺服器的安裝和配置 步驟 1 查詢是否安裝了samba服務 rpm q samba rpm qa grep samba service smb start 2 安裝samba a 掛載映象 mount t iso9660 iso mymedia o loop...