2012-04-02 31 views
21

有人可以解釋爲什麼ashmem創建?ashmem有什麼特別的權力?

我正在瀏覽mm/ashmem.c。據我所知,內核正在考慮將ashmem作爲可以mmap的文件備份內存。但是,爲什麼要去實施ashmem的麻煩?似乎可以通過安裝RAM fs然後使用filemap/mmap共享內存來實現相同的功能。

我敢肯定,ashmem可以做更多花哨的東西 - 從看代碼,好像有東西做寄託/拔除頁?

回答

19

Ashmem允許與血統無關的進程通過名稱共享內存映射,這些內存映射會自動清理。

普通舊的匿名mmap和System V共享內存缺少其中一些要求。

System V共享存儲器段圍着當通過運行程序(其是有時一個特徵,有時造成滋擾)不再被引用。

匿名共享mmaps可以從父到子進程,因爲有時你想不涉及這種方式共享內存進程是不靈活的傳遞。

+3

但ashmem需要通過文件描述符共享。創建一個支持文件,並允許每個進程mmap它共享將完成相同的目標,不是嗎?我看到這比shmem好,但是如何比擁有支持文件更好? – 2012-04-02 04:26:04

+1

這樣做更好,因爲當你真正想要的是共享的內存時,創建一個文件就像是一條迂迴的黑客路線。 (必須使用一個文件描述符仍然很不方便,但是比在那裏有一個文件還不夠hacky文件描述符已經推廣到不同種類的資源,例如套接字和設備) – Kaz 2012-04-02 04:39:55

+0

這種固定和取消固定業務似乎可以讓你實現緩存應用程序中的內存將在需要內存時消失,與內核緩衝區類似。 API可以讓你知道內存是否已被清除(你是否還有你的緩存)。 – Kaz 2012-04-02 04:50:23

5

有人可以解釋爲什麼ashmem被創造?

大衛·特納(在Android NDK定期)在Why was bionic/libc/include/sys/shm.h removed?回答了這個:

...系統V的IPC已經爲蛋糕取出。有關詳細信息,請參閱 bionic/libc/docs/SYSV-IPC.TXT。

簡而言之,系統V的IPC在設計上存在漏洞,並且在 的Android運行時環境中發揮作用,其中殺死進程爲其他設備騰出空間以供其他人使用是正常且非常普遍的。最終的結果是,任何 代碼依賴這些公益機構可能最終填補了內核的 SysV的IPC鍵的內部表,這東西只能安全地通過 重啓解決。

我們希望在未來提供替代機制沒有 同樣的問題。我們目前提供的一件事是ashmem,其中 是專門爲Android設計的,以避免這種問題 (儘管它沒有像應該那樣記錄)。我們可能需要 類似的信號量和/或消息隊列。