La programmation système Le principe
Système d’exploitation Interface du matériel et gestionnaire des ressources
Système d’exploitation Historiquement, l’OS (Operating System) a beaucoup évolué… Pas le temps de rentrer dans le détail, mais je vous encourage à consulter ce cours pour plus de détail : http://www.iutc3.unicaen.fr/~bourdf/cours/IUT-1A/cours/chapitre1/ch1.pdf Permet de mieux comprendre les choix pour la conception de l’OS
Système d’exploitation Petit à petit, le matériel informatique c’est diversifié : Ati/Nvidia/Matrox/Intel : Cartes graphiques Intel/AMD : Processeurs SDRAM/DDRAM : type mémoire Carte mère… Sans OS, un programmateur devrait réécrire son programme pour qu’il marche sur chaque type de machine ! Par exemple, lire un fichier ne se fait pas de la même manière si il est sur un disque SATA, IDE ou USB !
Système d’exploitation Il faut permettre à un utilisateur de lancer plusieurs applications en même temps Le multi tâche Planifier le temps alloué à chaque application Ordonnancement avec gestion des priorités Empêcher un programme de monopoliser le processeur Permet de gérer et protéger l’accès aux ressources
Système d’exploitation Permet d’offrir à l’utilisateur des points d’accès au matériel : Sous forme d’API (Application Programming Interface) Utilisable à partir des programmes s'exécutant sur le système Composée d'un ensemble d'appels systèmes Sous forme d’interface utilisateur Utilisable sous forme de texte ou de fenêtre (exemple : rm * sous linux…)
Système d’exploitation Nous nous intéresserons ici aux API, mais Il est important de connaitre les commandes LINUX Donc vous êtes encouragés à installer linux chez vous et jouer un peu avec le système testez par exemple le résultat de la commande rm –F * chez vous (et pas à l’ORT !)
Système d’exploitation Essaye de protéger le système, mais : while true ; do mkdir toto ; cd toto ; done while(1){ fork() ; } I while(1) { char *a=malloc(512) ; *a='1' ; } Réponse classique : Plantage…
Système d’exploitation C’est lui qui essaye de répartir l’accès aux ressources Accès au disque dur Accès à la mémoire vive Accès au processeur Mais, il est souvent nécessaire de gérer soit même l’accès aux ressources En effet, l’OS gère les conflits, mais pas la manière dont résoudre un conflit…
Processus On s’intéresse maintenant aux processus Représente une entité dynamique s’exécutant sur un processeur Du point de vu de l’OS : Espace d’adressage (BSS, Tas, Pile…) Etat interne (compteur d’exécution, fichiers ouverts…)
Processus et programme int i; int main() { printf("Salut\n"); } Processus Pile Tas BSS int i; Code main Vous pouvez utiliser le même programme que moi, mais vous n’aurez pas le même processus que moi !
Ordonnancement des Processus Les communications bloquent les processus Deux manières
Environnement d’un processus L’ensemble des variables vu par un processus Variables globales Constantes Objets … C’est l’OS qui se charge de réserver la place en mémoire pour ces variables (+ Tas et Pile…)
Le parallélisme L’intérêt des processus, c’est qu’ils peuvent être lancés simultanément L’inconvénient, c’est que ça pose des problèmes ! Tout d’abord, comment multiplier les processus…
Système UNIX La seule manière de dupliquer un processus est d’utiliser fork fork clone le processus appelant : void main(){ pid_t n=fork() n==0 n>0 On est dans le processus père On est dans le processus fils
Fork 1/2 La manière la plus courante d’utiliser un fork, c’est : void main(){ pid_t n=fork(); if(n!=0){ if(n<0){ //gestion des erreurs }else{ //programme du papa } //programme du fils
Fork 2/2 Clonage, c’est une recopie complète et indépendante : int i=3 ; if (fork() != 0) { printf("je suis le pere, mon PID est %d\n", getpid()) ; i += 4 ; } else { printf("je suis le fils, mon PID est %d ; mon pere est %d\n", getpid(), getppid()) ; i += 9 ; } printf("pour le pid %d, i = %d\n", getpid(), i) ; je suis le fils, mon PID est 10271 ; mon pere est 10270 pour le pid 10271, i = 12 je suis le pere, mon PID est 10270 Pour le pid 10270, i = 7