web-dev-qa-db-fra.com

appel système et changement de contexte

Je suis désolé de poser cette question alors qu'elle a déjà été posée, mais je n'ai pas pu obtenir de clarté de leur part. Je pose donc les questions connexes suivantes pour faire la différence entre l'appel système (mode-switch) et le changement de contexte

  • Pourquoi dit-on que l'appel système ne nécessite pas de changement de contexte lorsque le contexte du processus qui fait l'appel doit être enregistré puis rechargé. Est-ce simplement parce que, selon la définition du changement de contexte, un changement doit être effectué vers un autre processus.

  • Qu'est-ce que cela signifie que lorsqu'un appel système est effectué, le noyau s'exécute dans le "contexte utilisateur".

  • Selon l'article de wikipedia: http://en.wikipedia.org/wiki/Context_switch

un changement de contexte n'est pas nécessaire pour l'appel système mais il dépend du système d'exploitation et un changement de contexte peut se produire pendant un appel système. Je me demande ce qui se passerait dans le cas où le changement de contexte a lieu au moment de l'appel système. Des exemples?

41
vjain27

Vous devez comprendre qu'un contexte de thread/processus a plusieurs parties, une, directement associée à l'exécution et est conservée dans la CPU et certaines tables système en mémoire que la CPU utilise (par exemple les tables de pages), et l'autre, qui est nécessaire pour le système d'exploitation, pour la comptabilité (pensez aux différents ID, poignées, autorisations spéciales spécifiques au système d'exploitation, connexions réseau, etc.).

Un changement de contexte complet impliquerait d'échanger les deux, l'ancien thread/processus actuel disparaît pendant un certain temps et le nouveau thread/processus actuel entre pendant un certain temps. C'est l'essence même de la planification des threads/processus.

Maintenant, les appels système sont très différents de w.r.t. L'une et l'autre.

Considérez quelque chose de simple, par exemple, l'appel système pour demander la date et l'heure actuelles. Le processeur passe du mode utilisateur au mode noyau, en préservant les valeurs de registre en mode utilisateur, exécute du code noyau pour obtenir les données nécessaires, les stocke soit dans la mémoire, soit dans les registres auxquels l'appelant peut accéder, restaure les valeurs de registre en mode utilisateur et Retour. Il n'y a pas beaucoup de changement de contexte ici, seulement ce qui est nécessaire pour la transition entre les modes, l'utilisateur et le noyau.

Considérons maintenant un appel système qui implique le blocage de l'appelant jusqu'à un certain événement ou la disponibilité des données. La manipulation de mutex et la lecture de fichiers seraient des exemples de tels appels système. Dans ce cas, le noyau est obligé d'enregistrer le contexte complet de l'appelant, de le marquer comme bloqué afin que le planificateur ne puisse pas l'exécuter jusqu'à ce que cet événement ou ces données arrivent, et de charger le contexte d'un autre thread/processus prêt, afin qu'il puisse s'exécuter .

C'est ainsi que les appels système sont liés aux changements de contexte.

L'exécution du noyau dans le contexte d'un utilisateur ou d'un processus signifie que chaque fois que le noyau fonctionne pour le compte d'un certain processus ou utilisateur, il doit prendre en considération le contexte de cet utilisateur/processus, par ex. le processus/thread/ID utilisateur actuel, le répertoire actuel, les paramètres régionaux, les autorisations d'accès pour diverses ressources (par exemple les fichiers), tout ce qui peut être différent entre les différents processus/threads/utilisateurs.

Si les processus ont des espaces d'adressage individuels, les espaces d'adressage font également partie du contexte du processus. Ainsi, lorsque le noyau a besoin d'accéder à la mémoire d'un processus (pour lire/écrire des données de fichier ou des paquets réseau), il doit avoir accès à l'espace d'adressage du processus, IOW, il doit être dans son contexte (il ne signifie, cependant, que le noyau doit charger le contexte complet juste pour accéder à la mémoire dans un espace d'adressage spécifique).

Est-ce que c'est utile?

74
Alexey Frunze