Tuer un processus est-il toujours considéré comme mauvais pour la gestion de la mémoire?

18

J'ai donc une petite discussion avec mon patron sur la gestion de la mémoire.

On m'a dit que tuer un processus ne lui permet pas de désallouer la mémoire. Est-ce toujours le cas, ou était-ce il y a des années?

Nous parlons à la fois de Windows et d'OS X ici.

Jeff
la source
4
Question valide; voter pour rouvrir. Le PO a demandé des informations spécifiques sur le comportement du système d'exploitation (2 systèmes d'exploitation dans ce cas), et non sur des spéculations ou des débats.
JRobert
Wow, je n'ai jamais pensé que cette question attirerait autant d'attention aussi vite .. :) Mais oui, c'était essentiellement une question "oui / non, parce que ...".
Jeff

Réponses:

7

Cela fait longtemps que j'ai appris ce truc, mais c'est parti.

Lorsqu'un système d'exploitation lance un processus, il lui affecte des pages à partir de la table de mémoire virtuelle. Le système d'exploitation est responsable du maintien d'une carte de la table de mémoire virtuelle à la mémoire réelle ou à l'espace de swap sur le disque. Lorsqu'un processus est tué, le système d'exploitation ne cesse de lui donner des cycles de processeur. Il effectue quelques opérations de nettoyage, dont l'une consiste à marquer toutes ses pages mémoire comme libres. Cela leur permet d'être réutilisés par d'autres applications. Le système d'exploitation nettoiera probablement également tous les descripteurs de ressources du processus, fermant automatiquement les fichiers, les connexions réseau, les canaux de processus à processus, etc. Ce processus est entièrement sous le contrôle de l'OS, et ces étapes vont être prises quelle que soit la façon dont le processus est mort.

Gardez à l'esprit que tout cela s'applique aux processus du système d'exploitation. Si vous avez une sorte de machine virtuelle et qu'elle exécute plusieurs processus virtuels à la fois, la machine virtuelle est responsable de décider comment leur allouer et leur désallouer. Du système d'exploitation, cependant, cela ressemble toujours à un processus. Donc, dans ce cas, si vous avez une machine virtuelle qui exécute plusieurs processus et que vous en tuez un au sein de la machine virtuelle, vous ne récupérerez probablement pas immédiatement la mémoire dans le système d'exploitation hôte. Mais vous le récupérerez dans la VM. Si vous tuez la machine virtuelle dans le système d'exploitation, cependant, le système d'exploitation va tuer la machine virtuelle (qui tue indirectement les processus de la machine virtuelle) et récupérer toute la mémoire (qui n'aura pas besoin de passer par un garbage collector, free () , supprimer ou toute autre chose).

Hautement spéculatif:

Si .NET s'exécute en tant que machine virtuelle avec plus d'une application .NET sur la même machine virtuelle, alors .NET pourrait conserver la mémoire qui n'est pas encore GCd, jusqu'à ce qu'il exécute le GC, et Windows penserait que .NET est en utilisant plus qu'il ne l'est vraiment. (Et si MS était vraiment glissant, Windows pourrait alors dire .NET au GC dans les situations de mémoire restreinte, mais cela ne sert à rien car c'est à cela que sert l'espace de permutation de disque.)

Si .NET fonctionnait de cette façon, le système d'exploitation le considérerait toujours comme un processus à des fins de système d'exploitation, qui prend la responsabilité de décider quoi conserver et quoi jeter, et ce n'est généralement pas le problème de Windows de dire à un processus dont il a besoin pour commencer à désallouer la mémoire. À ce stade, il est concevable que MS construise une API spéciale uniquement pour .NET afin que les processus .NET ressemblent aux processus Windows, sauf qu'ils ne le sont pas, c'est pourquoi les gens pourraient penser que la mémoire du processus n'était pas désallouée. C'est vraiment; c'est juste que vous regardez le mauvais processus.

Je ne connais pas suffisamment le .NET pour dire qu'il fonctionne réellement de cette façon; la machine virtuelle Java ne le fait certainement pas.

Fin des spéculations.

EDIT: en ce qui concerne la destruction d'un processus mauvais pour la gestion de la mémoire, cela nécessite que plusieurs processus soient alloués à partir du même pool (c'est-à-dire qu'ils ressemblent plus à des threads qu'à des processus réels) et que la mémoire ne soit pas libérée après la fin du processus. tué. Cela nécessiterait presque un système multitâche coopératif, car la mémoire virtuelle et le multitâche préemptif étaient, à ma connaissance, généralement implémentés ensemble (la machine virtuelle permettant d'isoler les processus les uns des autres et de les empêcher de piétiner dans la mémoire de l'autre). Avoir de la mémoire virtuelle, il est trivial de nettoyer après un processus au niveau du système d'exploitation; vous venez de déplacer toutes les pages du pool du processus vers le pool gratuit.

jprete
la source
Excellente réponse; toujours affiché le mien car vous n'aviez que quelques secondes d'avance. :)
Simon Richter
8

Aucun problème d'après mon expérience, tuez-le.

Par exemple, si vous avez 4 Go de RAM, dont 3 Go sont utilisés par un jeu et que vous tuez le processus de jeu, vous pouvez redémarrer le jeu sans problème et il aura à nouveau 3 Go de RAM sur le processus.

Sirex
la source
d'accord, il semble correct qu'il ne serait pas en mesure de "nettoyer", mais je n'ai pas vu que c'était un problème comme l'a déclaré Sirex. Dans NT, ces processus étaient censés être séparés, mais même dans Win98, cela ne semblait pas être un problème. Si vous pouviez le tuer, la plupart disparaîtraient. Logiquement, on essaierait de fermer le système, ou de le fermer en premier, puis de le forcer à être tué comme la dernière chance qui lui est donnée.
Psycogeek
8

Les systèmes d'exploitation répertoriés dans les points d'interrogation (Windows et OS X) implémentent la mémoire virtuelle , où chaque processus dispose de son propre espace d'adressage, qui est ensuite mappé à la mémoire physique par le système d'exploitation. Ces tables de mappage sont utilisées pour nettoyer les allocations de mémoire à la fin d'un processus, de sorte que la mémoire est complètement libérée. Les pages physiques peuvent être partagées entre plusieurs processus, auquel cas elles sont libérées lorsqu'il n'y a plus d'utilisateurs.

En règle générale, d'autres ressources telles que les descripteurs de fichiers sont attribuées aux processus sous la forme de capacités , où le processus reçoit un descripteur sur la ressource et la manipule via des fonctions d'accès bien définies. Le système d'exploitation conserve un mappage de table de la valeur du handle vers l'objet dans le noyau fournissant la fonction; encore une fois, cette table peut être utilisée pour le nettoyage lorsqu'un processus est terminé.

Il existe des ressources spéciales qui survivent au processus qui les a créées, par exemple, il est possible de créer des allocations de mémoire partagée nommées persistantes qui peuvent être utilisées dans la communication interprocessus. Celles-ci sont rarement utilisées, précisément parce que le système d'exploitation ne peut pas déterminer si elles sont toujours nécessaires.

Dans d'autres systèmes d'exploitation, il n'y a parfois pas de séparation claire des processus; cela place le fardeau du nettoyage sur les applications individuelles.

La fermeture forcée d'un processus mettra fin au processus sans lui donner la moindre chance de se nettoyer; si le système d'exploitation a une liste complète de toutes les ressources, cela n'a aucun effet négatif.

Simon Richter
la source
5

C'était à la veille de l'implémentation généralisée de la gestion de la mémoire. De nos jours, la seule mémoire que vous pourriez manquer est la mémoire utilisée par les pilotes et les modules du noyau qui restent non qualifiés ou zombiés, mais ce sont vraiment des arachides.

zoomix
la source