Est-ce que la planification coopérative suspend les processus lorsqu'ils effectuent une opération d'E / S?

cs.stackexchange https://cs.stackexchange.com/questions/5

Question

De nombreux systèmes d'exploitation références disent qu'avec coopérative (par opposition à préemptive) multi-tâches, un processus maintient la CPU jusqu'à ce qu'il se suspend explicitement volontairement. Si un processus en cours d'exécution exécute une demande d'E / S qui ne peut pas être immédiatement satisfaite (par exemple, demande un coup clé qui ne sont pas encore disponibles), ne l'ordonnanceur suspend, ou faut-il vraiment garder l'unité centrale de traitement jusqu'à ce que la demande peut être réparé?

[Modifié pour remplacer "blocs sur i / o" avec "Réalise une E / S demande qui ne peut pas être immédiatement satisfait."]

Était-ce utile?

La solution

Dans un cadre vraiment « coopératif », et s'il n'y avait pas de protection matérielle, un processus pourrait certainement bloquer sur les E / S et non le contrôle se dessaisir jusqu'à ce que le E / S a été fait (ou jamais le contrôle se dessaisir du tout). Par exemple, Windows 3.1 est ainsi: si un seul processus utilisateur a voulu prendre en charge l'ensemble de l'ordinateur, et d'empêcher toute autre chose de courir, il pourrait.

Mais sur un système avec multi-tâches que vous attendez l'API du système des commandes d'E / S de commande se dessaisir du processeur quand ils sont appelés. Alors, quand un des blocs de processus en cours d'exécution sur les E / S, en supposant que le processus utilise les API normal du système, d'autres processus seront autorisés à fonctionner jusqu'à ce que le E / S est terminée, et éventuellement le processus initial reprendra une fois que le E / S est fait . En d'autres termes, appeler une fonction E / S de blocage est une façon qu'un processus sur un système coopératif peut volontairement se suspendre.

Autres conseils

  

Si un des blocs qui se passe sur i / o

Blocage sur IO est à peu près équivalent à suspendre votre processus. Dans le contexte du noyau linux, exécuter certains appels système IO tels que read() provoquera un sysenter ou le gestionnaire d'interruption de déclenchement pour regarder après IO, appelant do_sys_read() en fin de compte. Ici, si la demande actuelle ne peut pas être satisfaite immédiatement, la fonction appelle sched() qui peut alors exécuter un autre processus.

Dans le cadre d'un système coopératif, j'attendre à ce que lorsque vous faites un appel système pour une raison quelconque IO, si la demande ne peut être satisfaite des choix du noyau une autre tâche et l'exécute. Ce document fournit des renseignements généraux - en gros, si vous avez attendu sur IO, vous pourriez être fixé au mur attendant toujours que pour IO. L'idée de la planification coopérative étant que vous appelez fréquemment sched() ou la méthode equvalent se dessaisir-la-cpu, se faisant des tâches gourmandes en temps processeur.

Considérations en mode noyau deviennent plus intéressantes. Sur les architectures où ils sont disponibles tels que certaines plates-formes embarquées , les gestionnaires d'interruptions seront toujours invoquées en réponse aux interruptions matérielles ou logicielles. Il est généralement possible, la mise en œuvre sage, désactiver interrupt manipulation , mais qui a aussi des inconvénients.

Dans la planification coopérative (de préférence cooperative multitasking) modèle, il n'y a pas de concept d'un planificateur dans un sens que le système d'exploitation n'a pas de contrôle de la durée du parcours du processus.

Une demande programmée donnerait volontairement correctement la CPU sur E / S. Mais, les applications mal écrites pourraient simplement continuer à attendre sur les E / S, bloquant ainsi d'autres processus.

PS:. Cette approche a ensuite été donnée par la plupart des systèmes d'exploitation en faveur de préemptive-ordonnancement (qui avait un programmateur externe) et nous avons maintenant toutes sortes de différents algorithmes de planification utilisés par différents OS

EDIT: Ma réponse a été basée sur la programmation comme décrit dans sa forme originale (il y a quelques années: P). Comme Gilles a commenté certains systèmes utilisent encore la planification coopérative. Et il y a un programmateur. Je ne sais pas si ces systèmes utilisent COS dans sa forme pure et originale.

multi-tâches coopérative implique un contexte d'exécution doit explicitement céder le contrôle au planificateur, et si elle le souhaite, peut empêcher un changement de contexte de se produire.

La plupart des implémentations exécutent explicitement un changement de contexte pour tout appel système qui ne, et souvent revient pas rapidement, même si elles le font, pour accroître l'équité dans l'allocation du processeur.

En général, il est seulement possible pour les processus ayant échoué (ou intentionnellement refuser le service au reste du système) pour éviter les tâches fréquentes commutations.

Préemption, comme l'explique Gilles, est une limitation de l'architecture du système qui empêche chronométré interruption de la tâche active et le contexte forcé les commutateurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top