ELE-784 Ordinateurs et programmation système Cours #1 Introduction OS multitâches Bruno De Kelper Site internet : http://www.ele.etsmtl.ca/academique/ele784/ Cours # 1 ELE784 - Ordinateurs et programmation système 1 Plan d aujourd hui 1. Introduction au cours 1. Objectifs 2. Contenu du cours 3. Livres de références 2. Introduction au lab 1. Matériels et installation du lab 2. Le projet en 3 phases 3. 1. Survol du système d exploitation Linux 2. Espaces usager, noyau et interruption 3. Appels système, interruptions matériel et logiciel 4. Notions de processus, fil d exécution et de tranche de temps 5. Notions de préemption et de changement de contexte Cours # 1 ELE784 - Ordinateurs et programmation système 2 Cours # 1 ELE784 - Ordinateurs et programmation système 1
1.1 - Objectifs du cours Introduction au cours - Comprendre les systèmes d exploitation (OS) multitâches modernes, tel que Linux. - Concevoir et réaliser des pilotes d interfaces dans le contexte des OS modernes. - Utiliser la synchronisation des tâches et les interruptions du matériel. - Évaluer et mesurer la performance d un programme ou un morceau de programme. - Optimiser le code d un programme en lien avec les capacités du processeur et de la mémoire. - Comprendre et utiliser à bon escient la mémoire cache et le pipeline du système. Cours # 1 ELE784 - Ordinateurs et programmation système 3 1.2 - Contenu du cours Partie OS : Introduction au cours 1) Introduction OS multitâches 2) Synchronisation dans un OS multitâches Partie Pilote : 3) Introduction aux pilotes d interfaces 4) Notions plus avancées de pilote 5) Communication avec le matériel 6) Le traitement des interruptions 7) Le pilote PCI et le pilote USB 8) Les techniques de déverminage d un pilote Partie Matériel : 9) Introduction au matériel 1) Optimisation des performances d un programme 11) Hiérarchies de mémoire Cours # 1 ELE784 - Ordinateurs et programmation système 4 Cours # 1 ELE784 - Ordinateurs et programmation système 2
1.3 - Livres de références Principal : Introduction au cours - Corbet, J., Rubini, A., Kroah-Hartman, G., Linux Device Drivers, 3ième edition, O Reilly Media, 25. Lien Internet : http://lwn.net/kernel/ldd3/ Complémentaires : - Bryant, R. E., O Hallaron, D. R., Computer Systems A Programmer s Perspective, Prentice Hall, 23. - Love, R., Linux Kernel Development, 2ième edition, Novell Press, 25. Cours # 1 ELE784 - Ordinateurs et programmation système 5 Introduction au Lab 2.1 - Matériels et installation du lab Cours # 1 ELE784 - Ordinateurs et programmation système 6 Cours # 1 ELE784 - Ordinateurs et programmation système 3
Introduction au Lab 2.1 - Matériels et installation du lab La carte SBC : - Intel Pentium III Processor à 85 MHz et 256 KB de cache L2 de 64-bit - Jusqu à 1 GB de SDRAM sur 4 DIMM - Ultra-2 SCSI LVD/SE (8 MB/s) - Support pour 1/1Base-TX Ethernet - AGP video avec 2 MB SDRAM 64-bit PCI-947 de Kontron Cours # 1 ELE784 - Ordinateurs et programmation système 7 Introduction au Lab 2.1 - Matériels et installation du lab La caméra : - Senseur de résolution Ultra-élevée de 1.3-megapixel avec technologie RightLight. - Capture Vidéo : jusqu à 96 x 72 pixels (qualité HD). - Capture d image fixe: 128 x 96 pixels. - Microphone avec technologie RightSound. - Taux de capture: jusqu à 3 images/s. - Certifié USB 2.. QuickCam Orbit MP de Logitech Cours # 1 ELE784 - Ordinateurs et programmation système 8 Cours # 1 ELE784 - Ordinateurs et programmation système 4
2.2 - Le projet en 3 phases Introduction au Lab Étape #1 : (1 à 2 séances) - Configurer et compiler le noyau Linux pour la carte SBC. Étape #2 : (5 à 6 séances) - Développer un pilote USB pour la caméra. - Développer un squelette de pilote. - Améliorer le squelette jusqu à un pilote complet. - Ajouter des fonctionnalités pour caméra (fournit). Étape #3 : (4 à 6 séances) - Développer une application entièrement optimisée. - Développer l application. - Mesurer les performances et goulot d exécution. - Déverminer et optimiser en profondeur. Cours # 1 ELE784 - Ordinateurs et programmation système 9 3.1 - Survol du système d exploitation Linux Système d exploitation (OS) : - Noyau - Pilotes - Chargeur d amorçage Noyau (Kernel) : Responsable de l utilisation de base du système et de son administration. - "Shell" de commandes et interface-usager - Système de fichiers de base - Utilitaires du système Partie centrale ou cœur de l OS. Il fournit : Il contient : - Services de base pour toutes les autres parties du système. - Gestion du matériel. - Distribution des ressources du système. - Gestionnaire d interruptions - Ordonnanceur - Gestionnaire de mémoire - Services du système : réseautage et communication interprocessus Cours # 1 ELE784 - Ordinateurs et programmation système 1 Cours # 1 ELE784 - Ordinateurs et programmation système 5
3.1 - Survol du système d exploitation Linux - OS multitâches avec "tranche de temps" calculée dynamiquement. Application 1 Application 2 Application 3 Espace Usager - OS multiprocesseur symétrique (SMP) avec "équilibreur de charge". Interface d appel au système - Noyau monolithique. - Chargement dynamique des modules du noyau. Sous-systèmes du noyau Pilotes Espace Noyau - Entièrement préemptif. - Processus Fil d exécution. Matériel Réf. : Linux Kernel Development, 2 ième éd., R. Love, Novell Press, page 5, fig. 1.1 Cours # 1 ELE784 - Ordinateurs et programmation système 11 Vue plus détaillée du noyau Réf. : Linux Device Drivers, 3 ième éd., J. Corbet, A. Rubin, G. Kroah-Hartman, O Reilly Media, page 6, fig. 1.1 Cours # 1 ELE784 - Ordinateurs et programmation système 12 Cours # 1 ELE784 - Ordinateurs et programmation système 6
3.1 - Survol du système d exploitation Linux Particularités du code du noyau : - Pas accès aux librairies standards du C. - Compilé avec le compilateur GNU C (voir http://gcc.gnu.org/). - Pas de protection de la mémoire. - Accès difficile à la représentation point-flottant. - Utilise une pile de taille fixe assez petite. - A besoin de synchronisation pour gérer la concurrence. - La portabilité du code est très importante. Cours # 1 ELE784 - Ordinateurs et programmation système 13 3.2 - Espaces usager, noyau et interruption Notion d espace : MÉMOIRE Application 1 - c est une région de la mémoire et des privilèges d accès. - c est aussi un mode d opération du système et un contexte. Espace Usager Espace mémoire Usager Application 2 Application 3 CPU Contexte Processus Mode usager Espace mémoire Noyau Processus 1 Processus 2 Espace Noyau CPU Mode superviseur Contexte Processus ou Contexte Interruption Cours # 1 ELE784 - Ordinateurs et programmation système 14 Cours # 1 ELE784 - Ordinateurs et programmation système 7
3.3 - Appels système, interruptions matériel et logiciel Module Application Périphérique Espace Usager Appel-système system_call() Module Interface d appel-système Espace Noyau Module Périphérique Matériel - La seule façon pour l espace-usager d accéder à l espace-noyau ou au matériel est au travers d un appel-système (syscall). - Cette approche fournit une couche de protection et de généralisation qui assure la stabilité du système. - Le syscall est un appel à une des fonctions de l interface d appel-système. - L appel aux fonctions "système" déclenche une interruption logiciel (exception #128) qui sera traitée par system_call(). - Les modules du noyau peuvent accéder directement au matériel. - Les échanges entre les modules du noyau et le matériel se font habituellement au travers d interruptions du matériel. Cours # 1 ELE784 - Ordinateurs et programmation système 15 3.3 - Appels système, interruptions matériel et logiciel - Les syscall sont habituellement appelés indirectement par l application au travers d un interface de programmation (API Application Programming Interface). - Cette approche permet de créer une distance supplémentaire entre l application et le système et assure la portabilité de l application sur une multitude de systèmes. Par exemple : Application Appel à printf ( ) Librairie du C (API) Syscall du noyau printf( ) de la librairie Appel à write( ) du noyau Appel à write ( ) de la librairie Interruption system_call() du noyau Interruption logicielle Cours # 1 ELE784 - Ordinateurs et programmation système 16 Cours # 1 ELE784 - Ordinateurs et programmation système 8
3.3 - Appels système, interruptions matériel et logiciel Interruption logicielle : Est déclenchée par : - Une erreur dans le programme ex. : une division par - Un comportement anormal ex. : faute de page-mémoire ou un accès illégal. Appelés "Exception" - Une instruction spéciale telle qu un syscall ex. : int $x8 appelle system_call() Appelé "Trap" - Une interruption logicielle est parfaitement synchronisée avec le processeur. - Autrement, une interruption logicielle est identique à une interruption matérielle. On peut identifier avec précision l emplacement du code où se produit l interruption. Cours # 1 ELE784 - Ordinateurs et programmation système 17 3.3 - Appels système, interruptions matériel et logiciel Interruption matérielle : Est déclenchée par : - Par un périphérique lorsque celui-ci détecte un événement. ex. : une touche du clavier a été appuyée. - Une interruption matérielle est parfaitement asynchrone par rapport au processeur. - Le processeur est avertit de l événement lorsque le périphérique lui transmet un signal spécial, appelé requête d interruption (IRQ). - Le processeur réagit à ce signal en interrompant l exécution du code actuel et en exécutant une routine d interruption (ISR). - La ISR a pour but de gérer le périphérique qui a déclenché l interruption et de traiter l événement qui s est produit. IRQ Appel Matériel CPU ISR On ne peut pas identifier avec précision l emplacement du code où se produit l interruption. Le plus rapidement possible car tout autre code est en attente (suspendu) pendant ce temps-là Cours # 1 ELE784 - Ordinateurs et programmation système 18 Cours # 1 ELE784 - Ordinateurs et programmation système 9
3.3 - Appels système, interruptions matériel et logiciel Interruption matérielle : Contexte d interruption Réponse à l événement matériel Quelques particularités importantes : - Pendant l exécution d une ISR, toutes les interruptions sont bloquées. - La ISR ne peut pas être mise en attente (sleep), c est-à-dire qu elle ne peut pas faire appel aux services de synchronisation du noyau. - La ISR ne peut pas faire appel à des fonctions du noyau qui risque d être mises en attente. - Puisque la ISR doit s exécuter le plus rapidement possible, souvent le traitement de l événement est fait en deux parties : Moitié haute (Top Halve) - Très rapide, c est la vrai ISR. - Se limite a traiter l événement matériel, tel que transférer des données du périphérique et de le réinitialiser. Moitié basse - S occupe de faire le gros du traitement. - Les interruptions sont permises ainsi que les (Bottom Halve) synchronisations. - Sont implémentés par des softirq, des tasklet ou des queues de travail (work queues). Cours # 1 ELE784 - Ordinateurs et programmation système 19 3.4 - Notions de processus, fil d exécution et de tranche de temps Processus : Fil d exécution (thread) : Le concept de "Tâche" est à la base du traitement concurrent et du vrai parallélisme C est un programme, une application qui s exécute dans son propre espace-mémoire. Une tâche, un morceau de code qui est attaché à un processus ou une autre tâche (son parent) et s exécute dans l espace-mémoire de son parent. Application Pour LINUX : - Il n y a pas de réelle différence entre un processus et un fil d exécution. - Un fil d exécution est simplement une tâche qui s exécute dans le même espace-mémoire que sa tâche "parent". - Toute tâche a un parent et ou plus d enfants. Processus Tâche = Fil d exécution Tâche Parent Tâche Tâche Tâche Enfants Cours # 1 ELE784 - Ordinateurs et programmation système 2 Cours # 1 ELE784 - Ordinateurs et programmation système 1
3.4 - Notions de processus, fil d exécution et de tranche de temps Une tâche c est : - un code d identification (PID) - un groupe d appartenance - du code d exécution - des données, de la mémoire - des ressources - un état - une priorité d exécution - des signaux - cédule de temps, un horaire (timing) - synchronisation - un parent - des enfants - Tout ça contenu dans une grosse structure struct task_struct { volatile long state; unsigned long flags; (données des signaux) (pointeurs vers la famille) (gestion de la mémoire) (identifications de la tâche) (accès aux fichiers) (données d horaire, d horloge) (données de synchronisation) (et autres informations) Cours # 1 ELE784 - Ordinateurs et programmation système 21 } 3.4 - Notions de processus, fil d exécution et de tranche de temps Création d une tâche : Une tâche est créée par son parent à l aide de la commande d appel au système clone(). int clone(int (* fn )(void *), void * child_stack, int flags, void * arg ); Pointeur vers une fonction qui contient le code de la tâche. Pointeur vers la pile qui sera attribuée à la tâche. Voir aussi : - Famille de fonctions fork() avec la famille de fonctions exec(). Drapeaux de méthode de création de la tâche : CLONE_FILES CLONE_FS CLONE_PARENT CLONE_THREAD CLONE_IDLETASK CLONE_VM Pointeur vers les arguments qui seront passés à la fonction de démarrage de la tâche. Cours # 1 ELE784 - Ordinateurs et programmation système 22 Cours # 1 ELE784 - Ordinateurs et programmation système 11
3.4 - Notions de processus, fil d exécution et de tranche de temps Création d une tâche-noyau : Cas particulier Une tâche-noyau est créée par son parent à l aide de kernel_thread(). int kernel_thread(int (* fn )(void *), void * arg, unsigned long flags); Même que clone() Seul une tâche-noyau peut créer une nouvelle tâche-noyau. Une tâche-noyau ne possède pas d espace-mémoire qui lui est propre mais s exécute dans l espace du noyau uniquement. Normalement, une tâche-noyau reste active tant et aussi longtemps que le système est actif. Même que clone(), mais : CLONE_KERNEL = CLONE_FS CLONE_FILES CLONE_SIGHAND Cours # 1 ELE784 - Ordinateurs et programmation système 23 3.4 - Notions de processus, fil d exécution et de tranche de temps Destruction d une tâche : Une tâche se détruit elle-même à l aide de exit() ou lorsqu elle arrive au bout de son code principal (main) ou encore lorsqu elle reçoit un "signal" ou une exception qu elle ne peut pas traiter. - Lorsqu une tâche est détruite, elle est placée dans un état spécial (TASK_ZOMBIE) où presque toute la mémoire qu elle occupait a été libérée sauf sa task_struct. - La tâche "parent" doit ensuite finir le travail de destruction à l aide de release_task(). - Si la tâche possède des enfants, ceux-ci sont informés de la destruction de leur parent et reçoivent un nouveau parent : - Soit le parent de la tâche qui est détruite - Soit la tâche INIT qui est la 1 ière tâche du système et qui est donc le parent de toutes les autres tâches. Cours # 1 ELE784 - Ordinateurs et programmation système 24 Cours # 1 ELE784 - Ordinateurs et programmation système 12
3.4 - Notions de processus, fil d exécution et de tranche de temps États d une tâche : Tâche parent crée une nouvelle tâche clone() ou fork() Lorsqu une tâche existe, elle est dans l un de trois états. ordonnanceur exit() TASK_ZOMBIE (détruite) TASK_RUNNING (prête) TASK_RUNNING (en exécution) préemption Tâche se réveille à la réception d un événement TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE (en attente) Tâche s endort en attente d un événement Réf. : Linux Kernel Development, 2 ième éd., R. Love, Novell Press, page 28, fig. 3.3 Cours # 1 ELE784 - Ordinateurs et programmation système 25 3.4 - Notions de processus, fil d exécution et de tranche de temps - Linux maintient une liste des tâches actives, c est-à-dire des tâches qui sont disponibles pour l exécution. - À chacune de ces tâches, Linux attribue une période d exécution appelée Tranche de temps (Timeslice). - Chaque tâche est exécutée à tour de rôle (Round-Robin) jusqu à l expiration de sa tranche de temps ou jusqu à ce qu elle se mette ellemême en attente d un événement. - Les tranches de temps sont calculées dynamiquement pour chaque tâche. Liste des tâches prêtes (ready runqueue) CPU Tâche 1 Tâche 2 Tâche 3 Tâche 4 Tranche de temps (5 ms à 8 ms) Tâche 8 Tâche 7 Tâche 6 Tâche 5 Liste des tâches exprimées (expired runqueue) (vue simplifiée) Cours # 1 ELE784 - Ordinateurs et programmation système 26 Cours # 1 ELE784 - Ordinateurs et programmation système 13
3.5 - Notions de préemption et de changement de contexte - Linux est un OS entièrement préemptif, c est-à-dire que l ordonnancement du travail est fait selon des niveaux de priorité. - À chaque tâche est attribué dynamiquement un niveau de priorité. - Les tâches dont la priorité est élevée sont exécutées avant celles dont la priorité est plus basse. - Les tâches ayant la même priorité sont exécutées en Round-Robin, c est-à-dire à tour de rôle selon leur "tranche de temps". - Le niveau de priorité est choisit de la façon suivante : - Les tâches qui attentent souvent pour des I/O reçoivent une priorité plus élevée. - Les tâches qui manquent continuellement de temps dans leur "tranche de temps reçoivent une priorité plus basse. Ce type de tâches passent leur temps à attendre pour des accès aux I/O et doivent être exécutées souvent, mais pas pour très longtemps. Ce type de tâches font principalement du traitement et ne requièrent pas d être exécutées très souvent, mais plus longtemps. Cours # 1 ELE784 - Ordinateurs et programmation système 27 3.5 - Notions de préemption et de changement de contexte - Linux maintient un tableau de priorité ainsi qu une liste de queues de travail (runqueues) pour chaque priorité. Tableau de drapeaux 27 1 26 25 1 3 2 1 1 Priorités Tableau de queues de travail * * * Queues de travail par priorité Tâches exécutées en Round-Robin Cours # 1 ELE784 - Ordinateurs et programmation système 28 Cours # 1 ELE784 - Ordinateurs et programmation système 14
3.5 - Notions de préemption et de changement de contexte - Le changement d une tâche à une autre est décidé par l ordonnanceur (scheduler). - Lorsque décidé, un changement de contexte est effectué de façon à replacer le système dans les conditions qui permettent à la nouvelle tâche de s exécuter normalement, c est-à-dire le système récupère : - Le mappage de la mémoire virtuelle - La configuration de la pile - L état des registres du processeur - Une demande est faite à l ordonnanceur, en levant un drapeau spécial, pour qu il vérifie les tâches qui doivent être exécutées chaque fois que : - Une tâche de plus haute priorité tente de se réveiller - Une tâche est arrivée à la fin de sa tranche de temps - L ordonnanceur vérifie l état de ce drapeau et choisit une nouvelle tâche à exécuter, à chaque fois que : - Le système revient à l espace-usager après un syscall - Au retour d une interruption, telle que la fin d une tranche de temps Cours # 1 ELE784 - Ordinateurs et programmation système 29 3.5 - Notions de préemption et de changement de contexte Cas particulier : Préemption dans le noyau - La préemption d une tâche du noyau est permise seulement si cette tâche ne tient pas un verrou (lock). - En fait, l obtention d un verrou marque le début d une zone de nonpréemption. - C est-à-dire que la préemption dans le noyau peut se produire lorsque : - Au retour d une interruption. - La préemption du noyau est de nouveau permise (tous les verrous tenus par la tâche ont été libérés). - La tâche-noyau actuelle appelle l ordonnanceur de façon explicite. - La tâche-noyau bloque, par exemple lorsque : - La tâche tente de capturer un verrou. - La tâche attend pour un événement. Cours # 1 ELE784 - Ordinateurs et programmation système 3 Cours # 1 ELE784 - Ordinateurs et programmation système 15