1 : Notion de système d`information

publicité
Introduction aux systèmes d'exploitation
Généralités
Un système informatique est un système complexe dont la gestion directe par l’utilisateur est quasi
impossible (par exemple, l’utilisateur doit-il se préoccuper de la manière dont un fichier est enregistré sur
disque ?). Il y a donc nécessité d’intercaler une couche logicielle de "gestion" de la machine ce qui nous
amène au concept de machine virtuelle. Un système informatique peut alors être représenté comme une
superposition de couches :
On peut entrevoir deux finalités (a priori) pour un système d’exploitation :
●
●
transformer une machine physique en une machine confortable pour l'utilisateur
gérer les ressources de la machine
Les premiers ordinateurs ne possédaient pas de systèmes d'exploitation ; les utilisateurs de l'époque
devaient entrer manuellement et dans le système binaire leurs données et leurs programmes. La situation
est maintenant bien différente et l'utilisateur a, à sa disposition, une interface, généralement graphique,
qui lui permet une utilisation très confortable de l'ordinateur. Le système d'exploitation rend à l'utilisateur
une gamme de services : assistance dans la création de programmes, exécution de programmes, accès aux
dispositifs d'entrées/sorties, accès contrôlé au système informatique, accès contrôlé aux fichiers,
détection d'erreurs, comptabilité des temps d'utilisation de ressources, ...
En ce qui concerne la seconde fonctionnalité, considérons, sur une machine, plusieurs programmes qui
doivent utiliser des ressources : processeur(s), mémoire, horloges, disques, terminaux, imprimantes,... Il est
clair qu’un chef d’orchestre est nécessaire; c’est le système d’exploitation qui jouera ce rôle en tant que
gestionnaire des ressources (contrôle et ordonnancement). Par exemple si trois programmes veulent
imprimer sur la même imprimante, il ne faut pas que leurs sorties se mélangent; le système d’exploitation
effectuera les tâches suivantes : stockage des fichiers de sortie, attribution de priorités, prise en main
des sorties, destruction des fichiers tampons après impression.
Historique
●
1ère génération d’ordinateurs ( 1945 - 1955)
Les machines de cette époque préhistorique étaient constituées de tubes à vide et il n’y avait pas de
système d'exploitation. Les programmes étaient écrits en langage machine (houla !) car les langages de
programmation étaient encore inconnus et étaient mémorisés à l’aide de "clés". L’utilisation de cartes
perforées a considérablement amélioré le contact avec les machines. Les programmes étaient exécutés les
uns après les autres en deux temps : chargement + exécution :
●
2ème génération d’ordinateurs ( 1955 - 1965)
Les machines sont constituées de transistors et le mode de traitement est le traitement par lot (Batch
Processing). FORTRAN (inventé par John Backus) est le premier langage de programmation ; les
programmes sont écrits dans ce langage sur cartes perforées (une instruction par carte) ce qui constitue un
"job".
Pour réduire le temps d’attente, le Batch a utilisé une découverte de l’époque : les bandes magnétiques.
Entrées et sorties sont mises sur bandes ce qui réduit considérablement les temps d’attente et permet de
rentabiliser l’unité centrale.
Les premiers systèmes sont FMS ( Fortran Monitor System) et IBSYS ( sur IBM 7094).
●
3ème génération d’ordinateurs ( 1965 - 1980)
Les machines sont constituées de circuits intégrés et utilisent le concept de multiprogrammation. De plus
les machines évoluent dans le cadre de familles "compatibles" (exemple IBM 360 -> 370 -> 4300 -> 3080 ->
3090). Les faits nouveaux sont :
●
la présence en mémoire de plusieurs programmes ou morceaux de programmes : la
mémoire est découpée en partitions :
job 3
job 2
job 1
O.S.
●
l’utilisation d’ordinateurs secondaires (canaux) pour les entrées/sorties
Les différents "jobs" sont exécutés jusqu’à ce qu’une opération d’entrée/sortie survienne.
Dans ce cas, l’exécution du "job" courant est interrompue et c’est un autre "job" qui sera
exécuté.
Les caractéristiques de ces systèmes à multiprogrammation sont :
●
●
●
●
complexité grandissante du système; plus grande taille
gestion de la mémoire partagée
meilleure équilibrage de la charge des différentes ressources
meilleures performances (temps de réponse) pour les travaux courts.
Les systèmes à temps partagés (time sharing) sont des variantes modernes des systèmes à
multiprogrammation. Chaque programme se voit attribuer un quantum de temps D ; il gardera
le bénéfice du processeur pendant ce temps, mais ensuite il devra laisser la place à un autre
programme; il retrouvera le processeur plus tard pour une nouvelle exécution pendant le
temps D .
Tout se passe, sur ces systèmes, comme si un utilisateur (programme) a la machine pour lui
tout seul (mais fonctionnant plus lentement). De fait, l’utilisateur ne se rend pas compte qu’il
n’est pas seul à utiliser la machine ; dans les applications interactives cela se voit encore
moins. Le temps d’élaboration T1 d’une requête (y compris la réflexion de l’utilisateur) est
nettement plus long que le temps d’exécution T2 de la requête; on peut donc utiliser le temps
T1 pour servir d’autres usagers.
Les premiers systèmes utilisant le concept de time sharing ont été :
●
●
●
●
CTSS (MIT 1962 sur IBM 7094)
MULTICS : le projet MULTICS (MULTiplexed Information and Computing Service) a
été conduit par le MIT, Bell Labs et GE ; ce projet très lourd a produit des idées
neuves, mais des partenaires ont abandonné (comme GE).
UNIX (1970 Thompson et Ritchie) a repris des idées de MULTICS dans le cadre d’un
système moins ambitieux mais plus réaliste.
4ème génération d’ordinateurs ( 1980 - 1994)
C’est l’époque des ordinateurs personnels et des réseaux. La miniaturisation s’accentue (LSI, VLSI, ULSI) ;
la fabrication industrielle en grande série fait baisser les prix. On voit apparaître des stations de travail
(généralement non Intel, UNIX) et des micro-ordinateurs (généralement Intel, MS DOS).
Les réseaux suscitent des systèmes d’exploitation nouveaux :
●
●
systèmes d’exploitation de réseaux ( le réseau n’est pas transparent)
systèmes d’exploitation répartis ( le réseau est transparent)
Concepts de base
Processus
Le concept de processus est fondamental. Il peut être défini de plusieurs manières (pas toujours
équivalentes) ; on se contentera ici de la définition intuitive suivante : un processus est un programme en
cours d’exécution ce qui implique qu’un processus contient les ingrédients suivants :
●
●
●
●
●
●
code exécutable
données du programme
pile du programme
valeurs de registres du processeur (compteur ordinal, pointeur de pile, mot d’état)
valeurs d’autres registres si nécessaire
autres informations mémorisées si nécessaire
Si l’on considère le cas d’un système en temps partagé, il y aura plusieurs processus sur la même machine ;
ces processus seront répertoriés dans une table des processus (qui est un vecteur de structures).
Lorsqu'un processus n’est pas en exécution effective sur un processeur (généralement il y a moins de
processeurs que de processus), il est mémorisé : stockage des informations nécessaires à la reprise de
l’exécution effective: on parle alors de blocage ou de suspension (notions en fait différentes comme on
verra plus loin).
Un processus peut en créer un autre (ou plusieurs) ce qui implique une filiation de processus. Un processus
peut perdre son "père" (mort ou terminaison de celui-ci), il devient alors "orphelin" et généralement il est
"adopté" par un autre processus .
La création de processus est une opération spéciale qui nécessite de faire appel au système d’exploitation
car il faut mettre à jour un certain nombre de données de gestion du système. Le processus géniteur, pour
créer un nouveau processus, effectue un "appel système", c’est à dire invoque une "routine système" appelée
primitive. C’est d’une manière générale le cas pour d’autres opérations de création, de destruction,
d’utilisation, de fin d’utilisation d’objets : à chaque fois le processus concerné appelle une primitive.
Un processus appartient à un propriétaire (owner) identifié par un uid (user identifier) qui est un entier
codé usuellement sur 16 ou 32 bits. Les utilisateurs sont eux-mêmes regroupés en des groupes d’utilisateurs
; chaque groupe est identifié par un gid (group identifier).
Fichiers
Les fichiers sont usuellement organisés dans des structures arborescentes :
Avec cette méthode (simple au demeurant), un fichier possède un nom unique qui est le chemin qui permet
d’y accéder à partir de la racine. Ce nom est le " pathname ".
Exemples :
sous UNIX /B/X/F (la racine est \)
sous MSDOS c:\B\X\F (la racine est le disque dur C:)
Les fichiers sont protégés de diverses manières. Dans les systèmes actuels comme UNIX,
●
●
3 opérations sont prises en considération : lecture, écriture, exécution
3 catégories d’utilisateurs sont définies : propriétaire, groupe auquel appartient le propriétaire,
autres utilisateurs.
Ce qui permet de définir les droits avec 9 bits :
Un processus peut accéder à un fichier; si sa demande est accordée par le système d’exploitation, il reçoit
en retour un descripteur de fichier (handle).
Certains systèmes admettent l’existence de fichiers spéciaux :
●
●
les fichiers représentant les périphériques d’entrée/sortie (abstraction commode) ; ainsi sous UNIX
il existe 3 fichiers spéciaux standards :
❍ 0 : standard input (stdin), usuellement le clavier
❍ 1 : standard output (stdout), usuellement l’écran
❍ 2 : standard error (stderr), usuellement l’écran
les tuyaux ou tubes ou conduits ( pipes) qui sont des fichiers de communication entre deux
processus.
Appels système
Le système d’exploitation contient une bibliothèque de procédures ou " primitives ". Lorsque un processus
appelle une primitive (effectue un appel système), on passe du mode utilisateur au mode système (ou
superviseur).
Ainsi, si un processus désire effectuer une lecture dans un fichier, il appellera la primitive READ dont la
syntaxe pourrait être :
count = read(file, buffer, nbytes)
Trois paramètres sont passés au système : le nom du fichier (file), l’endroit où on mettra en mémoire le
résultat de la lecture (buffer) et le nombre d’octets à lire (nbytes). Le code de retour count donne le
nombre d’octets effectivement lus (et le code -1 en cas d’erreur).
Shell
Le shell est l’interface permettant d’utiliser directement le fonctionnalités du système d’exploitation en
offrant à l’utilisateur un langage de commande textuel ou graphique. Ainsi, sous UNIX, la suite de
commandes
cat file1 file2 file3 | sort > /dev/lp &
indique que l’utilisateur demande en arrière plan (&) de concaténer 3 fichiers file1, file2, file3, puis de trier
le résultat par ordre alphabétique des lignes (sort) et d’envoyer le résultat dans le fichier spécial /dev/lp
(imprimante). Les signe | indique l’utilisation d’un tube (pipe); en effet cat et sort sont deux procédures qui
donnent naissance à des processus : le processus cat génère des données qui sont transmises, via le tube, au
processus sort (cat remplit le tube, sort le vide).
Concepts avancés
Les systèmes d'exploitation modernes présentent de nouvelles caractéristiques : micro-noyau, threads,
multiprogrammation symétrique, systèmes répartis ou distribués, architecture orientée objet,...
Micro-noyau
Les fonctionnalités des systèmes d'exploitation ont considérablement augmenté, ce qui a conduit à des
systèmes d'exploitation de taille imposante. L'importance de cette taille a nécessité dans un premier temps
de placer en mémoire centrale un noyau indispensable et laisser en mémoire secondaire (sur disque) des
fonctionnalités plus secondaires. Cette tendance s'est accentuée dans l'idée du micro-noyau (microkernel) ;
le micro-noyau est constitué de fonctionnalités essentielles (adressage, communication entre processus) et
les autres fonctionnalités sont organisées en bibliothèques de procédures à laquelle s'adresse, en cas de
besoin, le micro-noyau ; ces procédures sont considérées comme des programmes ordinaires et peuvent
résider localement ou sur une autre machine reliée par réseau.
Threads
Il n'y a pas encore de mot français pour désigner les threads. Un processus peut être découpé en unités
exécutables indépendantes qui correspondent aux threads. Un thread s'exécute de manière séquentielle (il
est composé d'instructions machine), par contre plusieurs threads d'un même processus peuvent s'exécuter
simultanément. Pour faciliter l'exposé, on ne fera pas de distinction entre processus et threads lorsque
cela n'apportera rien de particulier ; par contre la différence sera mise en évidence si cela est nécessaire.
Multiprogrammation symétrique
Pour augmenter les performances, on a été conduit construire des machines avec plusieurs processeurs ;
ces machines sont dites multiprocesseur. Ce type de machine possède une architecture dans laquelle les
processeurs partagent la mémoire centrale et les possibilités d'entrée/sortie. Ils peuvent communiquer par
la mémoire centrale ou par un bus spécifique. La multiprogrammation symétrique consiste
●
●
à utiliser une machine multiprocesseur
à faire effectuer les mêmes fonctions par tous les processeurs (banalisation)
Par suite, le système d'exploitation répartit les processus ou les threads entre les processeurs disponibles.
Les avantages de ces techniques sont tout d'abord l'augmentation de la performance (c'est à dire de la
vitesse d'exécution), mais aussi la résistance aux pannes (un processeur en panne ne correspond pas à
l'arrêt du système), les possibilités d'évolution et d'ajustement (par ajout de processeurs
supplémentaires).
Systèmes répartis
A l'inverse du concept de multiprogrammation symétrique, on trouve celui de système réparti pour lequel un
ensemble de machines reliées par un réseau est considéré comme une "grosse" machine unique. Dans un
système réparti (on dit aussi distribué), les fonctionnalités du système d'exploitation peuvent être
réparties entre les diverses machines composant le système. De même, les ressources gérées par le
système d'exploitation sont aussi réparties entre les différentes machines. Etant donné l'importance des
réseaux à notre époque, les systèmes répartis représentent un champ d'intérêt important. On étudiera ces
systèmes plus loin.
Architecture orientée objet
Cette approche moderne vise à construire les systèmes d'exploitation comme un ensemble d'objets
possédant des propriétés et des méthodes. L'intérêt principal des objets, en dehors de la modularité, est
leur réutilisation ce qui permet la construction de systèmes d'exploitation évolutifs et adaptables.
Exemples de systèmes d'exploitation
Pour terminer de chapitre sur les généralités, il convient de présenter deux systèmes d'exploitation
courants : Windows NT et Unix. Nous en effectuerons une présentation sommaire, se réservant la
possibilité d'approfondir par la suite les différentes caractéristiques de ces systèmes d'exploitation.
■
Windows NT
Les premiers micro-ordinateurs PC, lancés par IBM en 1981, étaient équipés d'un processeur Intel 8086 et
d'un système d'exploitation développé par Microsoft : le MS-DOS (la taille du DOS 1.0 était de 8 Ko). Ces
PC ont évolués avec l'adjonction de processeurs de plus en plus performants 80286, puis 80386. Au-dessus
du DOS, Microsoft avait ajouté des fonctionnalités graphiques rassemblées sous le nom de Windows. Le
DOS 3.3 de l'époque occupait en mémoire centrale une place de 46 Ko.
Les nouveaux processeurs 80486 et Pentium n'étaient pas optimisés par l'emploi du MS-DOS, bien que
Windows ait évolué vers une version plus performante 3.X (1990). Il apparaissait, en conséquence
nécessaire, de développer un nouveau système d'exploitation ce qui conduisit à Windows 95 et Windows NT.
Ce dernier, beaucoup plus puissant que Windows 95, reprend toutes ses fonctionnalités auxquelles s'en
ajoutent d'autres, notamment une plus grande portabilité vis à vis des plate-formes. La version actuelle est
la version 4.0, mais la version 5.0 est déjà prête (1998).
Les caractéristiques principales de Windows NT sont les suivantes :
●
portabilité
Le système Windows NT est écrit dans un langage de haut niveau (C, C++) et
non pas dans le langage d'assemblage d'un processeur particulier, ce qui
permet son adaptation à divers processeurs.
●
multitâche
Windows NT , comme les produits correspondants des gros et moyens
systèmes (Unix, VMS, ...) permet l'exécution simultanée de plusieurs
applications. Comme l'interface est graphique, en général, une fenêtre est
associée à chaque application. Toutes les applications ouvertes sont actives à
un moment donné, l'une d'elle est l'application courante (sa fenêtre est en
premier plan), les autres s'exécutent en tâches de fond.
●
multithreading
Le concept de thread est utilisé dans Windows NT
●
indépendance du processeur
Windows 3.X et avant lui, MS-DOS étaient liés à l'architecture des
processeurs de la famille Intel 80x806 ; Windows NT a été portée sur
d'autres processeurs : PowerPC (Motorola), Alpha (DEC), MIPS Risc (IBM)
●
support multiprocesseur
Windows NT utilise une interface qui lui permet de s'adapter au cas d'un
processeur comme de plusieurs
●
support POSIX et sécurité
Plusieurs niveaux de sécurités sont proposés dans Windows NT ; par ailleurs,
Windows NT est compatible avec le standard POSIX ; ces deux
caractéristiques sont plus importantes aux USA qu'en France, car le
Département de la Défense a imposé un cahier des charges sur ces deux
aspects qui est pris comme modèle.
●
support réseau
Windows NT est disponible sous deux formes : Windows NT Workstation et
Windows NT Server ; cette dernière forme constitue un outil performant de
gestion de réseau local.
●
compatibilité MS-DOS et Windows 3.X
Les applications anciennes sous MS-DOS et Windows 3.X peuvent fonctionner
sous Windows NT.
L'architecture de Windows NT est décrite par le schéma ci-dessous :
Cette architecture montre tout d'abord une assez importante modularité : chaque fonction est un objet
particulier. le concept de micro-noyau est utilisé mais pas de façon complète puisque un certain nombre de
fonctionnalités (Object Manager, Process Manager, ...) s'exécutent en mode noyau (c'est à dire système).
La couche HAL permet de s'adapter à des environnements matériels différents. En mode utilisateur, on
peut constater que Windows NT s'adapte à de nombreux systèmes informatiques.
■
Unix
Rappelons brièvement l'histoire d'Unix :
1965 : Le projet MULTICS est lancé (MIT + General Electric) ; son objectif est la construction d'un
système d'exploitation interactif en prolongement du programme CTSS.
1968 : Bells Laboratories se joint au projet ; Ken Thompson y participe.
1969 : Bells Labs se retire du projet car trop d'années sont nécessaires à son aboutissement. Ken
Thompson essaie de recréer un "petit" Multics sur un PDP7, puis sur un PDP11 (DEC) : Unix. A cette
occasion, la langage B est inventé pour l'écriture du système à partir du langage BCPL (Basic Combined
Programming Language). Puis Dennis Ritchie invente le langage C à partir du langage B.
1973 : Unix est écrit en C et utilisé chez AT&T
1974 : Version 5 d'Unix avec permission d'utilisation dans les universités américaines. En particulier, des
développements importants ont lieu à l'Université de Berkeley ; ils sont l'origine de BSD (Berkeley
Software Distribution).
1979 : apparition de nouvelles versions dont certaines pour micro-ordinateurs.
A partir de cette date, les versions se succèdent comme indiqué sur la figure ci-dessous :
L'architecture d'Unix est conçue comme un modèle en couches, ou en coquilles successives : autour de la
machine matérielle se trouve la couche noyau, puis la couche shell et utilitaires, enfin la dernière couche est
composée d'outils divers :
Du point de vue des fonctionnalités qui sont en mode utilisateur ou en mode système, l'architecture d'Unix
est décrite sur le schéma ci-dessous :
On constate ici que le noyau est formé de modules assez conséquents répartis en deux grands blocs : le
système de gestion des fichiers et le système de contrôle des processus. On y reviendra lorsque ces
fonctionnalités seront étudiées.
Bibliographie
W. STALLINGS
Operating Systems
Prentice Hall
A.M. LISTER
Principes fondamentaux des
systèmes d'exploitation
Eyrolles
S.KRAKOWIAK
Principes des systèmes
d'exploitation des
ordinateurs
Dunod
S.BOURNE
Le système Unix
InterEditions
A.B.FONTAINE,
Ph.HAMMES
Unix, système et
environnement
Masson
A. S. TANENBAUM
Les systèmes d'exploitation
InterEditions
A.S.TANENBAUM
Modern Operating Systems
Prentice Hall
Y. NISHINUMA, R.
ESPESSER
Unix, premier contact
Eyrolles
M.G. SOBEL
A Practical guide to the Unix
System
Benjmin-Cummings
J.R. GROFF, P.N.
WEINBERG
Le système d'exploitation
Unix
Belin
S. HEATH
Windows NT
ButterworthHeinemann Book
. BIC, A.C. SHAW
The logical Design of
Operating Systems
Prentice Hall
MAEKAWA,
OLDENHOEFT,
OLDENHOEFT
Operating Systems, Advanced
Concepts
Benjamin-Cummings
H.M. DEITEL
An introduction to Operating
Systems
Addison Wesley
M. MILENKOVIC
Operating Systems, Concepts
and Design
Mc Graw Hill
J.R. PINKERT, L.L.
WEAR
Operating Systems, Concepts,
Policies and Mechanisms
Prentice Hall
Généralités sur les systèmes
d'exploitation
Exercices
Exercice 1
Dans un système multiprogrammé à un processeur, on admet que chaque job possède les mêmes
caractéristiques. Chaque job s'exécute sur N périodes de durée T chacune ; une période T se décompose en
entrée/sortie (50% de T) et utilisation effective du processeur (50% de T). On suppose que les jobs se
succèdent suivant la méthode du tourniquet (chacun à son tour obtient le processeur) et que les opérations
d'entrée/sortie et d'utilisation du processeur peuvent être simultanées (pour des jobs différents).Dans le
cas de 1, 2 et 4 jobs et dans les deux cas suivants :
●
●
T est composée séquentiellement d'une entrée/sortie (50%), puis de l'utilisation du processeur
(50%)
T est composée séquentiellement d'une entrée/sortie (25%), puis de l'utilisation du processeur
(50%), puis d'une entrée/sortie (25%)
calculer
1) le temps nécessaire à l'exécution d'un job
2) le nombre moyen de jobs exécutés par période T
3) le pourcentage de temps d'utilisation du processeur.
Exercice 2
Un ordinateur possède une mémoire principale, une mémoire cache, un disque. Le temps d'accès à un mot du
cache est A ns ; si le mot est dans la mémoire principale, il faut B ns pour le transférer dans le cache ; si le
mot est sur le disque, il faut C ns pour le retrouver et B ns pour le transférer sur le cache. La probabilité
de trouver le mot dans le cache est (n-1)/n et la probabilité de le trouver en mémoire principale est (m1)/m.
Déterminer le temps moyen d'accès de ce système.
Exercice 3
Sous Unix, un fichier dont le propriétaire possède l'uid 12 et le gid 1 a le mode de protection
rwxr-x--Un autre utilisateur dont le uid est 6 et le gid 1 tente d'exécuter ce fichier. Que se passe-t-il ?
Exercice 4
Faire un inventaire des différents systèmes d'exploitation actuellement utilisés.
Généralités sur les systèmes
d'exploitation
Solution des exercices
Solution de l'Exercice 1
Hypothèse 1 : T est composée séquentiellement d'une entrée/sortie (50%), puis de l'utilisation du
processeur (50%)
Hypothèse 2 : T est composée séquentiellement d'une entrée/sortie (25%), puis de l'utilisation du
processeur (50%), puis d'une entrée/sortie (25%).
Dans les schémas ci-dessous, le vert indique les entrées/sorties et le rose l'utilisation du processeur. te
indique le temps d'exécution, n le nombre moyen de jobs exécutés par période T et r le pourcentage de
temps d'utilisation du processeur.
●
Cas 1 : 1 job, hypothèse 1
te = NT ; n = (1/NT)x T = 1/N ; r = 50%
●
Cas 2 : 1 job, hypothèse 2
mêmes résultats que ci-dessus
●
Cas 3 : 2 jobs, hypothèse 1
te = NT ; n = 2/N ; r = 100%
●
Cas 4 : 2 jobs, hypothèse 2
mêmes résultats que ci-dessus
●
Cas 5 : 4 jobs, hypothèse 1
te = (2N-1)T ; n = 4/(2N+1/2) ; r = 100%
●
Cas 6 : 4 jobs, hypothèse 2
te = 3NT/2 ; n = 4/(9TN/2) ; r = 100 %
Solution de l'exercice 2
Ts = ((n-1)/n)A + ((m-1)/m)(B+A) + x(C+B)
x = 1 - (n-1)/n - (m-1)/m = 1/n +1/m -1
Ts = A + ((m-1)/m)B + (1/n + 1/m -1)C
Solution de l'Exercice 3
Le propriétaire peut lire, écrire, exécuter. Un membre du groupe peut lire et exécuter. Les autres ne
peuvent rien faire.
Solution de l'exercice 4
Une bonne adresse sur Internet :
http://dir.yahoo.com/Computers_and_Internet/Software/Operating_Systems/
Téléchargement