46 votes

Quel est l'algorithme derrière sleep ()?

Maintenant, il y a quelque chose que je me suis toujours demandé: comment est-sleep() mis en œuvre ?

Si il est tout au sujet de l'utilisation d'une API de l'OS, alors comment est l'API fait ?

Il ne se résument toutes à l'aide de machines spéciales-code sur le CPU ? N'est que le CPU besoin d'un co-processeur ou d'autres gizmo sans laquelle vous ne pouvez pas avoir du mal à dormir() ?

Le plus connu incarnation de sleep() est dans C (pour être plus précis, dans les bibliothèques qui viennent avec les compilateurs C, tels que GNU libc), bien que presque toutes les langues d'aujourd'hui a son équivalent, mais la mise en œuvre de sommeil dans certaines langues (pensez Bash) n'est pas ce que nous cherchons à cette question...

EDIT: Après avoir lu certaines réponses, je vois que le processus est placé dans une file d'attente. À partir de là, je peux deviner deux alternatives, soit

  1. un minuteur est réglé de telle sorte que le noyau se réveille le processus dans le temps, ou
  2. chaque fois que le noyau est permis à une tranche de temps, il interroge l'horloge pour vérifier si il est temps de se réveiller d'un processus.

Les réponses de ne mentionner que la variante 1. Donc, je pose la question: comment est-ce minuteur se comporter ? Si c'est une simple interruption pour rendre le noyau réveiller le processus, comment le noyau de demander la minuterie à "wake me up en 140 millisecondes si je peux mettre le processus en cours d'exécution" ?

43voto

Arkadiy Points 10567

La "mise à jour" à la question montre une incompréhension de la façon dont systèmes d'exploitation modernes de travail.

Le noyau n'est pas "autorisé" une tranche de temps. Le noyau est la chose qui donne de tranches de temps pour les processus utilisateur. Le "timer" n'est pas défini pour réveiller le processus du sommeil - il réglé pour arrêter le processus en cours d'exécution.

En essence, le noyau tente de distribuer assez le temps de calcul par l'arrêt des processus qui sont sur le CPU trop longtemps. Pour une image simplifiée, disons qu'aucun processus n'est autorisé à utiliser le PROCESSEUR de plus de 2 millisecondes. Ainsi, le noyau devrait régler le minuteur de 2 millisecondes, et de laisser le processus d'exécution. Lorsque le timer déclenche une interruption, le noyau prend le contrôle. Il enregistre les processus en cours d'exécution' état actuel (registres, pointeur d'instruction et ainsi de suite), et le contrôle n'est pas retournée. Au lieu de cela, un autre processus est choisi à partir de la liste des processus en attente d'être CPU donnée, ainsi que le processus a été interrompu va à l'arrière de la file d'attente.

Le processus du sommeil est tout simplement pas dans la file d'attente de choses en attente pour le CPU. Au lieu de cela, il est stocké dans la file d'attente de couchage. Chaque fois que le noyau devient minuterie d'interruption, le sommeil de la file d'attente est vérifiée, et les processus dont le temps viennent d'être transféré à "en attente du PROCESSEUR" file d'attente.

C'est, bien sûr, une grossière simplification. Il prend très à des algorithmes sophistiqués pour assurer la sécurité, l'équité, l'équilibre, la priorité, de prévenir la famine, de tout faire rapidement et avec un minimum de quantité de mémoire utilisée pour les données du noyau.

36voto

Mark Harrison Points 77152

Il y a un noyau de la structure de données appelée le sommeil de la file d'attente. C'est une priorité de la file d'attente. Chaque fois qu'un processus est ajouté à la file d'attente, le délai d'expiration de la plus-bientôt-à-être-éveillé processus est calculé, et une minuterie est réglée. À l'époque, l'emploi expiré est retiré de la file d'attente et le processus reprend l'exécution.

(amusante anecdote: dans les anciennes implémentations unix, il y avait une file d'attente pour les processus pour lesquels fork() a été appelé, mais pour lesquels le processus de l'enfant n'avait pas été créé. Il est bien sûr appelé à la fourche de la file d'attente.)

HTH!

16voto

bog Points 1160

Peut-être le principal travail d'un système d'exploitation est de cacher la complexité d'un véritable morceau de matériel à partir de l'application de l'écrivain. Par conséquent, toute description de la façon dont le système d'exploitation fonctionne court le risque d'être vraiment compliqué, vraiment rapide. En conséquence, je ne vais pas traiter toutes les "et si ... " et oui mais" que d'un véritable système d'exploitation, les besoins à traiter. Je vais juste décrire, à un haut niveau conceptuel, ce qui est un processus, ce que le planificateur, comment la minuterie de la file d'attente de travaux. Espérons que cela est utile.

Qu'est ce qu'un processus:

Pensez à un processus--parlons simplement sur les processus, et d'obtenir des fils plus tard, comme "la chose du système d'exploitation annexes". Un processus a une ID--pensez à un nombre entier, et vous pouvez penser que les entier comme un index dans une table contenant tout le contexte de ce processus.

Le contexte est le matériel de l'information-registres, la mémoire, l'unité de gestion de contenu, d'autres matériels de l'état, qui, lorsqu'il est chargé dans la machine, permettra le processus de "go". Il y a d'autres composants dans le contexte: les listes de fichiers ouverts, état des gestionnaires de signaux, et, le plus important ici, les choses le processus est en attente pour.

Les processus de passer beaucoup de temps à dormir (un.k.un. d'attente)

Un processus de passe le plus clair de son temps à attendre. Par exemple, un processus qui lit ou écrit sur le disque dur de passer beaucoup de temps à attendre pour que les données arrivent ou être reconnu pour être sur le disque. OS des gens utilisent les termes "en attente" et "sommeil" (et "bloqué") un peu de façon interchangeable--tous les sens que le processus est en attente de quelque chose à faire avant qu'il puisse continuer son petit bonhomme de chemin. Il est juste confus que le système d'exploitation de l'API sleep() qui arrive à utiliser l'OS sous-jacent des mécanismes pour dormir processus.

Les processus peuvent être en attente pour d'autres choses: les paquets réseau à arriver, la fenêtre de sélection des événements, ou un timer expire, par exemple.

Des processus et de la Planification

Les processus qui sont en attente sont dites non-exécutable. Ils ne vont pas sur la file d'attente d'exécution du système d'exploitation. Mais lorsque l'événement survient, le processus est en attente pour les, il provoque le système d'exploitation pour déplacer le processus de la non-exécutables à l'état exécutable. Dans le même temps, le système d'exploitation met le processus de la file d'attente d'exécution, qui n'est vraiment pas une file d'attente, il est plus d'une pile de tous les processus, le système d'exploitation de décider de le faire, pourrait exécuter.

La planification:

le système d'exploitation décide, à intervalles réguliers, les processus qui doit s'exécuter. L'algorithme par lequel le système d'exploitation décide de le faire est appelé, un peu sans surprise, l'algorithme d'ordonnancement. Algorithmes de planification de la gamme de morts-simple ("tout le monde apprend à fonctionner pendant 10 ms, et puis le gars à côté, sur la file d'attente arrive à exécuter") est beaucoup plus compliqué (en tenant compte de la priorité du processus, de la fréquence d'exécution, d'exécution les délais, inter-processus de dépendances, enchaînés les serrures et toutes sortes d'autres compliqué objet).

La Minuterie De La File D'Attente Un ordinateur dispose d'une minuterie à l'intérieur. Il existe de nombreuses façons cela peut être mis en œuvre, mais la manière classique est appelée un minuteur périodique. Un minuteur périodique des tiques, à intervalle régulier--dans la plupart des systèmes d'exploitation d'aujourd'hui, je crois que ce taux est de 100 fois par seconde--100 Hz--toutes les 10 millisecondes. Je vais utiliser cette valeur dans ce qui suit, comme le béton, mais sachez que la plupart des systèmes d'exploitation en valeur leur sel peut être configuré avec les différentes espèces de tiques--et beaucoup de ne pas utiliser ce mécanisme et peut fournir beaucoup mieux minuterie de précision. Mais je m'égare.

Chaque tick entraîne une interruption du système d'exploitation.

Lorsque le système d'exploitation gère ce timer interrupt, il incrémente son idée de système de temps de 10 ms. Puis, il regarde la file d'attente du minuteur et décide des événements de cette file d'attente doivent être traitées.

La minuterie de la file d'attente vraiment est une file d'attente de "choses qui doivent être traitées", que nous appellerons des événements. Cette file d'attente est commandé par le temps de l'expiration, la plus proche des événements de la première.

Un "événement" peut être quelque chose comme, "processus d'éveil X", ou "aller à coup de pied d'I/O disque là-bas, car il peut-être coincée", ou "envoyer un paquet persistant sur que fibrechannel lien là-bas". Quel que soit le système d'exploitation a besoin de l'avoir fait.

Lorsque vous avez une file d'attente ordonnée de cette façon, il est facile de gérer la file d'attente. L'OS a tout simplement l'air à la tête de la file d'attente, et décrémente le "moment d'expiration" de l'événement, de 10 ms à chaque tick. Lorsque le délai d'expiration arrive à zéro, le système d'exploitation retire cet événement, et en fait ce qui est demandé.

Dans le cas d'un processus en mode veille, il fait tout simplement le processus de nouveau praticable.

Simple, hein?

9voto

Nir Points 18250

Un système d'exploitation multitâche est un composant appelé un planificateur de tâches, ce composant est responsable de donner de temps PROCESSEUR pour les threads, l'appel de sommeil raconte l'OS de ne pas donner de temps PROCESSEUR pour ce fil de discussion pour un certain temps.

voir http://en.wikipedia.org/wiki/Process_states pour plus de détails.

8voto

Jeffrey L Whitledge Points 27574

Je ne sais rien à propos de Linux, mais je peux vous dire ce qui se passe sur Windows.

Sleep() provoque le processus de la tranche de temps à mettre fin immédiatement à revenir au système d'exploitation. L'OS puis définit une minuterie noyau objet signalé après l'écoulement du temps. Le système d'exploitation ne sera pas donner à ce processus plus de temps jusqu'à ce que le noyau de l'objet devient signalé. Même alors, si d'autres processus ont supérieure ou égale priorité, il peut encore attendre un peu avant de laisser le processus se poursuivre.

Spécial CPU de la machine code est utilisé par l'OS pour faire le processus de commutation. Ces fonctions ne sont pas accessibles par l'utilisateur en mode code, de sorte qu'ils sont strictement accessible par les appels de l'API dans l'OS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X