Votre matériel de lecture est bon. Donc pas de problèmes là-bas. Jetez aussi un coup d'œil aux conférences CS téléchargeables sur la conception de systèmes d'exploitation de Stanford.
- L'algorithme de planification peut avoir besoin d'être plus sophistiqué. Cela dépend des types d'applications en cours d'exécution et de leur gourmandise. Est-ce qu'ils se rendent ou sont-ils obligés de le faire? Ce genre de chose. C'est plus une question de ce que vos processus veulent, ou attendent. Un RTOS aura une planification plus complexe qu'un ordinateur de bureau.
- Les threads doivent avoir une affinité avec un cœur, car 2 threads dans un processus peuvent s'exécuter en parallèle ... mais pas au même moment en temps réel sur le même cœur. Les mettre sur des noyaux différents leur permet de vraiment fonctionner en parallèle. La mise en cache peut également être optimisée pour l'affinité de base. C'est vraiment un mélange de votre implémentation de thread et de votre planificateur. Le sched peut vouloir s'assurer que les threads sont démarrés en même temps sur les cœurs, plutôt qu'ad hoc pour réduire le temps d'attente des threads les uns sur les autres et sur les choses. Si votre bibliothèque de threads est un espace utilisateur, elle affecte peut-être le core ou permet au planificateur de décider en fonction de la capacité ou des décès récents.
- L'évolutivité est souvent une limite de noyau (qui peut être arbitraire). Sous Linux, si je me souviens bien, les limites sont dues au dimensionnement statique des tableaux qui contiennent les structures d'information du processeur dans le planificateur. Par conséquent, ils sont de taille fixe. Cela peut être changé en recompilant le noyau. La plupart des bons algorithmes d'ordonnancement supporteront un très grand nombre de cœurs. Au fur et à mesure que votre nombre de processeurs ou de processeurs augmente, vous devez veiller à ne pas trop fragmenter l'exécution des processus. Si un programme a 2 threads, essayez de les planifier dans le proche-temps, car une causalité peut exister (par l'intermédiaire de données partagées) entre eux.
Vous devez également décider comment vos threads sont implémentés et comment un processus est représenté (lourd ou léger) dans le noyau. Le noyau des threads est-il géré? l'espace utilisateur est-il géré? Toutes ces choses ont un impact sur la conception du planificateur. Regardez comment les threads POSIX sont implémentés dans différents systèmes d'exploitation. Il y a tellement de choses auxquelles vous devez penser :)
en bref Il n'y a pas vraiment de réponses directes à l'endroit où la logique se situe ou devrait résider. Tout dépend de la conception, des attentes de l'application, des contraintes de temps (sur les programmes) et ainsi de suite.
J'espère que cela aide, je ne suis pas un expert ici cependant.
Pourriez-vous fusionner vos questions SANOS? –