2011-10-19 23 views
5

Abbiamo un'applicazione molto modulare con molti oggetti condivisi (.so). Alcune persone sostengono che su piattaforme di fascia bassa con memoria/flash limitata, è meglio collegare staticamente tutto in un unico grande eseguibile poiché gli oggetti condivisi hanno un sovraccarico.Overhead oggetti condivisi

Qual è la tua opinione?

migliori saluti,

Paul

risposta

5

A meno che la memoria non sia estremamente, la dimensione di una copia di questi file non è il fattore determinante principale. Dato che questo è un sistema embedded, probabilmente hai una buona idea di quali applicazioni useranno le tue librerie e quando. Se la tua applicazione apre e chiude le librerie multiple, fa riferimento doveroso, e non hai mai tutte le librerie aperte contemporaneamente, quindi la libreria condivisa sarà un notevole risparmio di RAM.

L'altro fattore che è necessario considerare è la penalità delle prestazioni. L'apertura di una libreria condivisa richiede una piccola quantità (solitamente banale) di tempo; se si dispone di un processore molto lento o di requisiti in tempo reale difficili da raggiungere, la libreria statica non incorre nella penalità di caricamento della libreria condivisa. Profilo per scoprire se questo è significativo o meno.

Per riassumere, le librerie condivise possono essere significativamente migliori delle librerie statiche in alcuni casi speciali. Nella maggior parte dei casi, fanno poco o nessun danno. In situazioni semplici, non si ottiene alcun beneficio dalle librerie condivise.


Naturalmente, la libreria condivisa sarà un notevole risparmio in Flash, se si dispone di più applicazioni (o versioni della vostra applicazione) che utilizzano la stessa libreria. Se si utilizza una libreria statica, una copia (che è circa della stessa dimensione della libreria condivisa [1]) verrà compilata in ciascuna. Questo è utile quando sei su una workstation PC. Ma lo sapevi. Stai lavorando con una libreria che viene utilizzata solo da un'applicazione.


[1] La differenza di memoria dei singoli file di libreria è ridotta. Le librerie condivise aggiungono un indice e una tabella dei simboli in modo che dlopen(3) possa caricare la libreria. Indipendentemente dal fatto che ciò sia significativo dipenderà dal tuo caso d'uso; compilare per ciascuno e quindi confrontare le dimensioni per determinare quale è più piccolo in Flash. Dovrai eseguire e profilo per determinare quale consuma più RAM; dovrebbero essere simili ad eccezione del caricamento iniziale della libreria condivisa.

1

Avendo un sacco di librerie naturalmente significa più meta-dati devono essere memorizzati, e anche un po 'di quel meta-dati (sezione biblioteca intestazioni ecc) dovranno essere memorizzato nella RAM quando caricato. Ma la differenza dovrebbe essere abbastanza trascurabile, anche su sistemi (moderatamente moderni) incorporati.

Suggerisco di provare entrambe le alternative e misurare lo spazio utilizzato sia in FLASH che in RAM, quindi decidere quale sia il migliore.

6

I costi delle librerie condivise sono grosso modo (per biblioteca):

  • Almeno 4k di memoria privata sporco.
  • Almeno 12k di spazio di indirizzi virtuali.
  • Diversi sistemi di accesso al file system syscalls, mmap e mprotect syscalls e almeno un errore di pagina al momento del caricamento.
  • Tempo per risolvere i riferimenti ai simboli nel codice della libreria.

costi codice indipendente dalla posizione plus:

  • La perdita di un registro di uso generale (questo può essere enorme su x86 (32 bit), ma per lo più irrilevante su altri archi).
  • Livello aggiuntivo di riferimento indiretto che accede a variabili/costanti globali/statiche.

Se si dispone di un'applicazione di lunga durata, i costi potrebbero non essere importanti per l'utente, a meno che non si tratti di un piccolo sistema incorporato. D'altra parte, se stai scrivendo qualcosa che può essere invocato molte volte per compiti brevi (come un interprete di lingua) questi costi possono essere enormi. Mettere tutti i moduli standard nei propri file .so invece che statici collegarli di default è una parte enorme del perché Perl, Python, ecc. Sono così lenti da avviare.

Personalmente, vorrei andare con la strategia di utilizzare moduli caricati dinamici come strumento estensibilità, non come un modello di sviluppo .