2009-06-29 8 views
6

Da questa risposta: When is a C++ terminate handler the Right Thing(TM)?SO; risorse pulire automaticamente

Sarebbe bello avere un elenco di risorse che sono '' e 'non sono' puliti automaticamente dal sistema operativo quando un'applicazione si chiude. Nella tua risposta sarebbe bello se tu potessi specificare il SO/risorsa e preferibilmente un link ad alcuni documenti (se appropriato).

L'ovvia:

di memoria: Sì ripulito automaticamente. Domanda. Ci sono delle eccezioni?

+0

cosa ne dici di un contro-esempio per darci un'idea di che tipo di cosa stai cercando? – skaffman

+0

Risorse complesse. Come servizi (ad esempio un DB). –

+0

I servizi in genere non appartengono ai processi. –

risposta

4

Ci sono alcune risorse oscuri che Windows non pulire quando un app si blocca o si esce senza esplicitarle, soprattutto perché il sistema operativo non sa se è importante lasciarlo in giro o meno.

  1. File temporanei - come altri hanno menzionato.
  2. Globalmente registrato WNDCLASS es ("Nessuna classe di finestra registrata da una DLL viene annullata quando la DLL viene scaricata. Una DLL deve annullare esplicitamente le sue classi quando viene scaricata." MSDN) Se la classe della finestra globale ha anche una classe DC, allora anche quella DC colerà.
  3. Globale ATOM s (una risorsa relativamente limitata).
  4. ID messaggio finestra creato con RegisterWindowMessage.Questi sono progettati per perdite, dal momento che non c'è UnregisterWindowMessage.
  5. Semafori ed eventi non sono trapelati tecnicamente, ma quando l'applicazione proprietaria va via senza segnalarli, allora altri processi possono bloccarsi. Questo non è vero per un Mutex. Se l'applicazione proprietaria scompare, vengono rilasciati altri processi in attesa su quel Mutex.
  6. Potrebbe esserci qualche stranezza residua su Windows XP e precedenti se non si annulla la registrazione di hot key prima di uscire. Altre applicazioni potrebbero non essere in grado di registrare lo stesso tasto di scelta rapida.
  7. Su Windows XP e versioni precedenti, non è raro avere una finestra della console zombi in diretta dopo un arresto anomalo del processo. (In particolare, un'applicazione GUI che crea anche una finestra della console.) Viene visualizzata nella barra delle applicazioni. Tutto quello che puoi fare è minimizzare, ripristinare o spostare la finestra.
  8. I driver Buggy possono essere aggravati dalle app che non rilasciano esplicitamente risorse quando escono. Le perdite di pool non di paging sono abbastanza comuni.
  9. Dati copiati negli Appunti. Immagino che in realtà non conti perché è posseduto dal sistema operativo in quel momento, non dall'applicazione che lo ha messo lì.
  10. Gli hook installati a livello globale non vengono scaricati quando il processo di installazione si interrompe prima di rimuovere il gancio.
3

Qualsiasi eccezione è un errore: le applicazioni possono bloccarsi e contenere perdite. Un sistema operativo deve essere affidabile e non esaurire le risorse anche di fronte a applicazioni scritte male. Questo vale anche per le risorse non del sistema operativo. I servizi che distribuiscono le risorse ai processi hanno bisogno di liberare quelle risorse quando il processo termina. Se non lo fanno è un bug che deve essere risolto.

Se siete alla ricerca di manufatti di programma che può persistere al di là di uscita del processo, in Windows hai almeno:

  • chiavi di registro che vengono creati senza REG_OPTION_VOLATILE
  • I file creati senza FILE_FLAG_DELETE_ON_CLOSE
  • Voci del registro eventi
  • Carta utilizzata per lavori di stampa
+1

Sì, questo è l'ideale. Ma non tutte le risorse sono di proprietà del sistema operativo. –

+0

@Martin: il tuo titolo indica le risorse del sistema operativo :) Anche in questo caso, è un errore nel componente o nel servizio che ha assegnato la risorsa. – Michael

+0

Quali risorse non sono di proprietà del sistema operativo? –

3

In Windows, quasi tutto ciò che è possibile gestire, dovrebbe essere gestito dal sistema operativo. Ecco perché si ottiene solo un handle. Questo include, ma non è limitato tom seguente (lista copiata da documentazione MSDN per CloseHandle() API):

Communications device 
Console input 
Console screen buffer 
Event 
File 
File mapping 
Job 
Mailslot 
Mutex 
Named pipe 
Process 
Semaphore 
Socket 
Thread 
Token 

Tutti questi dovrebbero essere recuperato dal sistema operativo quando un'applicazione chiude, se forse non immediatamente, a seconda del loro utilizzo da parte di altri processi.

Altri sistemi operativi funzionano allo stesso modo. È difficile immaginare che un sistema operativo valga il suo nome (escludo sistemi embedded, ecc.) Dove non è questo il caso: la gestione delle risorse è la ragione d'essere numero 1 per un sistema operativo.

+0

Siamo in grado di concordare che qualsiasi cosa controllata tramite un handle sarà eventualmente rilasciata dal sistema operativo. –

+0

Dipende da cosa intendi per rilascio. Un processo arrestato non può contenere un Mutex (un altro processo in attesa sul Mutex diventerà proprietario di un WAIT_ABANDONED). Ma è diverso per un semaforo. Se un altro processo è in attesa, è bloccato. Se si uccide l'app sospesa, il sistema recupera l'oggetto Semaphore. –

+0

Ho un'app che, quando si blocca, lascia di routine una finestra console zombi (è un'app per Windows e crea anche una finestra della console). Devo riavviare periodicamente per pulirli tutti. –

3

File temporanei è un buon esempio di qualcosa che non essere ripulito - la maniglia viene rilasciata, ma il file non viene eliminato

+0

Un buon punto. Ma i file temporanei sono come lavori di stampa eccezionali: il sistema operativo semplicemente non dispone delle informazioni necessarie per decidere se eliminare immediatamente un processo. Ma a un certo punto verranno tutti raccolti/cancellati/scaricati/eliminati. –

+0

Si potrebbe obiettare che alla fine tutto sarà pulito. Il problema è che la disordinata dislocazione delle risorse può portare ad altri problemi. In questo caso potremmo esaurire lo spazio disponibile nel file system fino a quando i file non verranno ripetuti da processi più puliti. –

+0

Ma ovviamente non è il caso che un processo debba cancellare i suoi file temporanei (o che il sistema operativo dovrebbe). Considera i file di backup del tuo word processor - non vuoi perderli quando il panico di Word (o qualsiasi altra cosa). –

Problemi correlati