Question

Juste curieux. Comment fonctionne réellement le sommeil de la fonction () travail (déclarée dans windows.h)? Peut-être pas seulement que la mise en œuvre, mais tout le monde. Avec ce que je veux dire - comment est-il mis en œuvre? Comment peut-il rendre le code « stop » pendant un certain temps? Aussi curieux sur la façon dont cin >> et ceux qui sont effectivement travail . Que font-ils exactement?

La seule façon que je sais comment quelque chose « bloc » de continuer à exécuter est une boucle while, mais étant donné que cela prend une énorme quantité de puissance de traitement par rapport à ce qui se passe lorsque vous invoquer des méthodes pour lire de stdin (comparer juste un certain temps (vrai) à une lecture de stdin), je suppose que ce n'est pas ce qu'ils font.

Était-ce utile?

La solution

Le système d'exploitation utilise un mécanisme appelé un planificateur de garder tous les threads ou processus, il est bien gérer se comporter ensemble.

plusieurs fois par seconde, l'horloge matérielle de votre ordinateur interrompt la CPU, ce qui provoque le planificateur du système d'exploitation pour devenir activé. Le planificateur examinera ensuite tous les processus qui sont en train de courir et décide que l'on obtient à courir pour la tranche de temps suivante.

Les différentes choses qu'il utilise pour décider dépendent de chaque état des processus, et combien de temps il a eu avant. Donc, si le processus actuel a été en utilisant la CPU fortement, ce qui empêche les autres processus de faire des progrès, il fera le processus actuel d'attente et des swaps dans un autre processus afin qu'il puisse faire un travail.

Le plus souvent, cependant, la plupart des processus vont être dans un état d'attente. Par exemple, si un processus est en attente d'entrée de la console, le système d'exploitation peut regarder les informations sur les processus et voir quels ports io son attente pour. Il peut vérifier ces ports pour voir si elles ont des données pour le processus de travailler. Si elles le font, il peut commencer le processus de nouveau, mais s'il n'y a pas de données, alors ce processus se sautée pour la tranche de temps en cours.

comme pour sleep(), tout processus peut notifier à l'OS qu'il souhaite attendre pendant un certain temps. Le planificateur sera alors activé même avant une interruption matérielle (qui est aussi ce qui se passe lorsqu'un processus essaie de faire un blocage lecture d'un flux qui n'a pas de données prêt à être lu,) et le système d'exploitation fait une note de ce que le processus est attendre. Pour un sommeil, le processus est en attente d'une alarme se déclenche, ou il peut juste donner à nouveau chaque fois qu'il est redémarré jusqu'à ce que le délai est écoulé.

Étant donné que le système d'exploitation reprend uniquement les processus après quelque chose provoque à préempter un processus en cours, tels que le processus qui donne ou l'interruption de l'horloge matérielle je l'ai mentionné, sleep() est pas très précis, la précision dépend du système d'exploitation ou de matériel, mais il est généralement de l'ordre d'un ou plusieurs millisecondes.

Si une plus grande précision est nécessaire, ou très court temps d'attente, la seule option est d'utiliser la boucle chargée de construire vous avez mentionné.

Autres conseils

Les horaires du système d'exploitation comment les processus exécuté (quels processus sont admissibles à courir, dans quel ordre, ...). Sleep() émet probablement un appel système qui indique au noyau « ne me laissez pas utiliser le processeur pour x millisecondes ».

En bref, Sleep () indique à l'OS d'ignorer le processus / thread pendant un certain temps.

« cin » utilise une tonne d'opérateurs surchargées. Le « >> », ce qui est généralement droit décalage de bits, est surchargée pour à peu près tous les types d'opérande de droite en C ++. Une fonction distincte est prévue pour chacun d'eux, qui se lit de la console et convertit l'entrée en quel que soit le type de variable que vous avez donné. Par exemple:

std::cin::operator>> (int &rhs);

Ce n'est pas vrai C ++ - Je n'ai pas travaillé avec des flux et la surcharge dans un certain temps, donc je ne me souviens pas du type de retour ou l'ordre exact des arguments. Néanmoins, cette fonction est appelée lorsque vous exécutez cin >> une variable entière.

La mise en œuvre exacte sous-jacente dépend du système d'exploitation.

La réponse dépend du système d'exploitation, mais d'une manière générale, le système d'exploitation soit les horaires d'autres code à exécuter ailleurs dans un autre thread, ou si elle a littéralement rien à faire, il obtient le CPU d'attendre jusqu'à ce qu'un événement matériel se produit , ce qui provoque la CPU pour accéder à un code appelé un gestionnaire d'interruption, qui peut alors décider quel code à exécuter.

Si vous êtes à la recherche d'une façon plus contrôlée de bloquer un fil / processus dans un programme multi-thread, un regard sur les sémaphores, mutex, CriticalSections et événements. Ce sont toutes des techniques utilisées pour bloquer un processus ou un fil (sans charger le CPU par l'intermédiaire d'une construction de temps).

Ils travaillent essentiellement hors d'un idiome d'attente / signal où le thread bloqué en attente et un autre des signaux de processus il pour lui dire de recommencer. Ceux-ci (au moins dans les fenêtres) peuvent également les délais d'attente, fournissant ainsi une fonctionnalité similaire à sleep ().

Au niveau bas, le système a une routine appelée le « planificateur » qui envoie les instructions de tous les programmes en cours d'exécution à l'unité centrale de traitement (s), ce qui les fait courir. Appels système comme « sommeil » et correspondre « usleep » aux instructions qui indiquent le planificateur à IGNORE ce fil ou d'un procédé pour un montant fixe de temps.

En ce qui concerne les flux de C, le « cin » cache la poignée réelle du fichier (stdin et stdout sont en fait ces poignées) vous accédez, et le « >> » opérateur pour elle cache les appels sous-jacents à lire et à écrire. Depuis sa mise en œuvre d'une interface peut être l'OS spécifique, mais faire sur le plan conceptuel, il est encore des choses comme printf et scanf sous le capot.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top