Processus Linux "ordonnancement"

Je l'ai vu écrit plusieurs fois que le programmateur Linux planifie les process. J'enseigne un cours sur la programmation multithread, et j'aimerais get ma terminologie. J'ai une chose que je voudrais dire à ce sujet (écrit ci-dessous), en espérant que quelqu'un peut m'aider à effacer les erreurs les plus flagrantes:

Ce n'est pas le process programmé par le planificateur, c'est le thread associé à ce process. Le process est simplement un set de segments de mappage de memory, et donc statique. Nous pouvons le voir clairement lorsque pthread_create() ou même clone() (la plupart du time, mais pas exactement la même chose), où un process a plusieurs threads, et ce sont ceux qui sont planifiés le PID = TID un), plutôt que d'un autre.Je suppose que l'ambiguïté est due au fait que tous les process ont au less un fil d'exécution.

Est-ce l'image correcte (bien que simplifiée)?

Essayez quelque chose comme ceci:


Tous les process commencent avec un seul thread, et peuvent créer plus, en utilisant pthread_create par exemple. (Tous les threads d'un process créés de cette façon partagent le même espace d'adressage.) Le planificateur du kernel fonctionne sur ces threads, qu'il s'agisse du thread principal / initial d'un process ou d'autres threads – il n'y a essentiellement aucune différence entre les threads du planificateur sharepoint vue.

Au départ, Linux n'avait pas du tout de threads, seulement des process. Ainsi, la partie du operating system qui programme le «travail CPU» est généralement appelée le programmateur de process, pour des raisons historiques. (Ce n'est pas spécifique à Linux, la même chose pour la plupart des systèmes de type Unix. Le programmateur de threads n'est tout simplement pas le vocabulaire habituel utilisé.)


Je ne mentionnerais même pas clone (encore less vfork ) à ce moment-là, sauf si vous avez déjà expliqué l'set des namespaces.

Dans le kernel Linux, il n'y a pas de concept de thread car Linux implémente tous les threads en tant que process standard.

Le kernel Linux ne fournit aucune sémantique de planification spéciale ou structure de données pour représenter les threads.

Au lieu de cela, un thread est simplement un process qui partage certaines ressources avec d'autres process. Chaque thread a une task_struct unique et apparaît au kernel comme un process normal: il suffit de partager des ressources, comme un espace d'adressage, avec d'autres process.

Pour Linux, les threads sont simplement une manière de partager des ressources entre les process. Par exemple, supposons que vous avez un process composé de quatre threads. Sous Linux, il n'y a que quatre process et donc quatre structures task_struct normales. Les quatre process sont mis en place pour partager certaines ressources.

Et en ce qui concerne les threads du kernel (qui existent uniquement dans kernelspace), la seule différence entre les threads du kernel et les process / threads normaux est que les threads du kernel n'ont pas d'espace d'adressage. Ils ne fonctionnent que dans le kernel et ne basculent pas dans l'espace user.