2012-04-02 4 views
21

灰皿が作成された理由を誰かが説明できますか?灰皿には特別な力はありますか?

私は現在mm/ashmem.cからブラウジング中です。私が知る限りでは、カーネルはファイルベースのメモリであるashmemをmmapすることができると考えています。しかし、なぜ、灰皿を実装するのに苦労するのですか?同じ機能がRAM fsをマウントし、filemap/mmapを使ってメモリを共有することで実現できるようです。

私は、ashmemがコードを見てから、ピンイン/ピン止めのページと関連があるようだと確信しています。

答えて

19

Ashmemは、祖先に関係しないプロセスに名前でメモリマップを共有することを許可します。自動的にクリーンアップされます。

通常の匿名mmapsおよびSystem V共有メモリには、これらの要件の一部がありません。

実行中のプログラムによって参照されなくなったときに、System V共有メモリセグメントが固執します(これは機能であることもありますが、時には迷惑です)。

匿名共有mmapは、親プロセスから子プロセスに渡すことができます。これは柔軟性のないプロセスであり、そのプロセスとは関係のないプロセスでメモリを共有したいことがあるためです。

+3

しかし、ashmemはファイル記述子を介して共有する必要があります。バッキングファイルを作成し、各プロセスがそれを共有することを許可すると、同じ目標を達成できますか?私はこれがshmemよりも優れている方法を見ていますが、バッキングファイルを持つよりもどのように優れていますか? –

+1

あなたが本当に望んでいるときにファイルを作成するのは、共有のメモリであるということは、まばらな、ハッキーなルートのようなものだからです。 (ファイルディスクリプタを使用することは、まだハッキリですが、そこにファイルを置くよりもハッキリしません。ファイルディスクリプタはすでにソケットやデバイスなど、さまざまな種類のリソースに一般化されています)。 – Kaz

+0

キャッシュを固定し、カーネルバッファーと同様に、メモリーが必要なときに消えるアプリケーションのメモリー。 APIを使用すると、メモリが消去されたかどうかを知ることができます(まだキャッシュがあるかどうか)。 – Kaz

5

なぜ灰皿が作成されたのか説明できますか?

デビッド・ターナー(AndroidのNDKを定期的には)Why was bionic/libc/include/sys/shm.h removed?でこれに答え:

を...のSystem VのIPCは、カップケーキのために削除されました。詳細については、 bionic/libc/docs/SYSV-IPC.TXTを参照してください。

簡潔に言えば、System V IPCsはデザインによって漏れていて、 他のもののための部屋を作るための殺害プロセスが正常で非常に一般的なAndroidの実行時環境ではうまくいきません。結局のところ、これらのIPCに依存する コードは、カーネルの SysV IPCキーの内部テーブルをいっぱいにしてしまう可能性があります.Directorによって再インストールされたのは、 です。

同じ問題がない代替メカニズムを今後提供したいと考えています。私たちが現時点で提供しているものの1つは、灰皿です。 は、この種の問題を避けるためにAndroid向けに特別に設計されたものです。セマフォやメッセージキューの場合には、おそらく が必要です。

関連する問題