Pourquoi un programme utilisateur devrait-il jouer avec l'espace du noyau?

9

Je ne sais même pas quel est le problème, mais je parle de l'attaque du noyau décrite ici . En bas de cette liste de commentaires, quelqu'un a demandé de revoir le processus. L'astuce n'a pas amélioré la situation (la machine fonctionne toujours de manière très lente) et le commentaire de réponse dit quelque chose sur l'espace noyau vs l'espace utilisateur.

Tout d'abord, le commentaire de réponse est-il correct? Si oui, pourquoi Renice fonctionne-t-il pour les choses dans l'espace utilisateur et non pour les choses dans l'espace noyau? De plus, d'après ce que j'ai lu , tous les programmes qu'un utilisateur démarre lui-même devraient être dans l'espace utilisateur, qu'est-ce que j'ai raté?

Si elle est incorrecte, alors pourquoi ne pas reice améliorer la situation?

phunehehe
la source

Réponses:

9

Il existe des services qu'un noyau fournit à l'espace utilisateur (comme l'ouverture de sockets). Il existe une interface bien définie (API) grâce à laquelle les programmes de l'espace utilisateur peuvent interagir avec le noyau.

Dans ce cas, le programme de l'espace utilisateur ouvre à plusieurs reprises des sockets et envoie des descripteurs de fichiers à travers eux, puis ferme les sockets. Ces actions sont effectuées par le noyau. Il conservera le descripteur de fichier dans un tampon jusqu'à ce que l'autre extrémité du socket le lise. Le bogue particulier est qu'un garbage collector devrait éventuellement libérer le descripteur de fichier, mais ce n'est pas le cas - le fd est divulgué. Les fds divulgués s'additionnent et restent là à consommer des ressources. Tuer le programme ne libère pas les ressources car elles n'appartiennent pas au programme.

Shawn J. Goff
la source
6
Et la raison pour laquelle renice n'aide pas, c'est que cela n'affecte que la part du temps CPU d'un utilisateur. Le temps passé en mode noyau n'est pas comptabilisé à cet effet. De manière générale, nice n'affecte que les programmes liés au CPU, pas les programmes liés aux IO. Ici, le processus d'emballement est purement IO, et il n'effectue même pas autant d'appels système car le bug est que chaque appel système prend beaucoup trop de temps.
Gilles 'SO- arrête d'être méchant'
1
@Gilles Désolé d'avoir touché un problème aussi ancien, mais il semble très intéressant! Est-ce que je comprends bien, que quelque chose comme ioniceça ferait plus de bien?
rozcietrzewiacz
@rozcietrzewiacz Je ne pense pas que l'ionice aiderait non plus, mais je ne suis pas sûr. En raison du bogue, le processus passe tout son temps dans un seul appel système, et ionice ne l'empêchera pas (je pense).
Gilles 'SO- arrête d'être méchant'