logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
doc:systeme:noyau:theorie [11/02/2014 12:32]
captnfab [Les processus]
doc:systeme:noyau:theorie [11/02/2014 18:27]
captnfab [Les interruptions matérielles]
Ligne 9: Ligne 9:
   * Commentaires sur le forum : [[https://​debian-facile.org/​topic-8438-wiki-introduction-au-fonctionnement-d-un-systeme-d-exploitation-page-1.html | Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[https://​debian-facile.org/​topic-8438-wiki-introduction-au-fonctionnement-d-un-systeme-d-exploitation-page-1.html | Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
-=== Nota === +**Nota:**
 Contributeurs,​ les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! Contributeurs,​ les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
  
 ===== Introduction ===== ===== Introduction =====
  
-Le noyau est, sans mauvais jeu de mot, une pièce centrale dans un système d'​exploitation. Il est difficile de donner un exemple minimal montrant ce qu'est un noyau tellement celui-ci est omniprésent. Il est l'​interface avec les périphériques,​ il est celui qui exécute les programmes, qui leur donne la main, les faut communiquer entre euy, il est celui qui gère la mémoire, l'​alloue,​ la range dans la swap. Il est celui qui à plus haut niveau défini la notion de fichiers, et les décode à partir des données ​brut contenues sur les périphériques de stockage, etc.+Le noyau est, sans mauvais jeu de mot, une pièce centrale dans un système d'​exploitation. Il est difficile de donner un exemple minimal montrant ce qu'est un noyau tellement celui-ci est omniprésent. Il est l'​interface avec les périphériques,​ il est celui qui exécute les programmes, qui leur donne la main, les faut communiquer entre eux, il est celui qui gère la mémoire, l'​alloue,​ la range dans la swap. Il est celui qui à plus haut niveau défini la notion de fichiers, et les décode à partir des données ​brutes ​contenues sur les périphériques de stockage, etc.
  
 Plutôt que faire une description théorique technique du fonctionnement du noyau, des tas de livres présentant la chose existent (voir les références),​ nous allons explorer un peu tout ça au travers de l'​action la plus banale et pourtant probablement la plus complexe faisable pour un noyau : lancer un navigateur web. Nous prendrons l'​exemple du noyau Linux, mais le raisonnement devrait être le même pour tous les noyaux monolithiques (modulaires ou non) Plutôt que faire une description théorique technique du fonctionnement du noyau, des tas de livres présentant la chose existent (voir les références),​ nous allons explorer un peu tout ça au travers de l'​action la plus banale et pourtant probablement la plus complexe faisable pour un noyau : lancer un navigateur web. Nous prendrons l'​exemple du noyau Linux, mais le raisonnement devrait être le même pour tous les noyaux monolithiques (modulaires ou non)
Ligne 36: Ligne 35:
  
 <note warning>​Comment cela s'​est-il passé ? Le programme a effectué un //appel système//, c'est à dire qu'il a passé un coup de fil direct au noyau, et lui a demandé «copie moi». Cet appel système s'​appelle le **fork**((fork:​ de l'​anglais //​fourchette//,​ parce que le flot d'​exécution se divise en deux, ça fait donc une petite fourche. ​ Voir [[http://​debian-facile.org/​man.php?​page=fork&​section=&​lang=fr_FR|man 2 fork]]. Cela dit, une fourchette anglaise à deux doigts, c'est bien la preuve que les //british// mangent des escargots eux aussi.)), le noyau copie alors le processus à l'​identique,​ à l'​exception d'une variable les distinguant.</​note>​ <note warning>​Comment cela s'​est-il passé ? Le programme a effectué un //appel système//, c'est à dire qu'il a passé un coup de fil direct au noyau, et lui a demandé «copie moi». Cet appel système s'​appelle le **fork**((fork:​ de l'​anglais //​fourchette//,​ parce que le flot d'​exécution se divise en deux, ça fait donc une petite fourche. ​ Voir [[http://​debian-facile.org/​man.php?​page=fork&​section=&​lang=fr_FR|man 2 fork]]. Cela dit, une fourchette anglaise à deux doigts, c'est bien la preuve que les //british// mangent des escargots eux aussi.)), le noyau copie alors le processus à l'​identique,​ à l'​exception d'une variable les distinguant.</​note>​
 +
 +<note info>​**Interlude pratique:** Un petit code C pour forker dans votre garage.
 +
 +<code user>​nano /​tmp/​test_fork.c</​code>​
 +
 +<code c>#​include <​stdio.h>​
 +#include <​unistd.h>​
 +
 +int main()
 +{
 +  int f=fork(); ​  // Copie-moi !
 +  printf("​cou"​); ​ // J'​affiche « cou »
 +
 +  int s;
 +  if(f!=0) ​       // Si nous sommes le pere
 +   {
 +    wait(&​s); ​    // On attend que le fils termine
 +    printf("​\n"​);​ // Puis on affiche un retour a la ligne
 +   }
 +  return 0;
 +}</​code>​
 +
 +<code user>gcc -o /​tmp/​test_fork /​tmp/​test_fork.c</​code>​
 +<code user>/​tmp/​test_fork</​code>​
 +</​note>​
  
 ==== Répartition des richesses ==== ==== Répartition des richesses ====
  
-En ignorant platement et sans vergogne ​tous le bazar qui tournait déjà sur votre ordinateur((Réjouissez vous, ce n'est rien à côté de votre voisin sous Ubuntu.)), nous avons désormais deux processus. À faire tourner ​su un seul processeur avec un seul cœur (et oui, on ne vous avez pas dit, on travaille sur l'ordi de grand mère.) Quel est le problème ? Vous voyez la calculatrice qu'​utilise le vendeur de l'​Apple Store voisin pour calculer combien font 600 + (2×1200) ? Vous avez une bonne idée de comment faire un calcul sur cette calculatrice,​ et même de comment en faire deux : l'un après l'​autre. Mais il n'est pas question de cela sur votre ordinateur, imaginez qu'à chaque fois que vous lancez une application toutes les autres soient interrompues jusqu'​à ce que vous la fermiez((J'​avais une coloc, c'​était un peu ça, mais je m'​égare…)).+En ignorant platement et sans vergogne ​tout le bazar qui tournait déjà sur votre ordinateur((Réjouissez vous, ce n'est rien à côté de votre voisin sous Ubuntu.)), nous avons désormais deux processus. À faire tourner ​sur un seul processeur avec un seul cœur (et oui, on ne vous l'​avait ​pas dit, on travaille sur l'ordi de grand mère.) Quel est le problème ? Vous voyez la calculatrice qu'​utilise le vendeur de l'​Apple Store voisin pour calculer combien font 600 + (2×1200) ? Vous avez une bonne idée de comment faire un calcul sur cette calculatrice,​ et même de comment en faire deux : l'un après l'​autre. Mais il n'est pas question de cela sur votre ordinateur, imaginez qu'à chaque fois que vous lancez une application toutes les autres soient interrompues jusqu'​à ce que vous la fermiez((J'​avais une coloc, c'​était un peu ça, mais je m'​égare…)).
  
 Lancer deux calculs en même temps sur la même calculatrice,​ c'est pas fastoche. Comment faire, eh bien simplement, laisser 30 millisecondes au vendeur pour travailler sur un calcul, puis 30 millisecondes pour travailler sur l'​autre,​ puis 30 millisecondes pour reprendre le premier calcul, etc.((Avouez que vous aimeriez voir le tableau.)) Lancer deux calculs en même temps sur la même calculatrice,​ c'est pas fastoche. Comment faire, eh bien simplement, laisser 30 millisecondes au vendeur pour travailler sur un calcul, puis 30 millisecondes pour travailler sur l'​autre,​ puis 30 millisecondes pour reprendre le premier calcul, etc.((Avouez que vous aimeriez voir le tableau.))
Ligne 54: Ligne 78:
 ==== Des jumeaux différents ==== ==== Des jumeaux différents ====
  
-Nous avons, je vous le rappelle, deux processus : le shell, et une copie du shell qui sait qu'​elle est une copie du premier. Cette copie peut demander au noyau de la réinitialiser avec un nouveau code. C'est l'​appel système **exec**((Voir [[http://​debian-facile.org/​man.php?​page=exec&​section=&​lang=fr_FR|man 2 exec]])). Il consiste en l'​effacement total du code du programme lancé dans le processus((Un processus est bien plus qu'un code en cours d'​exécution,​ il possède un espace mémoire alloué, un propriétaire, ​des entrée et sorties standard, etc.)), le chargement en mémoire d'un autre programme, ici notre navigateur, et l'​exécution de celui-ci.+Nous avons, je vous le rappelle, deux processus : le shell, et une copie du shell qui sait qu'​elle est une copie du premier. Cette copie peut demander au noyau de la réinitialiser avec un nouveau code. C'est l'​appel système **exec**((Voir [[http://​debian-facile.org/​man.php?​page=exec&​section=&​lang=fr_FR|man 2 exec]])). Il consiste en l'​effacement total du code du programme lancé dans le processus((Un processus est bien plus qu'un code en cours d'​exécution,​ il possède un espace mémoire alloué, un propriétaire, ​une entrée et deux sorties standard, etc.)), le chargement en mémoire d'un autre programme, ici notre navigateur, et l'​exécution de celui-ci.
  
 Notre jumeau est donc devenu très différent de son père((Hein ?)). Notre jumeau est donc devenu très différent de son père((Hein ?)).
  
 +<note info>​**Interlude pratique:** Votre premier shell, toujours en C. Le début d'un long projet !
 +
 +<code user>​nano /​tmp/​test_minishell.c</​code>​
 +
 +<code c>#​include <​stdio.h>​
 +#include <​unistd.h>​
 +#include <​string.h>​
 +
 +int main()
 +{
 +  while(1) ​                             // Boucle infinie
 +   {
 +    char commande[256];​
 +    printf("​$ "​); ​                      // Afficher un prompt minimal
 +    fgets(commande,​ 256, stdin); ​       // Lire une ligne
 +    commande[strlen(commande)-1]='​\0'; ​ // Enlever le retour à la ligne
 +
 +    int f=fork(); ​                      // Copie-moi !
 +    int s;
 +    if(f!=0) ​                           // Si je suis le père
 +     {
 +      wait(&​s); ​                        // Attendre que le fils se termine
 +     }
 +    else                                // Sinon, je suis le fils
 +     {
 +      execlp(commande,​ commande,​NULL); ​ // Lancer l'​exécutable reçu
 +      perror("​Erreur"​); ​                // Si j'​arrive là, j'ai échoué
 +     }
 +   }
 +
 +  return 0;
 +}
 +</​code>​
 +
 +<code user>gcc -o /​tmp/​test_minishell /​tmp/​test_minishell.c</​code>​
 +<code user>/​tmp/​test_minishell</​code>​
 +Ctrl-c pour interrompre le shell.
 +Attention, ce mini-shell n'​accepte pas les commandes avec arguments.</​note>​
 ===== Les interruptions matérielles ===== ===== Les interruptions matérielles =====
  
Ligne 70: Ligne 132:
 Vous avez lancé votre navigateur, il arrive sur la page d'​accueil : [[http://​debian-facile.org]] et vous vous emparez de votre joystick bicéphale afin de cliquouiller sur [[https://​debian-facile.org/​search.php?​action=show_new|Voir les nouvelles contributions]]. Pendant ce temps là, votre pointeur s'est baladé à l'​écran((Constitué uniquement d'une coquille et d'un surfer, ne l'​oublions pas…)) et tout comme votre redoutable fauve, //​Popotte//,​ qui roupille dans son panier, lorsqu'​il se retrouve dans votre situation, vous êtes émerveillés par la quasi-parfaite synchronicité entre les mouvements gauches de votre souris, et les déplacements du pointeur à l'​écran. Certes un Pommiste trouverait ça banal, mais vous avez l’œil, vous. Vous avez lancé votre navigateur, il arrive sur la page d'​accueil : [[http://​debian-facile.org]] et vous vous emparez de votre joystick bicéphale afin de cliquouiller sur [[https://​debian-facile.org/​search.php?​action=show_new|Voir les nouvelles contributions]]. Pendant ce temps là, votre pointeur s'est baladé à l'​écran((Constitué uniquement d'une coquille et d'un surfer, ne l'​oublions pas…)) et tout comme votre redoutable fauve, //​Popotte//,​ qui roupille dans son panier, lorsqu'​il se retrouve dans votre situation, vous êtes émerveillés par la quasi-parfaite synchronicité entre les mouvements gauches de votre souris, et les déplacements du pointeur à l'​écran. Certes un Pommiste trouverait ça banal, mais vous avez l’œil, vous.
  
-En effet, vous savez que chacun des petits soubresauts que vous infligez à votre rongeur est traduit par icelui en autant d'​impulsions électriques qui s'en vont chatouiller le noyau à 128ko/s. La routine du noyau en charge de traiter cette nuisance est le module **evdev**. C'est lui qui doit interpréter les errances //​fenêtropommesques//​ pour les traduire en //​clics-à-côté-de-là-où-je-voulais-et-merdouille-il-est-où-ce-pointeur-à-la-noix//​. La suite ne concerne plus le noyau, mais Xorg ayant été averti à son lancement par udev de la présence de l’appendice rongeuse, la surveille au travers du fichier ''/​dev/​input/​mice'',​ et en fait profiter la carte graphique (via le noyau), le gestionnaire de fenêtre (via le noyau) et toutes les autres applications concernées,​ via le noyau.+En effet, vous savez que chacun des petits soubresauts que vous infligez à votre rongeur est traduit par icelui en autant d'​impulsions électriques qui s'en vont chatouiller le noyau à 128ko/s. La routine du noyau en charge de traiter cette nuisance est le module **evdev**. C'est lui qui doit interpréter les errances //​fenêtropommesques//​ pour les traduire en //​clics-à-côté-de-là-où-je-voulais-et-merdouille-il-est-où-ce-pointeur-à-la-noix//​. La suite ne concerne plus le noyau, mais Xorg ayant été averti à son lancement par udev de la présence de l’appendice rongeuse, la surveille au travers du fichier ''/​dev/​input/​mice''​((C'​est le rôle du paquet ''​xserver-xorg-input-evdev''​.)), et en fait profiter la carte graphique (via le noyau), le gestionnaire de fenêtre (via le noyau) et toutes les autres applications concernées,​ via le noyau.
  
-//Pouf.// Vous avez atteint le lien, et l'avait subtilement éraflé du clic, afin de visiter la page des nouvelles contributions.+<note info>​**Interlude pratique** 
 + 
 +<code root>od -t x1 -w3 /​dev/​input/​mice</​code>​ 
 +Bougez votre souris. 
 +Ctrl-c pour quitter.</​note>​ 
 + 
 +//Pouf.// Vous avez atteint le lien, et l'avez subtilement éraflé du clic, afin de visiter la page des nouvelles contributions.
  
 ==== Tennis de table ==== ==== Tennis de table ====
Ligne 80: Ligne 148:
 <​code>​wiki.debian-facile.org. ​            ​IN ​     A</​code>​ <​code>​wiki.debian-facile.org. ​            ​IN ​     A</​code>​
  
-Ce à quoi le serveur DNS répondra ​gaiment ​:+Ce à quoi le serveur DNS répondra ​gaiement ​:
 <​code>​wiki.debian-facile.org. 18731   ​IN ​     CNAME   ​newdf.debian-facile.org. <​code>​wiki.debian-facile.org. 18731   ​IN ​     CNAME   ​newdf.debian-facile.org.
 newdf.debian-facile.org. 78939  IN      A       ​88.191.244.114</​code>​ newdf.debian-facile.org. 78939  IN      A       ​88.191.244.114</​code>​
  
-<note info>Ce qui signifie que ''​wiki.debian-facile.org''​ est un alias qui pointe vers l'​enregistrement ''​newdf.debian-facile.org''​ dont l'​adresse IPv4 est ''​88.191.244.114''​.</​note>​+<note info>Ce qui signifie que ''​wiki.debian-facile.org''​ est un alias qui pointe vers l'​enregistrement ''​newdf.debian-facile.org''​ dont l'​adresse IPv4 est ''​88.191.244.114''​. 
 + 
 +Essayez vous-même : 
 +<code root>​apt-get install dnsutils</​code>​ 
 +<code user>dig -t A wiki.debian-facile.org</​code>​ 
 +</​note>​
  
 Puis il va envoyer une requête HTTP GET afin de demander la page au serveur. Puis il va envoyer une requête HTTP GET afin de demander la page au serveur.
Ligne 93: Ligne 166:
  
 Le serveur répondra alors Le serveur répondra alors
-<code html>​HTTP/​1.200 OK+<code html>​HTTP/​1.200 OK
 Date: Tue, 11 Feb 2014 11:16:59 GMT Date: Tue, 11 Feb 2014 11:16:59 GMT
 Content-Type:​ text/html Content-Type:​ text/html
Ligne 103: Ligne 176:
 </​html></​code>​ </​html></​code>​
  
-Ou les points de suspension représentent le contenu de la page HTML.+Où les points de suspension représentent le contenu de la page HTML. 
 + 
 +<note warning>​Ce qui signifie que la page a bien été trouvée (**200 OK** par opposition à par exemple **404 Not Found**), que c'est une page HTML, etc. 
 +Bien sûr, cette page fait référence à des images et des feuilles de styles que le navigateur devra également récupérer,​ par le même procédé.</​note>​ 
 + 
 +<note info>​**Interlude pratique**:​ 
 +<code user>​echo "GET / HTTP/1.1 
 +Host: wiki.debian-facile.org
  
-Bien sûr, cette page fait référence à des images et des feuilles de styles que le navigateur devra également récupérer,​ par le même procédé.+" | nc debian-facile.org 80 | less</​code>​
  
 +Ce qui se traduit en bon françoy par //Envoyer la requête HTTP du echo sur le port 80 de la machine derrière le nom ''​debian-facile.org''​ et en afficher la réponse grace au pager ''​[[:​doc:​editeurs:​less|less]]''​.//​
 +(''​q''​ pour quitter)
 +</​note>​
 === Le noyau et le réseau === === Le noyau et le réseau ===
  
 ==== La pendule de grand-mère ==== ==== La pendule de grand-mère ====
doc/systeme/noyau/theorie.txt · Dernière modification: 05/11/2015 18:01 par milou

Pied de page des forums

Propulsé par FluxBB