Niveau : Terminale générale, enseignement de spécialité NSI
Auteur : David Roche
Voici l'intérieur d'un PC :
Principalement on remarque la carte mère qui accueille tous les éléments fondamentaux au bon fonctionnement d'un ordinateur : microprocesseur (CPU) (caché sous un système de refroidissement), barrettes de mémoire RAM, carte graphique (qui permet de gérer l'affichage). On trouve aussi sur la carte mère les puces qui gèrent les interfaces réseau (Wifi et Ethernet) et bien d'autres choses...
On entend souvent dire que les téléphones portables (smartphones) sont de véritable ordinateur, ce qui est vrai. On peut s'interroger sur la taille d'un smartphone par rapport à la taille d'un PC (la carte mère d'un PC mesure environ 25 cm sur 30 cm, soit bien plus qu'un smartphone). Pourtant on doit obligatoirement trouver dans un smartphone les mêmes composants que dans un PC : CPU, RAM, carte graphique et interfaces réseau (Wifi et Bluetooth dans le cas d'un smartphone) !
La solution ? Placer tous ces composants dans une puce unique d'une centaine de mm2 :
puce accueillant le CPU, la RAM...
Ces puces accueillant CPU, RAM, circuit graphique (GPU) (équivalent à la carte graphique dans un PC) et circuits radio (Wifi et Bluetooth), sont souvent appelées "système sur puce", "system on a chip" en anglais (abréviation "SoC").
Voici le schéma de circuit d'un SoC :
Vous pouvez remarquer que l'on retrouve bien sur ce schéma un CPU et de la mémoire (on a différents types de mémoires, mais ce sujet ne sera pas abordé ici).
Outre leur taille, les Soc ont d'autres avantages par rapport aux systèmes "classiques" (carte mère + CPU + carte graphique...) :
On trouve aussi ce système de SoC sur des nano-ordinateurs comme le Raspberry Pi :
Raspberry Pi version 4
Dans sa version 4, le Raspberry Pi est équipé du Soc BCM2711 de la société Broadcom
Faites des recherches sur le Soc BCM2711, notez les principales caractéristiques de ce SoC.
Voici les noms des SoC utilisés par quelques produits succès :
Rien qu'à l'évocation des noms cités ci-dessus, vous vous doutez bien que le marché des SoC a aujourd'hui un poids économique très important. On commence même à trouver des ordinateurs portables équipés de SoC à la place des cartes mères "classiques". Les SoC commencent doucement, mais surement à rattraper les systèmes "classiques" en termes de puissance (pour les systèmes "classiques" d'entrées et de moyennes gammes).
Un système d'exploitation, appelé OS en anglais (Opérating System), permet de faire fonctionner un microprocesseur en aluant de la mémoire et en donnant l'accès aux différentes ressources disponibles (fichiers, périphériques, ...).
Les plus connus sont MS-DOS, android, Windows, Unix, Linux, OS X et macOS.
Vous avez déjà pu tester les commandes MS-DOS pour créer des répertoires et des fichiers, dans l'environnement Windows, qui est un logiciel payant, sous licence.
Linux est un système d'exploitation libre qui ne contient pas de code Unix, mais qui s'en inspire. Un système d'exploitation est souvent écrit en langage C.
Il existe de nombreuses distributions Linux, dont la plus connue est Ubuntu.
Raspberry Pi OS (appelé précédemment Raspbian) fonctionne avec Raspberry Pi.
Cliquer sur le lien suivant qui vous permettra de vous familiariser avec les commandes linux : https://luffah.xyz/bidules/Terminus/
Un programme écrit à l'aide d'un langage de haut de niveau (on parle de "code source") est, comme nous l'avons vu l'année dernière, transformé en langage machine afin de pouvoir être exécuté par un ordinateur.
On appelle processus un programme en cours d'exécution. Attention, il ne faut pas confondre le code source du programme et un processus, qui lui correspond à l'exécution de ce programme par un ordinateur. Pour prendre une image assez classique, si une recette de cuisine correspond au code source du programme, le cuisinier en train de préparer cette recette dans sa cuisine correspond à un processus.
Dans les années 1970 les ordinateurs personnels n'étaient pas capables d'exécuter plusieurs tâches à la fois : on lancait un programme et on y restait jusqu'à ce que celui-ci plante ou se termine.
Tous les systèmes d'exploitation "modernes" (Linux, Windows, macOS, Android, iOS...) sont capables de gérer l'exécution de plusieurs processus en même temps. Mais pour être précis, cela n'est pas en véritable "en même temps", mais plutôt un "chacun son tour". Pour gérer ce "chacun son tour", les systèmes d'exploitation attribuent des "états" au processus.
Voici les différents états :
Lorsqu'un processus est en train de s'exécuter (qu'il utilise le microprocesseur), on dit que le processus est dans l'état "élu".
Un processus qui se trouve dans l'état élu peut demander à accéder à une ressource pas forcément disponible instantanément (par exemple lire une donnée sur le disque dur). Le processus ne peut pas poursuivre son exécution tant qu'il n'a pas obtenu cette ressource. En attendant de recevoir cette ressource, il passe de l'état "élu" à l'état "bloqué"
Lorsque le processus finit par obtenir la ressource attendue, celui-ci peut potentiellement reprendre son exécution. Mais comme nous l'avons vu ci-dessus, les systèmes d'exploitation permettent de gérer plusieurs processus "en même temps", mais un seul processus peut se trouver dans un état "élu" (le microprocesseur ne peut "s'occuper" que d'un seul processus à la fois). Quand un processus passe d'un état "élu" à un état "bloqué", un autre processus peut alors "prendre sa place" et passer dans l'état "élu". Le processus qui vient de recevoir la ressource attendue ne va donc pas forcément pouvoir reprendre son exécution tout de suite, car pendant qu'il était dans un état "bloqué" un autre processus a "pris sa place". Un processus qui quitte l'état bloqué ne repasse pas forcément à l'état "élu", il peut, en attendant que "la place se libère" passer dans l'état "prêt" (sous entendu "j'ai obtenu ce que j'attendais, je suis prêt à reprendre mon exécution dès que la "place sera libérée"").
Le passage de l'état "prêt" vers l'état "élu" constitue l'opération "d'élection". Le passage de l'état élu vers l'état bloqué est l'opération de "blocage". Un processus est toujours créé dans l'état "prêt". Pour se terminer, un processus doit obligatoirement se trouver dans l'état "élu".
On peut résumer tout cela avec le diagramme suivant :
Il est vraiment important de bien comprendre que le "chef d'orchestre" qui attribue aux processus leur état "élu", "bloqué" ou "prêt" est le système d'exploitation. On dit que le système gère l'ordonnancement des processus (tel processus sera prioritaire sur tel autre...)
Chose aussi à ne pas perdre de vu : un processus qui utilise une ressource R doit la "libérer" une fois qu'il a fini de l'utiliser afin de la rendre disponible pour les autres processus. Pour libérer une ressource, un processus doit obligatoirement être dans un état "élu".
Un processus peut créer un ou plusieurs processus à l'aide d'une commande système ("fork" sous les systèmes de type Unix). Imaginons un processus A qui crée un processus B. On dira que A est le père de B et que B est le fils de A. B peut, à son tour créé un processus C (B sera le père de C et C le fils de B). On peut modéliser ces relations père/fils par une structure arborescente (voir le cours si nécessaire).
Si un processus est créé à partir d'un autre processus, comment est créé le tout premier processus ?
Sous un système d'exploitation comme Linux, au moment du démarrage de l'ordinateur un tout premier processus (appelé processus 0 ou encore Swapper) est créé à partir de "rien" (il n'est le fils d'aucun processus). Ensuite, ce processus 0 crée un processus souvent appelé "init" ("init" est donc le fils du processus 0). À partir de "init", les processus nécessaires au bon fonctionnement du système sont créés (par exemple les processus "crond", "inetd", "getty",...). Puis d'autres processus sont créés à partir des fils de "init"...
On peut résumer tout cela avec le schéma suivant :
N. B. Tous ces noms de processus ne sont pas à retenir, ils sont juste donnés pour l'exemple. Il est juste nécessaire d'avoir compris les notions de processus père et processus fils et la structure arborescente.
Chaque processus possède un identifiant appelé PID (Process Identification), ce PID est un nombre. Le premier processus créé au démarrage du système à pour PID 0, le second 1, le troisième 2... Le système d'exploitation utilise un compteur qui est incrémenté de 1 à chaque création de processus, le système utilise ce compteur pour attribuer les PID aux processus.
Chaque processus possède aussi un PPID (Parent Process Identification). Ce PPID permet de connaitre le processus parent d'un processus (par exemple le processus "init" vu ci-dessus à un PID de 1 et un PPID de 0). À noter que le processus 0 ne possède pas de PPID (c'est le seul dans cette situation).
Sous Linux il existe des commandes permettant de visualiser les processus :
ps
utilisée avec les options :
ps -l
) permet un affichage avec des attributs longps -u
) permet de préciser l'utilisateurps -aef
) permet de visualiser les processus en cours un ordinateur, notamment les PID et les PPID de ces processus. Problème : La commande ps ne permet pas de suivre en temps réel les processus (affichage figé).Branchez et mettre sous tension votre Raspberry pi
Exécutez "LXTerminal"
Entrez la ligne de commande ps -l
Vous devez obtenir un affichage ressemblant à l'image suivante :
Ouvrir deux autres fenêtres LXTerminal et exécuter la commande ps -l
dans celles-ci
Que remarquez-vous ?
Dans l'une des 3 fenêtres du terminal, exécuter la commande ps -u
La commande pstree
permet d'afficher les processus sous la forme d'un arbre
a) Quel nom prend le processus "init" dans ce système d'exploitation ?
b) Listez les enfants de "init" qui mènent au processus pstree
c) Quel est le parent de pstree ?
Exécutez la commande ps -aef
d) Retouvez les USER, UID, PID, PPID et CMD des 4 ancêtres de l'une des commandes bash
e) Qui est l'utilisateur "root" ?
f) Quel est sa particularité ?
la commande top
permet d'avoir un suivi en temps réel des processus.
Câblez une LED sur le port GPIO 18 du SoC Raspberry pi
La LED est considérée comme une sortie pour le SoC. Un capteur serait considéré comme une entrée
Exécuter l'application de programmation Thonny Python IDE
Recopier le code suivant dans l'application Thonny Python, puis exécuter ce code :
Ajoutez des commentaires aux lignes 3, 5, 6 et 7
Dans un terminal lancez la commande top -d 0.5, puis exécuter le programme ci-dessus
Ouvrir une nouvelle fenêtre LXTerminal, exécutez python et tapez le code suivant :
>>> while True: ... print("Bonjour tout le monde") ...Entrée
Quelle est le PID et %CPU de python ?
la commande kill
permet de supprimer un processus. L'utilisation de cette commande est très simple, il suffit de taper kill
suivi du PID du processus à supprimer (exemple : kill 4242
permet de supprimer le processus de PID 4242)
Tuez le processus qui utilise le plus de ressources processeur et recopiez la commande ci-dessous
Quelle est la commande qu'il faut écrire pour tuer le processus "init" ? que se passe-t-il si on l'exécute ?
Plusieurs processus peuvent être dans l’état prêt, comment choisir celui qui sera élu ? L’ordonnanceur (scheduler) classe les processus prêts dans une file et le répartiteur (dispatcher) alloue quant à lui un processeur à l’élu dans le cas d’une architecture multiprocesseur. Il existe plusieurs politiques d’ordonnancement dont le choix va dépendre des objectifs du système.
Exemples :
Pour terminer, nous allons maintenant étudier le phénomène d'interblocage (deadlock en anglais).
Soient 2 processus P1 et P2, soit 2 ressources R1 et R2. Initialement, les 2 ressources sont "libres" (utilisées par aucun processus).
Le processus P1 commence son exécution (état élu), il demande la ressource R1.
Il obtient satisfaction puisque R1 est libre, P1 est donc dans l'état "prêt". Pendant ce temps, le système a passé P2 à l'état élu : P2 commence son exécution et demande la ressource R2.
P2 obtient immédiatement R2 puisque cette ressource était libre. P2 repasse immédiatement à l'état élu et poursuit son exécution (P1 lui est toujours dans l'état prêt). P2 demande la ressource R1
il se retrouve dans un état bloqué puisque la ressource R1 a été attribuée à P1 : P1 est dans l'état prêt, il n'a pas eu l'occasion de libérer la ressource R1 puisqu'il n'a pas eu l'occasion d'utiliser R1 (pour utiliser R1, P1 doit être dans l'état élu).
P2 étant bloqué (en attente de R1), le système passe P1 dans l'état élu et avant de libérer R1, il demande à utiliser R2.
Problème : R2 n'a pas encore été libéré par P2, R2 n'est donc pas disponible, P1 se retrouve bloqué.
Résumons la situation à cet instant : P1 possède la ressource R1 et se trouve dans l'état bloqué (attente de R2), P2 possède la ressource R2 et se trouve dans l'état bloqué (attente de R1)
Pour que P1 puisse poursuivre son exécution, il faut que P2 libère la ressource R2, mais P2 ne peut pas poursuivre son exécution (et donc libérer R2) puisqu'il est bloqué dans l'attente de R1. Pour que P2 puisse poursuivre son exécution, il faut que P1 libère la ressource R1, mais P1 ne peut pas poursuivre son exécution (et donc libérer R1) puisqu'il est bloqué dans l'attente de R2. Bref, la situation est totalement bloquée !
Cette situation est qualifiée d'interblocage (deadlock en anglais).
En suivant les arcs, on se rend compte qu'il y a un cycle, qui démontre l'interblocage
Il existe plusieurs solutions permettant soit de mettre fin à un interblocage (cela passe par l'arrêt d'un des 2 processus fautifs) ou d'éviter les interblocage, mais ces solutions ne seront pas étudiées ici.
Depuis une fenêtre LXTerminal, créer un sous-dossier process dans /home/pi avec la commande mkdir
.
Rendez-vous dans ce dossier process avec la commande cd
, puis tapez nano test.py
et saisir
le code python suivant :
import time,os os.system('clear') t=int(time.time())+1 while True: t+=1 i=0 while t>time.time(): i**3 i+=1 print("\033[H\033[J",int((i/100)))ctrlx
Enregistrer le programme.
Exécuter la ligne de commande python test.py
Le programme affiche le nombre de fois qu'il aura pu incrémenter i durant 1 seconde. On remarque que ce nombre varie en fonction de l'ordonnancement des taches
Dans une nouvelle fenêtre LXTerminal, exécuter top -u pi i
et noter le numéro de processus du processus python
Dans une nouvelle fenêtre LXTerminal, exécuter une nouvelle fois la commande python test.py
depuis le bon dossier
sudo
Que constatez-vous ? Rechercher le processus ancêtre qu'ils ont en commun, tuez cet ancêtre, quel est le résultat ?
Sept processus Pi sont dans la situation suivante par rapport aux ressources Ri:
On voudrait savoir s’il y a interblocage.
Construire un graphe orienté où les sommets sont les processus et les ressources, tels que :
Complétez le graphe Processus.drawio avec drawio :
Il y a interblocage lorsque des cycles sont présents dans le graphe. Chercher ces cycles afin de déterminer s’il y a bien interblocage ou non. Tracez-les en rouge, avec drawio, si vous en trouvez
Réponse
Pour chacune des questions, une seule des quatre réponses est exacte.
1. Parmi les commandes suivantes, laquelle permet d’afficher les processus en cours d’exécution ?
2. Quelle abréviation désigne l’identifiant d’un processus dans un système d’exploitation de type UNIX ?
3. Comment s’appelle la gestion du partage du processeur entre différents processus ?
4. Quelle commande permet d’interrompre un processus dans un système d’exploitation de type UNIX ?
Un processeur choisit à chaque cycle d’exécution le processus qui doit être exécuté. Le tableau ci-dessous donne pour trois processus P1, P2, P3 :
Le numéro de priorité est d’autant plus petit que la priorité est grande. On suppose qu’à chaque instant, c’est le processus qui a le plus petit numéro de priorité qui est exécuté, ce qui peut provoquer la suspension d’un autre processus, lequel reprendra lorsqu’il sera le plus prioritaire.
Processus | Durée d’exécution | Instant d’arrivée | Numéro de priorité |
---|---|---|---|
P1 | 3 | 3 | 1 |
P2 | 3 | 2 | 2 |
P3 | 4 | 0 | 3 |
Reproduire le tableau ci-dessous sur la copie et indiquer dans chacune des cases le processus exécuté à chaque cycle.
Processus | P3 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
N° cycle | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
On suppose maintenant que les trois processus précédents s’exécutent et utilisent une ou plusieurs ressources parmi R1, R2 et R3.
Parmi les scénarios suivants, lequel provoque un interblocage ? Justifier.
Scénario 1 | Scénario 2 | Scénario 3 |
---|---|---|
P1 acquiert R1 | P1 acquiert R1 | P1 acquiert R1 |
P2 acquiert R2 | P2 acquiert R3 | P2 acquiert R2 |
P3 attend R1 | P3 acquiert R2 | P3 attend R2 |
P2 libère R2 | P1 attend R2 | P1 attend R2 |
P2 attend R1 | P2 libère R3 | P2 libère R2 |
P1 libère R1 | P3 attend R1 | P3 acquiert R2 |
Fond : Texte : Tables : Thème du langage:
FICHE REVISION
Auteurs Partie A : David Roche
Partie B : Gisèle Barreux
adapté en php par Pascal HASSENFORDER 24/12/2020
Mise à jour du 26/03/2024