2012-04-02 12 views
21

Qualcuno può spiegare perché è stato creato ashmem?Quali poteri speciali ha ashmem?

Sto navigando attraverso mm/ashmem.c in questo momento. Per quanto posso dire, il kernel sta pensando ad ashmem come memoria supportata da file che può essere memorizzata in mmap'd. Ma allora, perché prendersi la briga di implementare ashmem? Sembra che la stessa funzionalità possa essere ottenuta montando una RAM fs e quindi utilizzando la mappa/mmap per condividere la memoria.

Sono sicuro che ashmem può fare cose più fantasiose - dal punto di vista del codice, sembra che abbia qualcosa a che fare con le pagine di blocco/sblocco?

risposta

19

Ashmem consente ai processi che non sono collegati da antenato di condividere le mappe di memoria per nome, che vengono ripulite automaticamente.

I vecchi vecchi mmaps anonimi e la memoria condivisa System V mancano di alcuni di questi requisiti.

I segmenti di memoria condivisa del sistema V restano bloccati quando non viene più fatto riferimento all'esecuzione di programmi (che a volte è una funzionalità, a volte una seccatura).

Gli mmaps anonimi condivisi possono essere passati da processi padre a figlio, che non sono flessibili poiché talvolta si desidera che i processi non siano correlati in questo modo per condividere la memoria.

+3

Ma ashmem richiede la condivisione tramite descrittori di file. Creare un file di backup e consentire a ciascun processo di renderlo condiviso condividerebbe lo stesso obiettivo, no? Capisco come sia meglio di shmem, ma come è meglio avere un file di supporto? –

+1

È meglio perché, beh, creare un file quando ciò che si vuole veramente è un pezzo di memoria condiviso è una specie di percorso tortuoso e hacky. (Dovendo usare un descrittore di file è ancora hacky, ma meno hacky che avere un file anche lì. I descrittori di file già generalizzano a diversi tipi di risorse, ad esempio socket e dispositivi.) – Kaz

+0

Quella attività di blocco e sblocco sembra consentire di implementare la cache memoria nella tua applicazione che andrà via quando la memoria è necessaria, in modo simile ai buffer del kernel. L'API ti consente di sapere se la memoria è stata eliminata (hai ancora la cache o no). – Kaz

5

Qualcuno può spiegare perché è stato creato ashmem?

David Turner (un regolare su Android NDK) risponde presente in Why was bionic/libc/include/sys/shm.h removed?:

... System V IPC sono stati rimossi per cupcake. Vedi bionic/libc/docs/SYSV-IPC.TXT per i dettagli.

In breve, gli IPC System V perdono di progettazione e non giocano bene in ambiente di runtime di Android in cui i processi di omissione per fare spazio a altri è solo normale e molto comune. Il risultato finale è che qualsiasi codice che si basa su questi IPC potrebbe finire col riempire la tabella interna del kernel delle chiavi SysV IPC , cosa che può essere risolta in modo sicuro solo con il riavvio .

Vogliamo fornire un meccanismo alternativo in futuro che non abbia gli stessi problemi nello . Una cosa che forniamo al momento è ashmem, che è stato progettato specificamente per Android per evitare quel tipo di problema (anche se non è ben documentato come dovrebbe). Probabilmente abbiamo bisogno di qualcosa di simile per i semafori e/o le code dei messaggi.