L'uccisione di un processo è ancora considerata negativa per la gestione della memoria?


18

Quindi sto discutendo con il mio capo della gestione della memoria.

Mi è stato detto che l'uccisione di un processo non gli consente di deallocare la memoria. È ancora così, o è successo anni fa?

Stiamo parlando di Windows e OS X qui.


4
Domanda valida; votare per riaprire. L'OP ha chiesto informazioni specifiche sul comportamento del sistema operativo (in questo caso 2 sistemi operativi), non sulla speculazione o sul dibattito.
JRobert,

Caspita, non avrei mai pensato che questa domanda avrebbe attirato così tanta attenzione così velocemente .. :) Ma sì, era fondamentalmente una domanda "sì / no, perché ...".
Jeff,

Risposte:


7

È da tanto che non imparo queste cose, ma qui va.

Quando un sistema operativo avvia un processo, gli assegna le pagine dalla tabella della memoria virtuale. Il sistema operativo è responsabile del mantenimento di una mappa dalla tabella della memoria virtuale alla memoria reale o allo spazio di scambio sul disco. Quando un processo viene interrotto, il sistema operativo non smette di fornire cicli CPU. Fa alcuni elementi di pulizia, uno dei quali è quello di contrassegnare tutte le sue pagine di memoria come libere. Ciò consente loro di essere riutilizzati da altre applicazioni. Il sistema operativo probabilmente pulirà anche qualsiasi handle di risorse presente nel processo, chiudendo automaticamente file, connessioni di rete, pipe da processo a processo e così via. Questo processo è interamente sotto il controllo del sistema operativo e questi passaggi verranno eseguiti indipendentemente dalla morte del processo.

Tenere presente che tutto ciò si applica ai processi del sistema operativo. Se si dispone di un qualche modo di macchina virtuale e si eseguono più processi virtuali contemporaneamente, la VM è responsabile della decisione su come allocare e deallocare a essi. Dal sistema operativo, tuttavia, sembra ancora un processo. Quindi, in questo caso, se si dispone di una macchina virtuale che esegue più processi e si uccide uno di essi all'interno della macchina virtuale, probabilmente non si recupererà immediatamente la memoria nel sistema operativo host. Ma lo riavrai nella VM. Se uccidi la VM all'interno del sistema operativo, tuttavia, il sistema operativo ucciderà la VM (che uccide indirettamente i processi della VM) e recupererà tutta la memoria (che non dovrà passare attraverso un Garbage Collector, free () , elimina o qualsiasi altra cosa).

Altamente speculativo:

Se .NET viene eseguito come una macchina virtuale con più di un'app .NET sulla stessa macchina virtuale, .NET potrebbe conservare la memoria che non è ancora GCd, fino a quando non esegue GC e Windows penserebbe che .NET sia usando più di quello che è realmente. (E se MS fosse davvero fluido, Windows avrebbe potuto dire a .NET a GC in situazioni di memoria ristretta, ma non ha quasi senso perché questo è lo spazio per lo scambio del disco.)

Se .NET funzionasse in quel modo, il sistema operativo lo considererebbe comunque un processo ai fini del sistema operativo, il che si assume la responsabilità di decidere cosa conservare e cosa buttare via, e normalmente non è un problema di Windows dire a un processo di cui ha bisogno per iniziare la deallocazione della memoria. A quel punto è ipotizzabile che MS costruisca un'API speciale solo per .NET in modo che i processi .NET sembrino processi Windows, tranne per il fatto che non lo sono, motivo per cui le persone potrebbero pensare che la memoria del processo non sia stata deallocata. È davvero; è solo che stai guardando il processo sbagliato.

Non so abbastanza su .NET per dire che funziona davvero in quel modo; la VM Java certamente no.

Fine della speculazione.

EDIT: per quanto riguarda l'uccisione di un processo che è dannoso per la gestione della memoria, che richiede più processi per allocare dallo stesso pool (cioè sono più simili a thread che processi reali) e per non liberare la memoria dopo che il processo è ucciso. Ciò richiederebbe quasi un sistema multitasking cooperativo, poiché la memoria virtuale e il multitasking preventivo sono stati, a mia conoscenza, di solito implementati insieme (la VM ha reso possibile isolare i processi gli uni dagli altri e impedire loro di calpestare la memoria dell'altro). Avere memoria virtuale rende banale la pulizia dopo un processo a livello di sistema operativo; basta spostare tutte le pagine dal pool del processo al pool gratuito.


Risposta eccellente; ho ancora pubblicato il mio perché eri solo pochi secondi avanti. :)
Simon Richter,

8

Nessun problema nella mia esperienza, uccidi.

Ad esempio, se si dispone di 4 GB di RAM, di cui 3 GB sono utilizzati da un gioco e si interrompe il processo di gioco, è possibile riavviare il gioco senza problemi e avrà di nuovo 3 GB di RAM sul processo.


d'accordo, sembra corretto che non sarebbe in grado di "ripulire", ma non ho visto che si tratta di un problema, come affermato da Sirex. In NT questi processi dovevano essere separati, ma anche in Win98 non sembrava essere un problema. Se potessi ucciderlo, la maggior parte sparirebbe. Logicamente si proverebbe a convincere il sistema a chiuderlo, oppure a chiuderlo prima, quindi a costringerlo a essere effettivamente ucciso come ultima possibilità.
Psycogeek,

8

I sistemi operativi elencati nei tag di domanda (Windows e OS X) implementano la memoria virtuale , in cui a ciascun processo viene assegnato il proprio spazio di indirizzi, che viene quindi mappato sulla memoria fisica dal sistema operativo. Queste tabelle di mapping vengono utilizzate per ripulire le allocazioni di memoria al termine di un processo, pertanto la memoria viene completamente liberata. Le pagine fisiche possono essere condivise tra più processi, nel qual caso vengono liberate quando non ci sono più utenti.

In genere, altre risorse come handle di file vengono fornite ai processi sotto forma di funzionalità , in cui il processo riceve un handle sulla risorsa e lo manipola attraverso funzioni di accesso ben definite. Il sistema operativo mantiene una mappatura della tabella dal valore handle all'oggetto nel kernel che fornisce la funzione; ancora una volta, questa tabella può essere utilizzata per la pulizia al termine di un processo.

Esistono risorse speciali che sopravvivono al processo che le ha create, ad esempio, è possibile creare allocazioni di memoria condivisa denominate persistenti che possono essere utilizzate nella comunicazione tra processi. Questi vengono usati raramente, proprio perché il sistema operativo non è in grado di determinare se sono ancora necessari.

In altri sistemi operativi, a volte non esiste una chiara separazione dei processi; questo pone l'onere della pulizia sulle singole applicazioni.

La chiusura forzata di un processo interromperà il processo senza dargli alcuna possibilità di ripulire; se il sistema operativo ha un elenco completo di tutte le risorse, ciò non ha effetti negativi.


5

Questo era il giorno prima che la gestione della memoria fosse ampiamente implementata. Al giorno d'oggi l'unica memoria che potresti perdere è la memoria utilizzata dai driver e dai moduli del kernel che rimangono non qualificati o zombi, ma in realtà sono le noccioline.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.